Przyjmujesz kwotę z formularza albo numer strony jako dane wejściowe i nagle Python zgłasza błąd przy dodawaniu jej do liczby? Zwykle potrzebujesz wtedy typu int, ale samo wywołanie int() może po cichu zmienić wartość, jeśli wejściem jest liczba z częścią ułamkową.

int przechowuje liczby całkowite, ale konwersja wymaga uwagi
intreprezentuje liczby całkowite, także ujemne i większe niż typowy zakres maszynowy.int(4.9)daje4, a nie zaokrąglone5.int("101", 2)odczytuje tekst jako liczbę zapisaną w systemie dwójkowym.booljest podtypemint, więcTruezachowuje się liczbowo jak1.int("3.5")kończy się błędem, bo tekst zawiera zapis dziesiętny z kropką.
int przechowuje liczby całkowite bez typowego limitu bitowego
W Pythonie int służy do reprezentowania liczb bez części ułamkowej, na przykład liczby rekordów, indeksu elementu albo identyfikatora używanego w obliczeniach. Typ przyjmuje wartości dodatnie, ujemne i zero. Nie ma stałej granicy wynikającej z 32- czy 64-bitowego formatu, choć bardzo duże liczby wymagają więcej pamięci i czasu na obliczenia.
To rozróżnienie łatwo przeoczyć, gdy porównujesz Pythona z językami, w których typ całkowity ma sztywny zakres. Dokumentacja typów wbudowanych Pythona opisuje całkowitą precyzję int. Prawdę mówiąc, dla codziennego kodu ważniejszy od limitu rozmiaru jest wybór właściwego sposobu konwersji.
int() obcina część ułamkową zamiast zaokrąglać
Masz 7.8 i potrzebujesz liczby całkowitej? int(7.8) zwraca 7, a int(-7.8) zwraca -7. Funkcja odrzuca część ułamkową w kierunku zera, więc dla liczb ujemnych wynik może zaskoczyć osoby spodziewające się zaokrąglenia w dół.
Jeśli potrzebujesz zaokrąglenia, wybierz round(); jeśli chcesz obciąć część ułamkową, użyj int(). To nie są zamienne operacje, a wybór wpływa na wynik rozliczenia, licznika czy podziału porcji danych. Uważam, że przy kwotach i pomiarach najpierw trzeba ustalić regułę zaokrąglania, a dopiero potem konwertować typ.
int(7.8) # 7
round(7.8) # 8
int(-7.8) # -7
Tekst liczbowy konwertuj dopiero po sprawdzeniu jego formatu
Wczytana wartość z input() jest tekstem, nawet jeśli na ekranie widzisz cyfry. Dlatego int("42") zadziała, ale int("4.2") zgłosi ValueError. Jeśli tekst ma postać ułamka dziesiętnego, najpierw można odczytać go jako float, a potem zdecydować, czy wynik obciąć, zaokrąglić czy odrzucić.
Funkcja przyjmuje też podstawę zapisu, na przykład int("101", 2) daje 5. W praktyce wygodnie rozpoznać sytuację po źródle wartości, zamiast łapać każdy błąd i zamieniać go na dowolną liczbę.
| Sytuacja | Przyczyna lub skutek | Co zrobić |
|---|---|---|
int("42") | Tekst zawiera poprawną liczbę całkowitą w systemie dziesiętnym. | Konwersja jest właściwa. |
int("4.2") | Kropka i część ułamkowa nie pasują do zapisu liczby całkowitej. | Użyj float() i wybierz regułę dalszej konwersji albo odrzuć wejście. |
int("101", 2) | Cyfry są zapisane w systemie dwójkowym. | Podaj podstawę 2. |
int("010", 0) | Podstawa 0 interpretuje zapis podobnie do literału Pythona; taki zapis z zerem z przodu jest niedozwolony. | Użyj zapisu "10" albo podaj konkretną podstawę, np. 10. |
Takie zachowanie opisuje dokumentacja funkcji int(). Dla danych od użytkownika obsłuż niepoprawny zapis jawnie, na przykład przez try i except ValueError, zamiast zakładać, że każda odpowiedź da się przekształcić.
try:
liczba = int(input("Podaj liczbę całkowitą: "))
except ValueError:
print("Wpisz liczbę całkowitą, np. 12.")
bool przechodzi test typu jako liczba całkowita
Jest tu mały haczyk: bool jest podtypem int. W efekcie isinstance(True, int) zwraca True, a w działaniach arytmetycznych True zachowuje się jak 1 i False jak 0.
Ma to praktyczne znaczenie, gdy funkcja ma przyjmować liczbę, ale nie wartość logiczną. Sam warunek isinstance(x, int) nie odróżni tych przypadków. Jeśli argument ma być wyłącznie liczbą całkowitą, wyklucz typ bool osobno.
if isinstance(x, int) and not isinstance(x, bool):
print("To liczba całkowita, nie bool")
Dobierz konwersję do danych, a nie do nazwy zmiennej
Wyobraź sobie, że formularz zwraca tekst "12.9", a program ma ustalić liczbę pełnych sztuk. Bezpośrednie int("12.9") nie zadziała, bo tekst nie jest zapisem liczby całkowitej. Po odczytaniu jako float wartość wyniesie 12.9, a konwersja przez int() da 12; jeśli biznesowa reguła wymaga zaokrąglenia, wynik będzie inny.
Prosta reguła pomaga uniknąć cichej zmiany danych: dla cyfr całkowitych w tekście użyj int(); dla ułamków najpierw ustal regułę, potem konwertuj. Gdy dane pochodzą z pliku lub formularza, sprawdź także puste wartości i nieoczekiwane znaki, bo poprawna konwersja zależy od rzeczywistego zapisu.
Najpierw sprawdź zapis, potem zamieniaj typ
Typ int jest prosty, dopóki wejściowa wartość rzeczywiście oznacza liczbę całkowitą. Kłopoty zwykle zaczynają się przy tekście z kropką, liczbach ujemnych, innej podstawie zapisu albo wartości logicznej podszywającej się pod liczbę.
Gdy znasz format danych i oczekiwany sposób zaokrąglania, wybór staje się jasny: int() konwertuje, ale nie zgaduje intencji. To właśnie tę decyzję dobrze podjąć przed zapisaniem wyniku w zmiennej.
