Python - Zajęcia 4
1) Zmienna - gdy zawartość jest modyfikowalna lub niemodyfikowalna

Obiekt modyfikowalny - oznacza, że zmienna („etykieta”) nie przeskoczy na nową zawartość. Istniejąca zawartość po prostu zostanie zmodyfikowana
Obiekt niemodyfikowalny - oznacza, że zmienna („etykieta”) PRZESKOCZY na nową zawartość. Stara nie zostanie zmodyfikowana. Jeśli na starej zawartości nie będzie żadnej etykiety to Python ją automatycznie usunie.
2) Grupowa zmiana zmiennej:
Ctrl+H - w VS Code znajdz i zamień (na przykład nazwę zmiennej)
ALbo -> Edytuj -> Zamień
3) Struktury danych
W Pythonie struktury danych to sposoby organizacji i przechowywania danych, które pozwalają na efektywne wykonywanie operacji na nich. Python oferuje kilka wbudowanych struktur danych, które są bardzo wszechstronne i przydatne w różnych sytuacjach. Oto najważniejsze struktury danych w Pythonie:
- Listy (Lists)
- Krotki (Tuples)
- Słowniki (Dictionaries)
- Zbiory (Sets)
- Tablice (Arrays)
Można to porównać do pojemników. Mamy pewne oczekiwania co z danym pojemnikiem da się zrobić i co możemy w nim znaleźć. Podobnie jest z wyborem struktur wykorzystywanych do przechowywania danych w Pythonie. Wybierając jedną z nich spowodujecie, że potencjalny odbiorca będzie wnioskował co do celu danej zmiennej i będzie oczekiwał pewnych metod służących do jej obsługi.
Dobór struktur danych jest ważny przy budowaniu aplikacji, które mają się rozwijać się i rosnąć.
4) Listy (Lists)
Lista to uporządkowana kolekcja elementów, które mogą mieć różne typy danych. Zapisujemy ją w nawiasie kwadratowym []
. Jest modyfikowalna czyli można do niej dodawać / odejmować nowe elementy (mutowalna).
Można uzyskać dostęp do elementów za pomocą indeksów.

Raczej unika się sięgania po elementy umieszczone gdzieś w środku list.
moje_ksiazki = ["Blade Runner", "Hobbit", "Unicorn Project"]
lista = [1, 2, 3, "tekst", [4, 5]]
Jeśli teraz chcemy wyświetlić element "Unicorn Project" z naszej listy należny wskazać jej indeks w []
. Pozycja ta ma indeks 2 (liczymy od 0, 1, 2). Ponieważ, element, który chcemy wyświetlić jest na końcu możemy użyć tez indeksu -1 ,który wyświetli ostatni element na liście.

print(moje_ksiazki[2])
print(moje_ksiazki[-1])
A co jeżeli lista jest mieszana tzn. jednym z jej elementów jest inna lista lub krotka? Należy wskazać najpierw miejsce gdzie znajduje się element - lista a potem który element z zagnieżdżonej listy chcemy wyświetlić.
lista_mieszana = [1, 2.38, "chomik", True, ("desery", "zupy")]
print(lista_mieszana[4][-1])
Wynik:
zupy
UWAGA! w ten sam sposób można wyświetlić konkretną literę w stringu. Python nadaje indeksy też literom w stringu. Należy podać pozycje wybranej litery w stringu.
tekst = "Lorem ipsum"
print(tekst[4])
5) Krotki (Tuples)
Krotka to uporządkowana, niemutowalna (nie można zmieniać ich zawartości po utworzeniu) kolekcja elementów, np. kategorie w menu restauracji. Zapisujemy ją w nawiasie kwadratowym poprzez użycie nawiasów okrągłych ()
.
Ich długość jest stała, więc częściej sięgamy po elementy znajdujące się gdzieś głęboko w nich. Są indeksowane tak jak lista.

kategorie_menu = ("przystawki", "zupy", "dania główne", "desery")
krotka = (1, 2, 3, "tekst")
6) Cięcie list i krotek
Możliwe jest wyświetlenie zakresu elementów listy / krotki. W tym celu musimy wpisać w nawiasie kwadratowym []
element startowy i element końcowy oddzielone dwukropkiem.
moja_zmienna[start:koniec]
Start pokazuje od której pozycji zacząć wyświetlać, a koniec PRZED którą skończyć.
Przykłady:
lista_przyklad = ["coś1", "coś2", "coś3", "coś4"]
print(lista_przyklad[1:3])
Wynik:
['coś2', 'coś3']
krotka_przyklad = ("coś1", "coś2", "coś3", "coś4")
print(krotka_przyklad[1:3])
Wynik:
('coś2', 'coś3')
A jak wyświetlić wszystkie elementy zaczynając od wybranego? Wyświetli element na pozycjach od pierwszej do końca czyli 'red', 'white', 'green':
moje_kolory = ("black", "red", "white", "green")
print(moje_kolory[1:]
Wyświetlanie elementów na dwóch pozycjach od końca czyli 'white', 'green':
moje_kolory = ("black", "red", "white", "green")
print(moje_kolory[-2:]
Wyświetlanie elementów od początku do wybranego elementu:
mojalista = ("a", "b", "c", "d", "e")
print(mojalista[:2]
7) Dodawanie list
a) dodawanie stringa lub listy
mojalista = ["a", "b", "c", "d", "e"]
mojalista += ["white"]
print(f"Ta lista ma {len(mojalista)} elementów.")
Wynik:
Ta lista ma 6 elementów.
mojalista = ["a", "b", "c", "d", "e"]
mojalista += "black"
print(mojalista)
Wynik:
['a', 'b', 'c', 'd', 'e', 'b', 'l', 'a', 'c', 'k']
Tutaj black
jest ciągiem znaków (string), a nie listą. Python doda każdy znak osobno do mojalista
. To dlatego, że +=
zadziała tu tak, jakby do listy dodawał kolejne elementy z napisu. print(mojalista)
wyświetli listę po dodaniu liter z ciągu ['a', 'b', 'c', 'd', 'e', 'b', 'l', 'a', 'c', 'k']
.
mojalista1 = [1, 2, 3]
mojalista2 = [7, 9]
mojalista3 = mojalista1 + mojalista2
print(mojalista3)
Wynik:
[1, 2, 3, 7, 9]
b) pop - usuwanie
mojalista = ["a", "b", "c", "d", "e"]
mojalista.pop(1)
print(mojalista)
Wynik:
["a", "c", "d", "e"] - bo usunął "b" z pozycji "1"
8) Metody
Metody to specjalne funkcje przypisane do danego obiektu. Wywołuje się je po wpisaniu ich nazwy po kropce, za nazwą obiektu. Dalej tak samo jak w "normalnych" funkcjach - nawias okrągły i atrybuty.
nazwa_zmiennej.nazwa_metody(atrybuty)
moja_lista.append(nowy_element)
Wybrane metody dla list i krotek
krotka | lista | opis |
---|---|---|
.count() |
.count() |
zlicza ilość wystąpień przekazanego parametru |
.index() |
.index() |
podaje pierwszy indeks pod którym jest przekazana wartość |
.append() |
dodaj argument do listy | |
.pop() |
usuń element o podanym indeksie z listy (lub ostatni element) | |
.sort() |
sortuje elementy | |
.copy() |
zwraca kopię obiektu |
List - zmienia krotkę na listę.
Tuple - zmienia listę na krotkę.
Split - rozdziela ciąg znaków i tworzy listę.
a) Krotka
- Metoda
.count()
moja_krotka = (1, 2, 2, 3, 4, 2)
wynik_krotka = moja_krotka.count(2)
print(wynik_krotka)
# Wyświetli: 3, ponieważ liczba 2 występuje trzy razy
- Metoda
.index()
moja_krotka = (1, 2, 3, 4, 5)
wynik_krotka = moja_krotka.index(3)
print(wynik_krotka)
# Wyświetli: 2, ponieważ liczba 3 jest na indeksie 2
b) Lista
- Metoda
.count()
moja_lista = [1, 2, 2, 3, 4, 2]
wynik_lista = moja_lista.count(2)
print(wynik_lista)
# Wyświetli: 3, ponieważ liczba 2 występuje trzy razy
- Metoda
.index()
moja_lista = [1, 2, 3, 4, 5]
wynik_lista = moja_lista.index(3)
print(wynik_lista)
# Wyświetli: 2, ponieważ liczba 3 jest na indeksie 2
- Metoda
.append()
moja_lista = [1, 2, 3]
moja_lista.append(4)
print(moja_lista)
# Wyświetli: [1, 2, 3, 4], ponieważ dodaliśmy liczbę 4 na końcu listy
- Metoda
.pop()
moja_lista = [1, 2, 3, 4]
usuniety_element = moja_lista.pop(1)
print(moja_lista)
print(usuniety_element)
# Wyświetli: [1, 3, 4], ponieważ usunięto element na indeksie 1 (czyli 2)
# oraz wyświetli: 2, jako usunięty element
- Metoda
.sort()
(tylko dla list, krotki są niemodyfikowalne)
moja_lista = [3, 1, 4, 2]
moja_lista.sort()
print(moja_lista)
# Wyświetli: [1, 2, 3, 4], ponieważ lista została posortowana rosnąco
- Metoda
.copy()
moja_lista = [1, 2, 3]
kopia_listy = moja_lista.copy()
print(kopia_listy)
# Wyświetli: [1, 2, 3], ponieważ stworzono kopię listy
9) "Mierzenie" naszych obiektów
Możemy sprawdzić z ilu elementów składa się nasz obiekt (np. lista). Służy do tego funkcja len
.
lista_przyklad = ["coś1", "coś2", "coś3", "coś4"]
print(len(lista_przyklad))
Wynik: 4
10) Słowniki (Dictionaries)
Słownik to struktura danych składająca się z par klucz-wartość. Jest mutowalna. Kluczem może być string, liczba lub krotka, ale nie lista, ponieważ musi to być element unikalny i niemodyfikowalny. Jeżeli klucz nie będzie unikalny to zostanie nadpisany. Umożliwiają szybki dostęp do wartości na podstawie kluczy. W słownikach nie ma indeksów.
moj_slownik = {klucz : wartość}
slownik = {"klucz1": "wartość1", "klucz2": "wartość2"
}

a) dobre praktyki
Dobrą praktyką jest stosowanie jednorodnego schematu klucz tzn.
jeśli kluczem jest np. jakiś tekst będący nazwą potrawy a wartością lista zawierająca jej składniki to trzymajmy się tego przez cały słownik.
Nie wrzucamy jako kolejnego elementu np. klucza z jakąś liczbą (niech to będzie chociażby numer strony naszej ulubionej książki kucharskiej) zestawionego z krótką przechowującą kaloryczność składników jako wartość.
Zwracajmy też uwagę na to czy faktycznie w naszym programie korzystamy z tych słownikowych kluczy - jeśli nie, to jest spora szansa, że powinniśmy skorzystać z innej struktury danych.
b) Słowniki - jak to obsłużyć?
Jeśli chcemy wyświetlić wartość przechowywaną pod konkretnym kluczem to robimy tak jak z listą, tylko zamiast indeksu podajemy klucz w nawiasach kwadratowych.
moj_slownik = {"klucz1": "wartość1", "klucz2": "wartość2"}
print(moj_slownik["klucz2"])
Jeśli chcemy dodać nowy element możemy zrobić to tak: moj_slownik[nowy_klucz] = wartość
moj_slownik = {"klucz1": "wartość1", "klucz2": "wartość2"}
moj_slownik["klucz3"] = "wartość3"
Chcąc usunąć element słownika skorzystamy z metody pop
np.
moj_slownik = {"klucz1": "wartość1", "klucz2": "wartość2"}
moj_slownik.pop("klucz1")
c) Wybrane metody dla słowników
słownik | opis |
---|---|
.keys() | zwraca listę kluczy słownika |
.values() | zwraca listę wartości słownika |
.pop() | usuwa element o podanym kluczu |
.items() | zwraca listę krotek dla każdej pary klucz:wartość |
.get() | zwraca wartość dla danego klucza |
slownik = {"k1": "war1", "k2": "war2"}
slownik.items()
Wynik:
dict_items([('k1', 'war1'), ('k2', 'war2')])
d) Update
Słowników nie dodajemy plusem. Robimy metodę .update
.
moj_slownik2.update(moj_slownik3)
11) Zbiory (Sets)
Zbiór to nieuporządkowana kolekcja unikalnych elementów. Są mutowalne. Jest podobny do listy, ale nie ma tu duplikatów wartości. Jeżeli spróbujemy dodać wartość, która istnieje to wpis zostanie usunięty. Nie mają też indeksów. Zapisuje się je tak jak słowniki - w nawiasach klamrowych.
moj_zbior = {unikat1, unikat2, unikat3}
Umożliwiają operacje matematyczne na zbiorach, takie jak suma, różnica, przecięcie.
12) Różnice w szybkości różnych struktur danych: lista i słownik

Listy – czas wyszukania elementu: 0.22345352172851562 seconds.
Słowniki – czas wyszukania elementu: 0.00000262 seconds.
Samo stworzenie danej struktury zajęło:
Lista: 0.215178608620925734
Słownik: 0.75281405448901357
Słownik długo się tworzy natomiast, więc lepiej już z niego później korzystać.
13) Zadanie domowe: dokończyć zadania.py; zastanowić się, do jakiej struktury danych wrzucić pytania i td do kwestionariusza.