Menu

Liczby i wartości logiczne w Pythonie: int, float, bool i arytmetyka

Jak Python obsługuje liczby całkowite, liczby zmiennoprzecinkowe i wartości logiczne: arytmetyka, konwersja i przypadki brzegowe, na których ludzie się potykają.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Dwa rodzaje liczb, jeden rodzaj prawdy

Typy liczbowe, których używasz na co dzień, to int i float, a do tego bool dla wartości prawda/fałsz. Wystarczają do niemal całej arytmetyki i logiki, jakiej potrzebuje zwykły program w Pythonie.

Wartości logiczne w Pythonie są podtypem liczb całkowitych: True to dosłownie 1, a False to dosłownie 0. Otwiera to później kilka przydatnych sztuczek.

Arytmetyka na liczbach całkowitych

Liczby całkowite w Pythonie nigdy się nie przepełniają. Brzmi to mało ważnie, dopóki nie napiszesz pierwszej funkcji silni i nie zauważysz, że w większości innych języków wynik dawno po cichu przeskoczyłby na liczbę ujemną.

Oba wyrażenia dają dokładne wyniki, niezależnie od wielkości. Jedynym ograniczeniem jest pamięć.

Operatory arytmetyczne są takie, jakich się spodziewasz, plus kilka dodatkowych:

Trzy rzeczy z tej listy, które warto zapamiętać:

  • / w Pythonie 3 zawsze zwraca float, nawet gdy obie strony są liczbami całkowitymi. 10 / 2 daje 5.0, a nie 5. Jeśli chcesz liczbę całkowitą, użyj //.
  • // zaokrągla w stronę minus nieskończoności, więc -7 // 2 to -4, a nie -3. Nietypowe, ale konsekwentne.
  • % daje resztę z dzielenia i przydaje się do sprawdzania "czy ta liczba jest parzysta?" (n % 2 == 0) oraz do zawijania wartości w stałym zakresie.

Liczby float i ich słynna pułapka

Liczby float są z założenia niedoskonałe. Przechowuje się je binarnie, a w ten sposób nie da się dokładnie zapisać większości ułamków dziesiętnych. Podręcznikowy przykład:

Pierwsza linia wypisuje 0.30000000000000004. Druga wypisuje False. Każdy język zgodny ze standardem IEEE 754 (Python, JavaScript, Java, C) zachowuje się tak samo. To nie jest błąd Pythona.

W praktyce oznacza to dwie rzeczy:

  1. Nie porównuj liczb float przez ==. Jeśli potrzebujesz "wystarczająco blisko", użyj math.isclose(a, b) albo sprawdź, czy abs(a - b) < some_tolerance.
  2. Do pieniędzy używaj decimal.Decimal. Moduł decimal z biblioteki standardowej daje dokładną arytmetykę dziesiętną, bez niespodzianek w stylu 0.1 + 0.2. Jest wolniejszy od float, dlatego nie jest domyślny, ale przy kwotach to właściwy wybór.

Konwersja między typami liczbowymi

Python nie zamieni po cichu liczby całkowitej na napis ani napisu na liczbę. Musisz poprosić o to wprost:

Niepoprawne konwersje zgłaszają ValueError:

>>> int("hello")
ValueError: invalid literal for int() with base 10: 'hello'

Komunikat błędu jest bezpośredni i łatwo na niego zareagować. Oczyść dane wejściowe albo przechwyć wyjątek.

Wartości logiczne nieco dokładniej

True i False to dwie wartości logiczne, zapisywane dokładnie tak, z wielką literą na początku. Większość porównań daje jedną z nich:

Operatory logiczne to and, or i not, zapisywane jako angielskie słowa zamiast symboli:

Jeden niuans, który warto znać: and i or niekoniecznie zwracają True albo False. Zwracają wartość, która rozstrzygnęła wyrażenie. 0 or "fallback" zwraca "fallback"; 5 and 10 zwraca 10. Pozwala to pisać krótkie wartości domyślne, takie jak name = user_input or "anonymous", ale warto to rozumieć także na wypadek, gdy sprawdzenie logiczne zwróci ci nieoczekiwany typ.

Truthy i falsy

Gdy używasz wartości w kontekście logicznym, takim jak if czy while, Python traktuje wiele z nich jako "w zasadzie prawdziwe" albo "w zasadzie fałszywe". Wartości falsy to:

  • False
  • 0, 0.0
  • None
  • Puste kontenery: "", [], {}, set(), ()

Wszystko inne jest truthy. Dzięki temu warunki wyglądają naturalniej:

Czytaj if name: jako "jeśli name coś zawiera". Znacznie czyściej niż if name != "":. Uważaj tylko przy liczbach: if count: potraktuje 0 jako "pomiń", co zwykle, ale nie zawsze, jest tym, czego chcesz. Jeśli zero to poprawna wartość, użyj zamiast tego if count is not None:.

Arytmetyka na wartościach logicznych

Ponieważ wartości logiczne są liczbami całkowitymi, możesz wykonywać na nich działania:

Ta sztuczka pojawia się na tyle często, że warto ją zapamiętać. Jeśli chcesz policzyć, ile elementów listy spełnia jakiś warunek, zsumuj generator zwracający wartości logiczne:

Praktyczne wnioski

  • Liczby całkowite nigdy się nie przepełniają. Używaj ich śmiało.
  • / zwraca float; użyj //, gdy chcesz dzielenia całkowitego.
  • Nie porównuj liczb float przez ==; porównuj z tolerancją albo używaj Decimal do pieniędzy.
  • Truthiness sprawia, że warunki czytają się lepiej, o ile pamiętasz, że 0 i puste napisy są falsy.

Dalej: input i print, dwa narzędzia, które zamieniają twoje skrypty z milczących programów w rozmowy.

Najczęściej zadawane pytania

Czym różni się int od float w Pythonie?

int to liczba całkowita bez części dziesiętnej; float to liczba z przecinkiem dziesiętnym. Liczby całkowite w Pythonie mogą mieć dowolny rozmiar: nie ma przepełnienia. Liczby float działają według standardu IEEE 754, więc w arytmetyce dziesiętnej mogą tracić odrobinę precyzji.

Dlaczego 0.1 + 0.2 nie równa się 0.3 w Pythonie?

Bo binarne liczby zmiennoprzecinkowe nie potrafią dokładnie zapisać większości ułamków dziesiętnych. 0.1 + 0.2 daje 0.30000000000000004. To nie jest błąd Pythona: każdy język z liczbami IEEE 754 zachowuje się tak samo. Do dokładnej arytmetyki dziesiętnej użyj modułu decimal.

Czym są wartości truthy i falsy w Pythonie?

W kontekście logicznym Python traktuje wiele wartości jako prawdziwe albo fałszywe, nawet jeśli nie są dosłownie True ani False. Zero, puste napisy, puste listy, puste słowniki i None są falsy; większość pozostałych wartości jest truthy. if my_list: czyta się jako "jeśli lista coś zawiera".

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ