Python - zajęcia 4

Python - zajęcia 4
Photo by Pankaj Patel / Unsplash

Struktury danych

Zadaniem struktur jest przechowywanie i organiazowanie danych. Struktury mają wiele rodzajów ze względu na efektywnosć działania na danej strukturze i umozliwiający korzystanie w łatwy sposób przez programistów. Struktura niesie za Sobą korzyści np. programista w pythonie wie, że może je modyfikować i obsługiwać za pomocą powiązanych z nią metodami.

Listy

  • Są modyfikowalne (mutable), co oznacza, że można je modyfikować (dodawać/odejmować elementy).
  • Często przemieszczamy się w ich wypadku po elementch.
  • Unika się raczej sięgania po elementy umieszczone w środku list.
  • Struktura uporządkowana, którą deklaruje się za pomocą nawiasów kwadratowych [].
moje_ksiazki = ["harry potter", "Hobbit", "The animator's survival kit"]

print(moje_ksiazki)

print(type(moje_ksiazki))

W listach mieszanie typów jest raczej złym nawykiem:

kiepska_lista = ["pies", 1.32, True] #tak nie robimy

Krotki (tuple)

  • Są niemodyfikowalne (immutable).
  • Ich długość jest stała, w związku z tym programiści sięgają po elementy znajdujące się gdzie głęboko w nich.
  • W krotkach można mieszać typy.
  • Deklaruje się je za pomocą nawiasów okrągłych ().
kategorie menu = ("przystawki", "zupy", "desery")

mojakrotka = (1, 2, 3, 4)

print(mojakrotka)

print(type(mojakrotka))


topor = ("ciężki topór", 100 )

Listy i krotki

  • Oba te elementy posiadają swoj indek który umożliwia jego szybkie odnalezienie.
  • Mogą posiadać duplikaty
  • I w listach jak i w krotkach można się przemieszczać (iterate) po ich elementach.

Indeksy

Służą do "wyciągnięcia" konkretnego elementu będącego częścią struktury. Aby go wyciągnąć, wpisujemy odpowiedni identyfikator w nawiasach kwadratowych [], po nazwie zmiennej. W przypadku wyciągnięcia czegoś z końca listy można sięgnąć po ostatni element wpisując ujemny indeks np. -1.
nazwa_zmiennej[inkes]

moja_lista = ["coś1", "coś2", "coś3", "coś4"]

print(moja_lista[1])     #Wynikiem będzie "coś2"

print(moja_lista[-1])    #Wynikiem będzie "coś4"

Uwaga
Trzeba mieć na uwadze, to że indeksy są liczone od 0 a nie od 1.

przykład

Cięcie list i krotek

Aby wyświetlić zakres elementów z listy lub krotki, potrzeba wpisać w nawiasie kwadratowym [] oddzielonymi dwukropkiem element startowy i końcowy.
moja_zmienna[start:koniec], przykładowo:

moja_lista = ["róża", "tulipan", "piwonie", "słonecznik"]
print(moja_lista[1:3]

Metody dla list i krotek

Są to funkcje "wbudowane" w dany obiekt. Wywołuje się je następująco:
nazwa_zmiennej.metoda()

przykład metod dla list i krotek

Przykłady:

#kwiaty = ["róża", "tulipan", "piwonia", "słonecznik", "storczyk"]  #lista
#przyroda = ("kwiaty", "chmury", "góry", "lasy", "zwierzęta")       #krotka

.count()

przyroda = ["kwiaty", "chmury", "góry", "lasy", "kwiaty"]
rosliny = przyroda.count("kwiaty")
print (rosliny)                                     #Wynikiem będzie liczba 2


przyroda = ("kwiaty", "chmury", "góry", "lasy", "kwiaty")
rosliny = przyroda.count("kwiaty")
print (rosliny)                                      #Wynikiem będzie liczba 2

.index()

przyroda = ["kwiaty", "chmury", "góry", "lasy", "kwiaty"]
print (przyroda[1])                                  #Wynikiem będą "chmury"

przyroda = ["kwiaty", "chmury", "góry", "lasy", "kwiaty"]
lista = przyroda.index("chmury")
print (lista)                                        #Wynikiem będzie liczba 1

przyroda = ["kwiaty", "chmury", "góry", "lasy", "kwiaty"]
print (przyroda[1:3])                               #Wynikiem będą: chmury, góry

przyroda = ["kwiaty", "chmury", "góry", "lasy", "kwiaty"]
print (przyroda[2:])                          #Wynikiem będą: góry, lasy, kwiaty

przyroda = ["kwiaty", "chmury", "góry", "lasy", "kwiaty"]
print (przyroda[0::2])                      #Wynikiem będą: kwiaty, góry, kwiaty

przyroda = ("kwiaty", "chmury", "góry", "lasy", "kwiaty")
print (przyroda[1])                                  #Wynikiem będą "chmury"

przyroda = ("kwiaty", "chmury", "góry", "lasy", "kwiaty")
lista = przyroda.index("chmury")
print (lista)                                        #Wynikiem będzie liczba 1

przyroda = ("kwiaty", "chmury", "góry", "lasy", "kwiaty")
print (przyroda[1:3])                               #Wynikiem będą: chmury, góry

przyroda = ("kwiaty", "chmury", "góry", "lasy", "kwiaty")
print (przyroda[2:])                          #Wynikiem będą: góry, lasy, kwiaty

przyroda = ("kwiaty", "chmury", "góry", "lasy", "kwiaty")
print (przyroda[0::2])                      #Wynikiem będą: kwiaty, góry, kwiaty

.append()

kwiaty = ["róża", "tulipan", "piwonia", "słonecznik"]
kwiaty.append("storczyk")
print(kwiaty)
#Wynikiem będzie: róża, tulipan, piwonia, słonecznik i storczyk

kwiaty = ["róża", "tulipan", "piwonia", "słonecznik"]
kwiaty.append(input("Podaj kwiatka: "))
print(kwiaty)
#Wynikiem będzie: róża, tulipan, piwonia, słonecznik i kwiat podany przez uzytkownika

.pop()

kwiaty = ["róża", "tulipan", "piwonia", "słonecznik", "storczyk"]
kwiaty.pop(-1)
print(kwiaty)
#Wynikiem będzie: róża, tulipan, piwonia, słonecznik

.sort()

kwiaty = ["róża", "tulipan", "piwonia", "słonecznik", "storczyk"]
kwiaty.sort()
print(kwiaty)
#Wynikiem będzie: 'piwonia', 'róża', 'storczyk', 'słonecznik', 'tulipan'

kwiaty = ["róża", "tulipan", "piwonia", "słonecznik", "storczyk"]
kwiaty.sort(reverse=True)
print(kwiaty)
#Wynikiem będzie: 'tulipan', 'słonecznik', 'storczyk', 'róża', 'piwonia'

kwiaty = ["róża", "tulipan", "piwonia", "słonecznik", "storczyk"]
kwiaty.sort(key=len)
print(kwiaty)
#Wynikiem będzie: 'róża', 'tulipan', 'piwonia', 'storczyk', 'słonecznik'

.copy()

kwiaty = ["róża", "tulipan", "piwonia", "słonecznik", "storczyk"]
kwiaty.copy()
print(kwiaty)
#Wynikiem będzie: 'róża', 'tulipan', 'piwonia', 'słonecznik', 'storczyk'

Słowniki (ang. dictionary)

Jest to bardziej zaawansowana struktura, umożliwiająca szybsze odnalezienie jakiejś zawartości z pomocą wartości klucza przypisanego do niej.
Klucz MUSI być unikalny czyli NIE MOŻE się powtórzyć w słowniku, wartosci mogą być dowolne.
Klucz MUSI być wartością, na której da się wykonać tzw. funkcje skrótu. - podstawowe typy/struktury "niemodyfikowalne" (teksty, liczby, krotki) mogą być kluczem. Uwaga! w momencie kiedy krotka zawiera jakiś element modyfikowalny to przestaje nadawać się na klucz
Deklarujemy je:
moj_slownik = {"klucz1":"wartość1", "klucz2":"wartość2"}

przyroda = {
"kwiaty" : "róża",
"chmury" : "cumulus",
"zwierzęta" : "bober"
}

Aby wyświetlić wartość przechowywaną pod konkretnym kluczem podajemy w nawiasach kwadratowych klucz:

print(przyroda["kwiaty"])

Ważne jest aby być konsekwentnym przy tworzeniu słowników

Obsługa słownika

moj_slownik = {"klucz1" : "wartość1", "klucz2" : "wartość2"}
print(moj_slownik["klucz2"])

Dodanie nowego klucza
moj_slownik[nowy_klucz] = wartość

moj_slownik = {"klucz1" : "wartość1", "klucz2" : "wartość2"}
moj_slownik["klucz3"] = "wartość3"
print(moj_slownik)

Słowniki - metody

przykład metod dla słownika

Przykłady:

.keys()

moj_slownik = {"klucz1" : "wartość1", "klucz2" : "wartość2"}
klucze = moj_slownik.keys()
print(klucze)
#Wynikiem będzie: klucz1, klucz2

.values()

moj_slownik = {"klucz1" : "wartość1", "klucz2" : "wartość2"}
wartość = moj_slownik.values()
print(wartość)
#Wynikiem będzie: 'wartość1', 'wartość2'

.pop()

moj_slownik = {"klucz1" : "wartość1", "klucz2" : "wartość2"}
moj_slownik.pop("klucz2")
print(moj_slownik)
#Wynikiem będzie: 'klucz1': 'wartość1'

.items()

Jeszcze nie ogarniam :c

.get()

moj_slownik = {"klucz1" : "wartość1", "klucz2" : "wartość2"}
print(moj_slownik.get("klucz2"))
# #Wynikiem będzie: wartość2

Jak dodać słownik do słownika

  1. Metoda scalony:
    **{moj_slownik1,moj_slownik2}
moj_slownik1 = { "klucz1": "wartość1", "klucz2": "wartość2", }
moj_slownik2 = { "zwierze1": "pies", "zwierze2": "chomik", }
scalony = {**moj_slownik1, **moj_slownik2}
print("scalony:")
print(scalony)
  1. Metoda .update:
    moj_slownik1.update(moj_slownik2)
moj_slownik1 = { "klucz1": "wartość1", "klucz2": "wartość2", }
moj_slownik2 = { "zwierze1": "pies", "zwierze2": "chomik", }
moj_slownik1.update(moj_slownik2)
print(moj_slownik1)

Zbiory

Wyglądają podobnie do listy, z tym że nie posiadają duplikatów co wiąże się z tym, że jeżeli spróbujemy dodać coś dwa razy do zbioru np."róża" to ten drugi zostanie usunięty. Brak powtórzeń jest wykorzystywany np. przy zmianie listy na zbiór, żeby pozbyć się duplikatów.
Nie posiadają indeksów.
Można o nich myśleć jak o takich dziwnych słownikach, które mają jedynie klucze.
Deklaruje sie je za pomocą nawiasów klamrowych {}.
moj_zbior = {unikat1, unikat2, unikat3}

prosty_zbior = {"pies", "kot", "rybka"}
print(prosty_zbior)

Zmiana listy na zbiór i z powrotem

ksiazki = ["Endymion", "Hobbit", "Fundacja", "Endymion"]
zbior_ksiazek =  set(ksiazki)
ksiazki_bez_powtorzen =  list(zbior_ksiazek)

Struktury mieszane

Elementem słownika, listy czy krotki może być inny słownik, lista, krotka, przykładowo:

rig ={
    "left_arm" : ["arm02", "arm03", "arm04", "arm05"]
    }
print(rig["left_arm"][2])

Typy modyfikowalne i niemodyfikowalne

typy

Zadanie

krotka = ("dobrze", "źle")

pytania = {"pytanie1":"Ile to 2=2 \na) 2 \nb) 0  \nc) 4",
           "pytanie2":"Ile to 1=1 \na) 7 \nb) 2  \nc) 6"}

print(pytania.get("pytanie1"))
odp = (input("odp.a b lub c: "))
if odp == "c":
    print (krotka[0])
else:
    print (krotka[1])

print(pytania.get("pytanie2"))
odp = (input("odp.a b lub c: "))
if odp == "b":
    print (krotka[0])
else:
    print (krotka[1])