Lista wyjaśnień
Typy danych i ich zastosowanie
Podtematy
Podstawowe typy danych
Podstawowe typy danych w Pythonie
| Typ | Opis | Przykłady wartości |
|---|---|---|
int |
liczby całkowite | 1, 42, -5, 200 |
float |
liczby rzeczywiste (dokładniej: liczby zmiennoprzecinkowe; Python używa kropki dziesiętnej, a nie przecinka) | 2.5, 3.25, -12.37832 |
bool |
wartości logiczne | True, False |
str |
łańcuchy znaków | "krowa", "pies" |
list |
listy, czyli uporządkowane zbiory wartości | [1, 3, 8, 2], ["koza", "owca", "kangur"] |
dict |
słowniki, czyli nieuporządkowane pary klucz–wartość (słownik mapuje klucze na wartości) | {"a": 5, "b": 10} |
Python oferuje także inne typy, np. complex (liczby zespolone), tuple (krotki, czyli niemutowalne sekwencje), set (zbiory).
Mutowalność i niemutowalność
Typy danych rozróżniamy ze względu na to, czy ich wartości można zmieniać:
- typy mutowalne (mutable) to
list, set, dict, - typy niemutowalne (immutable) to
int, float, bool, str, tuple.
To rozróżnienie jest ważne na przykład przy użyciu słowników – słowniki można indeksować tylko typami niemutowalnymi.
Rzutowanie typów
Nazwy typów są jednocześnie nazwami wbudowanych funkcji, które wykonują rzutowanie (konwersję typu). Typy zmiennych są bardzo ważne – wpływają na znaczenie operatorów. Typowym przykładem jest rzutowanie liczby na łańcuch znaków:
x = 15
print(x) # wypisze 15
print(3*x) # wypisze 45
x = str(x) # rzutowanie na łańcuch, x teraz zawiera "15"
print(x) # wypisze 15 (tu różnica typu nie jest widoczna)
print(3*x) # wypisze 151515 (x jest teraz łańcuchem znaków, a operator * dla łańcuchów # oznacza powielanie)Łańcuchy w Pythonie
Zapis łańcuchów znaków
Łańcuchy znaków zapisujemy w cudzysłowach lub apostrofach. W Pythonie 3 łańcuchy mogą zawierać również znaki diakrytyczne.
a = "To jest łańcuch znaków"
b = 'To też jest łańcuch znaków'
print(a, b)Indeksowanie
Do poszczególnych znaków łańcucha odwołujemy się za pomocą indeksowania w nawiasach kwadratowych. Uwaga: indeksowanie zaczyna się od zera. Python (w przeciwieństwie do większości innych języków programowania) pozwala także na indeksowanie od końca za pomocą liczb ujemnych.
text = "krowa"
text[0] # pierwsza litera => 'k'
text[1] # druga litera => 'r'
text[4] # piąta, ostatnia litera => 'a'
text[-1] # ostatnia litera => 'a'
text[-2] # przedostatnia litera => 'w'Za pomocą dwukropka możemy wycinać podłańcuch.
text = "informatyk"
print(text[2:6]) # od pozycji 2 do 5 => form
print(text[:3]) # pierwsze 3 znaki => inf
print(text[-4:]) # ostatnie 4 znaki => atykBardziej zaawansowanym elementem jest użycie dwóch dwukropków, gdzie trzecia wartość oznacza krok:
text = "Mamy-kotka-i-pieska"
print(text[5:15:2]) # od pozycji 5 do 14, co 2 => ktaip
print(text[::3]) # od początku do końca, co 3 => Myoa-ea
print(text[::-1]) # odwrócony tekst => akseip-i-aktok-ymaMIteracja po łańcuchu znaków
Poszczególne znaki łańcucha możemy łatwo przeglądać za pomocą pętli for.
text = "kotwica"
for letter in text:
print("litera:", letter)Niezmienność łańcuchów znaków
Łańcuchy znaków w Pythonie są niemutowalnym (immutable) typem danych. Jest to jedna z cech, która odróżnia je od list. Oznacza to, że nie możemy zmienić pojedynczego znaku w istniejącym łańcuchu. Musimy utworzyć nowy łańcuch, w którym dana litera zostanie zmieniona.
text = "korek"
text[2] = "t" # TypeError - łańcuch znaków nie pozwala na zmianę pojedynczego znaku
text = text[:2]+"n"+text[3:] # tworzymy nowy łańcuch
print(text)Operacje na łańcuchach znaków
Łańcuchy znaków można dodawać (łączyć). Możemy je także mnożyć przez liczbę całkowitą (powielać). Do innych przydatnych operacji należy sprawdzanie długości (‘len’) oraz testowanie obecności podłańcucha (‘in’).
text = "Biały"
text + "stok" # => Białystok
3*text # => BiałyBiałyBiały
len(text) # => 5
"a" in text # => TrueŁańcuchy znaków są obiektami i mają wiele przydatnych metod wywoływanych w notacji kropkowej. Np. zamiana na wielkie lub małe litery (upper, lower), dzielenie łańcucha według podanego znaku (split) oraz zastępowanie podłańcucha (replace):
text = "Lublin"
text.upper() # => LUBLIN
text.lower() # => lublin
text.split("l") # => ['Lub', 'in']
text.replace("Lu", "Du") # => DublinZauważ, że używamy notacji kropkowej text.upper(), a nie funkcji upper(text), ponieważ łańcuchy znaków są obiektami.
Operacje na znakach
Podczas pracy z łańcuchami znaków czasami przydają się również operacje na pojedynczych znakach, a w szczególności funkcje ord i chr, które zamieniają znaki na liczby całkowite i odwrotnie:
ord(c)zwraca kod znakuc,chr(i)zwraca znak kodziei.
Pod pojęciem „kod” rozumie się numer w kodowaniu Unicode. W podstawowych zastosowaniach litery w tym kodowaniu są ułożone alfabetycznie jedna po drugiej (dotyczy to głównie alfabetu angielskiego). W ten sposób możemy wypisać litery alfabetu angielskiego:python start = ord('A') for i in range(26): print(chr(start + i))
Listy w Pythonie
Lista (list) to uporządkowana kolekcja wartości dowolnego typu.
Tworzenie listy
Listy zapisujemy w nawiasach kwadratowych:
s = [] # pusta lista
s = [8, 3, 45] # lista trzech liczbListę można też utworzyć za pomocą słowa kluczowego list.
s = list("krowa") # powstaje lista ['k', 'r', 'o', 'w', 'a']Indeksowanie
Do elementów listy odwołujemy się za pomocą indeksów w nawiasach kwadratowych. Ważne: indeksujemy od zera. Możemy też używać indeksów ujemnych, aby liczyć od końca:
s = ["pies", "krowa", "owca", "koza"]
s[0] # pierwszy element listy => "pies"
s[1] # drugi element listy => "krowa"
s[-1] # ostatni element listy => "koza"
s[-2] # przedostatni element listy => "owca"Za pomocą dwukropka możemy wycinać fragmenty listy:
numbers = [37, 99, 42, 7, 13, 1, 1000]
print(numbers[2:5]) # => [42, 7, 13]
print(numbers[:3]) # => [37, 99, 42]
print(numbers[-2:]) # => [1, 1000]Operacje na listach
Przydatne funkcje:
s = [8, 3, 45]
a = len(s) # długość listy
s.append(7) # dodanie elementu do listy
s.sort() # sortowanie elementów listy
t = sorted(s) # tworzy nową, posortowaną listę
# s nie zmienia sięZwróć uwagę, że używamy tutaj tzw. notacji kropkowej: zapisujemy s.sort(), a nie zwykłe wywołanie funkcji w postaci sort(s). Wynika to z tego, że listy w Pythonie są traktowane jako obiekty.
Listy i pętla for
Za pomocą pętli for możemy przechodzić po elementach listy:
s = [8, 3, 45]
for x in s:
print(x)Możemy też przechodzić po liście za pomocą indeksów (ten sposób zapisu jest bardziej podobny do tego, który stosuje się w innych językach programowania):
for i in range(len(s)):
print(s[i])Słowniki w Pythonie
Słownik (dictionary, dict) pozwala przechowywać dane w postaci par: klucz – wartość. Każdemu kluczowi przypisana jest konkretna wartość. Dzięki temu możemy w prosty sposób zapisać np. informację o liczbie owoców w magazynie.
Tworzenie słownika
Słownik tworzymy przy użyciu nawiasów klamrowych.
fruits = {"apple": 5,
"banana": 10,
"orange": 2}
empty_dictionary = {} # pusty słownikDostęp do elementów
Aby odczytać wartość przypisaną do danego klucza, używamy nawiasów kwadratowych. W ten sam sposób możemy dodać nowy element do słownika.
print(fruits["apple"])
fruits["pear"] = 3Jeśli spróbujemy odwołać się do klucza, którego nie ma w słowniku, Python zgłosi błąd. Aby tego uniknąć, warto skorzystać z get:
print(fruits["plum"]) # => KeyError: 'plum'
print(fruits.get("plum", 0)) # jeśli elementu nie ma w słowniku,
# zwróci podaną wartość (0)Przydatne operacje na słownikach
Python udostępnia kilka funkcji, które ułatwiają pracę ze słownikami:
len(fruits) # liczba kluczy w słowniku
fruits.keys() # wszystkie klucze, czyli 'pear', 'orange', 'banana', 'apple'
fruits.values() # wszystkie wartości, czyli 10, 2, 3, 5
"apple" in fruits # sprawdzenie, czy klucz istnieje w słownikuObiekty w Pythonie
Python, podobnie jak większość innych nowoczesnych języków programowania, obsługuje programowanie obiektowe. Jest to już dość zaawansowany temat programistyczny, dlatego w tym miejscu podsumujemy tylko niektóre podstawowe pojęcia.
Obiekt (object) to kolekcja danych (zmiennych) oraz metod (funkcji), które operują na tych danych. W Pythonie prawie wszystkie dane, z którymi się spotykamy, są obiektami (liczby, ciągi znaków, listy, …).
Obiekty są konkretnymi instancjami klas (class). Klasę można rozumieć jako ogólny wzorzec, na podstawie którego tworzone są obiekty.
Przykład definicji klasy:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print("My name is ", self.name)
print("I am ", self.age, "years old")A tak tworzymy obiekty (instancje klasy) i z nich korzystamy:
homer = Person("Homer Simpson", 39)
bart = Person("Bart Simpson", 10)
homer.introduce()
bart.introduce()W tym przykładzie:
Personto klasa,homeribartto obiekty,nameiageto atrybuty danych,introduce()to metoda,__init__to metoda inicjalizująca, która jest automatycznie wywoływana podczas tworzenia obiektu.