Typy danych w języku Python, oto temat artykułu 🔔! Dowiesz się jak rozumieć samo pojęcie "typ danych", a następnie przejdę do opisu każdego z nich 😊. Nie traćmy czasu i bierz się za przyswajanie wiedzy 📖!
PREZENTUJĘ PODSTAWOWE TYPY DANYCH W JĘZYKU PYTHON!
Zanim przejdę do wymieniania punkt po punkcie każdego z typów danych, zatrzymajmy się na moment celem uzmysłowienia sobie czym jest typ danych ✋.
CZYM JEST TYP DANYCH W PROGRAMOWANIU?
Typ danych to informacja przekazywana programowi jaki rodzaj i kontekst wartości ma reprezentować 💡. Posiada swoją nazwę i sposób jego definiowania w kodzie oraz narzuca pewną strukturę danej wartości 💪.
Gdy wpisujemy liczbę bez ułamka 👇:
6to typem danych będzie liczba całkowita 🔢. Natomiast, gdy dodamy do niej ułamek 👇:
6.5to kontekst zostaje zmieniony i wtedy Python będzie interpretować to jako liczbę zmiennoprzecinkową 🔥!
Teraz skoro mamy wyjaśnione jak rozumieć typ danych, zobaczmy sobie je wszystkie 🚀!
JAKIE WYSTĘPUJĄ TYPY DANYCH W JĘZYKU PYTHON?
Oto lista wszystkich podstawowych typów danych jakie znajdziesz w Pythonie (w nawiasie napisałem znaczenie) 👇:
- int (liczba całkowita),
- set (zbiór),
- str (łańcuch znaków),
- bool (wartość logiczna),
- dict (słownik),
- list (lista),
- float (liczba zmiennoprzecinkowa),
- range (zakres),
- tuple (krotka),
- NoneType (brak wartości, odpowiednik wartości "null" w innych językach).
Wśród mniej powszechnych znajdziesz również takie, jak 👇:
- bytes (niemodyfikowalna lista bajtów),
- complex (liczba urojona),
- bytearray (modyfikowalna lista bajtów),
- frozenset (niemodyfikowalny zbiór),
- memoryview (obiekt bezpośredniego dostępu do danych).
Teraz pokażę przykład każdego z nich, abyś miał(a) świadomość jak każdy z nich wygląda 👀.
INT (LICZBA CAŁKOWITA)
"int" to typ reprezentujący liczbę całkowitą (bez ułamka) 🔢. Przykład oczywisty, to wstawienie liczby bez ułamka 👇:
my_integer = 5Więcej nie trzeba dodawać 😉.
SET (ZBIÓR)
"set" oznacza daną typu "zbiór". Zbiór to struktura danych przechowująca wiele elementów, natomiast nie pozwala na umieszczanie duplikatów (powtarzających się elementów ℹ️) 😳. To jest przykład zbioru liczb 👇:
my_set = {1, 2, 3}Zbiór tworzymy posługując nawiasami klamrowymi ℹ️. Wewnątrz nich dodajemy elementy ⏏️. A tu przykład powtarzającego się elementu 👇:
my_set = {1, 2, 2}Wypisując taki zbiór przy użyciu funkcji "print" 👇:
print(my_set)ujrzysz 2 elementy, zamiast trzech 🙂! Drugą charakterystyczną cechą zbiorów, jest brak zapamiętywania kolejności elementów ❌.
Mała ciekawostka: gdy utworzysz sobie pusty zbiór 👇:
my_set = {}to w domyśle Python uzna, że to słownik (wyjaśniony w dalszej części) 😱! To dlatego, że typ takiej wartości zostanie uznany jako "dict" (przydzielony dla słownika), a nie "set" 🙂!
Więcej szczegółów na temat zbiorów znajdzie się w osobnym artykule ℹ️.
STR (ŁAŃCUCH ZNAKÓW)
"str" to skrót od "string", czyli łańcuch znaków ⛓! Pozwala na przechowywanie ciągu znaków pomiędzy cudzysłowami lub apostrofami, które wyznaczają początek i koniec łańcucha ℹ️. To jest przykład 👇:
my_string = 'Mój łańcuch znaków'Więcej informacji o samych łańcuchach znaków w dużo bardziej szerszym zakresie, znajduje się w załączonym wyżej artykule ℹ️.
BOOL (WARTOŚĆ LOGICZNA)
"bool" jest skrótem od "boolean", co w programowaniu oznacza wartość logiczną 🙂! To jest taki typ danych, który może przyjąć jedną z dwóch wartości: "True" (prawdę) lub "False" (fałsz) ℹ️. Oto przykład 👇:
my_bool = TrueWartość logiczna wcale nie musi się pojawić jawnie w kodzie, aby wciąż "występowała" w programie 😮! Dwie inne formy jakie może przyjąć, to wynik zwrócony przez funkcję 👇:
my_bool = '62'.isdigit()oraz wynik wyrażenia powstałego z operatorów relacyjnych 👇:
my_bool = 'a' > 'b'Najczęściej jednak występuje w miejscu instrukcji warunkowej, której "gniazdo" jest przeznaczone właśnie dla wartości logicznej 👇:
if my_bool:
print('Warunek spełniony')
else:
print('Warunek niespełniony')Zauważ, że nie musimy wcale tworzyć zmiennej o logicznym typie danych, aby wpływała na przebieg programu 😊. Wszędzie tam, gdzie znajdziesz powyższe przypadki, "czai się" wartość logiczna 😉!
Wtrącę ostatnie ważne zdanie, że Python wyjątkowo u siebie nakazuje pisanie słów "True" i "False" wielką literą, natomiast w całej reszcie języków jest zwyczaj pisać małą literą ⚠️!
DICT (SŁOWNIK)
"dict" będące skrótem od "dictionary" reprezentuje słownik, nazywany też tablicą asocjacyjną 🔥. To kolejny rodzaj struktury danych mający charakterystyczną budowę elementów w stylu "klucz-wartość" ℹ️. Klucze są unikatowe, a to oznacza, że podając klucz o tej samej wartości, w przypadku gdy słownik już ma u siebie taki klucz, to para zostanie nadpisana ⚠️!
Zamieszczam przykład użycia słownika 👇:
my_dict = {'P1': 4000, 'P2': 4500}Kluczami są łańcuchy znaków (choć mogą być dowolnego typu ❤️), a wartościami liczby całkowite (tutaj też jest pełna swoboda w typizacji ❤️).
Słownik zostanie szerzej opisany w odrębnym artykule ℹ️.
LIST (LISTA)
"list" to typ oznaczający listę 📜. A lista to jeszcze jeden rodzaj struktury danych, w której może znaleźć się wiele elementów, kolejność ich dodawania jest zapamiętywana i jest pełne przyzwolenie na powtarzające się elementy ℹ️.
To jest przykład listy 👇:
my_list = [1, 2, 3]Subtelną różnicą pomiędzy listą a zbiorem, są nawiasy 😲! Tam są klamrowe, tutaj kwadratowe 💥! Trzeba o tym pamiętać, bo Python właśnie po nawiasach rozpoznaje, o jaką strukturę danych Ci chodzi ⚠️.
Jak napisałem, tutaj można wstawiać duplikaty 👇:
my_list = [1, 2, 2]Wtedy wypisując taką listę 👇:
print(my_list)ujrzysz 3 elementy, z których oba są identyczne 😉!
FLOAT (LICZBA ZMIENNOPRZECINKOWA)
"float" jako skrót od "floating-point", to typ przeznaczony dla liczby zmiennoprzecinkowej (z ułamkiem) 🔢. Jedynym warunkiem jest to, aby liczba posiadała ułamek (może to być nawet zero) 👇:
my_float = 64.0i już zostanie uznana za liczbę zmiennoprzecinkową 😊!
RANGE (ZAKRES)
"range" oznacza typ dla zakresu liczb z przedziału "od do" ℹ️. Zakresy są bardzo pożyteczne podczas programowania pętli bowiem posiadają początek, koniec i liczbę elementów w sobie, czyli same najpotrzebniejsze informacje 🚀! Oto przykład 👇:
my_range = range(5)To wygeneruje zakres liczb z przedziału <0; 5), czyli 👇:
{0, 1, 2, 3, 4}
Więcej informacji o typie danych dla przedziału liczbowego, zostanie zawartych w osobnym artykule ℹ️.
TUPLE (KROTKA)
"tuple" oznacza typ dla tzw. "krotki" 💥. Krotką w Pythonie nazywamy niemodyfikowalny ciąg elementów o określonej kolejności ℹ️. To jest przykład 👇:
my_tuple = ('z', 'a')Zobacz, że tu jest kolejne rozróżnienie w znakach otaczających całą strukturę: nawiasy okrągłe 😮! Właśnie przy pomocy nawiasów okrągłych tworzymy krotkę.
O samych krotkach dowiesz się więcej w innym artykule ℹ️.
NONETYPE (BRAK WARTOŚCI)
"NoneType" jest typem przeznaczonym dla wartości "None", które oznaczają brak jakiejkolwiek wartości ⛔. W innych językach poznasz ją po słowie "null" ℹ️. To jest przykład 👇:
my_none_type = NonePrócz przypisywania wartości zmiennej na samym początku programu, nie ma żadnego innego zastosowania 🙂. Ważne, abyś nie utożsamiał(a) "None" z liczbą zero bądź wartością logiczną "False" ⚠️! To nie jest to samo!
Przedstawiłem Ci wszystkie typy danych w języku Python, które uważam za podstawowe i z których korzysta się najczęściej ☑️. A teraz te mniej powszechne 😉!
BYTES (NIEMODYFIKOWALNA LISTA BAJTÓW)
"bytes" oznacza typ danych dla obiektu bajtowego 🔥. Wprowadzając liczbę całkowitą albo łańcuch znaków, uzyskujemy listę pojedynczych bajtów 😲!
To jest przykład z liczbą całkowitą 👇:
my_bytes = bytes(5)Wypisując sobie taką listę bajtów z użyciem funkcji "print" 👇:
print(my_bytes)zobaczysz taki ciąg 👇:
b'\x00\x00\x00\x00\x00'Wprowadzenie liczby całkowitej skutkuje wypełnieniem listy bajtami "NULL", stąd same zera (\x00). A to przykład z łańcuchem znaków 👇:
my_bytes = bytes('Mój łancuch znaków', 'utf-8')W przypadku listy bajtów zaleca się, aby wtedy podać kodowanie znaków jako drugi parametr ℹ️. Gdy to sobie wypiszemy przy pomocy "print" 👇:
print(my_bytes)to ciąg bajtów będzie już zupełnie inny 👇:
b'M\xc3\xb3j \xc5\x82ancuch znak\xc3\xb3w'Zwracam uwagę, że to definiuje niemodyfikowalną listę, czyli wszelkie próby edycji pojedynczych bajtów zakończą się awarią programu (zgłoszenie wyjątku typu "TypeError") 💥! Jeżeli chcesz mieć możliwość modyfikowania, wtedy skorzystaj z "bytesarray", które działa tak samo, lecz zezwala na późniejsze modyfikowanie jak się chce 😉!
COMPLEX (LICZBA UROJONA)
"complex" określa nam typ liczby urojonej. Liczba urojona w matematyce oznacza wartość, która po podniesieniu do kwadratu zwraca wynik ujemny (co przeczy zbiorowi liczb rzeczywistych 🙃) ℹ️. W Pythonie piszemy je na 2 sposoby 👇:
- według algebry abstrakcyjnej, to znaczy operacji na argumentach, w której co najmniej jeden z nich jest przemnożony przez jednostkę urojoną "i",
- poprzez wprowadzenie dwóch parametrów oznaczających wartość rzeczywistą i wyimaginowaną.
Oto przykład sumy według pierwszego sposobu 👇:
my_complex = complex(1 + 1j)W Pythonie jednostka urojona posiada symbol "j" ⚠️. A niżej to samo, tylko według drugiego sposobu 👇:
my_complex = complex(1, 1)Oba zapisy są równoważne i możesz swobodnie korzystać z jednego lub drugiego według upodobań 👍.
Liczby urojone w Pythonie zostaną szerzej opisane w osobnym materiale ℹ️.
BYTEARRAY (MODYFIKOWALNA LISTA BAJTÓW)
"bytearray" oznacza typ dla modyfikowalnej listy bajtów. Działa identycznie jak "bytes", z tą różnicą, że tutaj możesz dowolnie modyfikować poszczególne bajty 🔥! Biorąc ten sam przykład, lecz z użyciem typu "bytearray" 👇:
my_bytearray = bytearray(5)tym razem nie ma zakazu modyfikowania poszczególnych bajtów z użyciem notacji indeksowej znanej z tablic w programowaniu 👇:
my_bytearray[0] = 5Modyfikacja zostanie przyjęta i wtedy podczas wypisywania zawartości funkcją "print" 👇:
print(my_bytearray)dostrzeżesz, że wartość pierwszego bajta została zmieniona ✅. W przypadku łańcucha znaków jest tak samo 👇:
my_bytearray = bytearray('Mój łancuch znaków', 'utf-8')i tym razem również wprowadzamy liczbę 👇:
my_bytearray[0] = 5Po tej operacji, ponownie możemy wywołać funkcję "print" 👇:
print(my_bytearray)aby stwierdzić, że pierwszy bajt uległ zmianie 🔥!
W przypadku modyfikowania łańcuchów znaków sprawa jest bardziej skomplikowana, gdyż chcąc "wymienić" znak na inny musimy skorzystać z funkcji "ord", aby zwróciła nam liczbę porządkową przypisaną do każdego znaku 😳. Natomiast mogą zostać przyjęte liczby tylko z zakresu od 0 do 255, a to oznacza, że znaki Unicode (uwzględniające znaki diakrytyczne, w tym nasze polskie 'ś', 'ć', 'ź' itd.) nie zostaną dopuszczone i próba ich przypisania zakończy się zgłoszeniem wyjątku typu "ValueError" ❌!
FROZENSET (NIEMODYFIKOWALNY ZBIÓR)
"frozenset" określa nam niemodyfikowalny zbiór tj. zbiór, którego elementy są chronione przed modyfikacją 🔒. Jego główną rolą jest stosowanie zbiorów jako kluczy słownika (gwarancja ochrony przed modyfikacją zapobiega ryzyku utraty danych 👍) 💡. Przykład 👇:
my_frozenset = frozenset([1, 2, 2])Zwróć uwagę, że tutaj wstawiłem listę 🫵! To nie musi być zbiór do zbioru 😊! "frozenset" akceptuje listy, zbiory i krotki, także to też warto wiedzieć 😉! W tej sytuacji, najpierw lista zostanie skonwertowana na zbiór, powtarzający się element "2" zostanie usunięty i w efekcie uzyskamy niemodyfikowalny zbiór z dwoma elementami ❤️!
Wszelkie próby dodawania lub usuwania z niego elementów 👇:
my_frozenset.add(4)
my_frozenset.remove(1)zakończą się awarią programu w postaci zgłoszenia wyjątku typu "AttributeError" (brak istnienia metod do dodawania/usuwania elementów) ❌.
O typie "frozenset", więcej informacji znajdzie się w osobnym artykule ℹ️.
MEMORYVIEW (OBIEKT BEZPOŚREDNIEGO DOSTĘPU DO DANYCH)
"memoryview" to typ określający nam obiekt mający dostęp do pamięci innego wskazanego obiektu 🧠. Można powiedzieć, że funkcjonuje jak wskaźnik w języku C, do którego przypisujemy referencję do innego obiektu w pamięci 🔥. Operacje na bajtach sprzyjają efektywności wykonywanych operacji i to jest główne zastosowanie tego typu ✅.
Oto przykład użycia 👇:
my_memoryview = memoryview(bytearray('Mój łancuch znaków', 'utf-8'))Tworzymy sobie modyfikowalną listę bajtów dla łańcucha znaków, która od razu jest osadzana wewnątrz obiektu z bezpośrednim dostępem do tej listy 😅. W takim wypadku nie ma sensu wypisywanie zawartości obiektu (przy użyciu funkcji "print") 👇:
print(my_memoryview)bo Twoim oczom ukaże się tylko ogólny opis bloku pamięci o takim kształcie 👇:
i tylko wskazanie konkretnej komórki przy użyciu notacji indeksowej (występującej w tablicy), da nam bardziej konkretną informację 👇:
print(my_memoryview[0])w ten sposób dowiemy się jaka liczba kryje się za wskazaną komórką pamięci (pamiętaj, że wciąż rozmawiamy o bajtach 😉) 💡.
Modyfikacja wygląda tak samo, jak przy "bytearray", o ile "memoryview" wskazuje na wartość typu "bytearray" ⚠️. Po prostu odwołujemy się do danej komórki jak wyżej i wprowadzamy wartość z zakresu od 0 do 255 (wyjście poza ten zakres skutkuje zgłoszeniem wyjątku "ValueError" i przerwaniem działania programu 💥!) 👇:
temp[0] = ord('a')"memoryview" akceptuje jedynie typy związane z bajtami, czyli "bytes" i "bytearray" ℹ️. Jeżeli przypiszesz typ "bytes", to potem wszelkie próby modyfikacji zakończą się awarią programu i zgłoszeniem wyjątku "TypeError" ❌!
![]() |
Język Python składa się z 15 różnych typów danych.
Ostatnia kwestia z tematu typów danych 😅!
JAK USTALIĆ TYP DANEJ W JĘZYKU PYTHON?
Jeżeli dysponujesz jakąś daną i nie masz pewności jaki typ reprezentuje, skorzystaj z funkcji "type", która za parametr przyjmuje wartość dowolnego typu 👇:
print(type(99))"type" zwróci Ci nazwę zidentyfikowanego typu ✅. W powyższym przykładzie to będzie "int", czyli liczba całkowita 😊.
Wszystko na ten temat 😊. Teraz już wiesz jakie występują typy danych w języku Python oraz jak się dowiedzieć jaki typ danych reprezentuje dany "cosik" 😉.
