Dlaczego typy w ogóle mają znaczenie
Typ to po prostu kategoria, która mówi Pythonowi, jak ma się zachowywać wartość. Dodanie dwóch liczb całkowitych to arytmetyka, dodanie dwóch napisów to ich połączenie, a dodanie napisu do liczby całkowitej to błąd. Typ wartości decyduje, jakie operacje mają na niej sens.
Python ma mały, przyjazny zestaw wbudowanych typów. Czterech z nich (int, float, str, bool) użyjesz niemal w każdym programie. Reszta pojawia się, gdy zaczynasz układać dane w kolekcje.
Liczby: int i float
Są dwa rodzaje liczb, a Python wybiera, który dostajesz, na podstawie tego, jak je zapiszesz:
Bez kropki dziesiętnej? Dostajesz int. Z kropką? Dostajesz float. Arytmetyka swobodnie je miesza, a każda operacja z udziałem float daje float:
Liczby całkowite w Pythonie mogą być tak duże, jak pozwala pamięć: bez przepełnienia i bez sztywnego limitu 32 czy 64 bitów. Możesz obliczyć 2 ** 1000, a Python zwróci każdą cyfrę.
Liczby float działają według zwykłych reguł IEEE 754, co oznacza kilka klasycznych niespodzianek:
To wypisuje 0.30000000000000004, a nie 0.3. To nie błąd Pythona, tylko sposób działania binarnej arytmetyki zmiennoprzecinkowej w każdym języku. Gdy potrzebujesz dokładnych ułamków dziesiętnych (na przykład przy pieniądzach), użyj modułu decimal. W pozostałych przypadkach zwykle wystarczy zaokrąglenie przy wyświetlaniu.
Napisy: str
Napisy to ciągi znaków. Otocz je pojedynczymi albo podwójnymi cudzysłowami. Pythonowi jest wszystko jedno, byle cudzysłów otwierający i zamykający były takie same:
Napisy w potrójnych cudzysłowach (""" ... """) mogą zajmować wiele linii:
Napisy mają ogromne API, które poznasz z czasem: wycinanie, metody takie jak .upper(), .split(), .replace() i formatowanie f-stringami, które daje f"Hello, {name}". Zaraz dalej jest osobna strona o napisach.
Wartości logiczne: bool
Dwie wartości, zapisywane dokładnie tak: True i False, z wielką literą na początku. Porównania dają wartości logiczne:
Pod spodem True i False to dosłownie 1 i 0, więc możesz sumować wartości logiczne, gdy trzeba policzyć, ile warunków było prawdziwych:
None: brak wartości
None to sposób, w jaki Python mówi "brak wartości". Funkcje, które niczego jawnie nie zwracają, zwracają None. Użyjesz go też jako wartości zastępczej:
Konwencja to sprawdzanie przez is None i is not None, a nie == None. is sprawdza tożsamość, a właśnie o to tu chodzi.
Listy, krotki, zbiory, słowniki
To cztery wbudowane typy kolekcji. Każdy ma własną, szczegółową stronę, ale oto krótki szkic, żeby je rozpoznawać:
Praktyczne zasady:
- List: sekwencja, która ma się zmieniać. Dodawanie, usuwanie, sortowanie: wszystko w porządku.
- Tuple: sekwencja, którą chcesz chronić przed zmianami. Często używana do rekordów o stałym kształcie, jak współrzędne
(x, y). - Set: worek unikalnych elementów, gdy duplikaty byłyby błędem.
- Dict: wyszukiwanie po kluczu. Struktura w kształcie JSON.
Konwersja między typami
Python nie konwertuje typów automatycznie, gdy byłoby to ryzykowne. Zamianę liczby całkowitej na napis albo napisu na liczbę trzeba zlecić jawnie:
Jeśli konwersja nie ma sensu, na przykład int("hello"), Python zgłasza ValueError i pokazuje, co mu podano. Błąd jest wyjaśniony, więc poprawiasz i idziesz dalej.
Sprawdzanie typu
Dwa narzędzia, które warto znać:
type() świetnie nadaje się do szybkiego podglądu w REPL. isinstance() stosuje się w prawdziwym kodzie, bo dobrze współpracuje z dziedziczeniem i potrafi sprawdzić kilka typów naraz.
Krótkie ćwiczenie przeglądowe
Uruchom poniższy blok bez zmian, a potem zmień kilka wartości i zobacz, jakie wychodzą typy:
Nie musisz jeszcze rozumieć for (dojdziemy do tego), ale to pokazuje wbudowane typy w jednym rzucie oka.
Wybierz typ pasujący do danych
Nie musisz teraz zapamiętywać każdego typu. Musisz umieć rozpoznać typ, gdy go widzisz, i wybrać właściwy, gdy tworzysz dane. "Czy to jest stałe, czy się zmienia? Unikalne czy nie? Szukam po kluczu czy po pozycji?" Te cztery pytania w dziewięćdziesięciu procentach przypadków wybierają typ kolekcji.
Dalej: napisy w szczegółach, bo to typ danych, z którym zetkniesz się niemal w każdym programie.
Najczęściej zadawane pytania
Jakie są główne typy danych w Pythonie?
Liczby (int i float), napisy (str), wartości logiczne (bool), None oraz cztery typy kolekcji: list, tuple, set i dict. Wszystko inne, co widzisz w kodzie Pythona, jest zbudowane z nich i garstki pozostałych (bytes, complex, frozenset).
Jak sprawdzić typ wartości w Pythonie?
Przekaż ją do type(): type(42) zwraca <class 'int'>, a type('hi') zwraca <class 'str'>. Do sprawdzenia typu prawda/fałsz użyj isinstance(value, int), które jest bardziej elastyczne, bo obsługuje też podklasy.
Czy Python ma typowanie statyczne czy dynamiczne?
Dynamiczne. Zmienna może wskazywać wartość dowolnego typu, a ta sama zmienna może zmieniać typ w trakcie swojego życia. To inaczej niż w językach takich jak Java czy C++, gdzie typ zmiennej deklaruje się raz i nie może się on zmienić.