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 👇:

6

to typem danych będzie liczba całkowita 🔢. Natomiast, gdy dodamy do niej ułamek 👇:

6.5

to 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) 👇:

  1. int (liczba całkowita),
  2. set (zbiór),
  3. str (łańcuch znaków),
  4. bool (wartość logiczna),
  5. dict (słownik),
  6. list (lista),
  7. float (liczba zmiennoprzecinkowa),
  8. range (zakres),
  9. tuple (krotka),
  10. 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 = 5

Wię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 = True

Wartość 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.0

i 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 = None

Pró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] = 5

Modyfikacja 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] = 5

Po 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" ❌!

Typy danych w języku Python

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" 😉.

PODOBNE ARTYKUŁY