Nauč se Python > Kurzy > Začátečnický kurz PyLadies > Seznamy > Zpětná vazba k domácím projektům

Zpětná vazba k lekci Seznamy

TOP domácí projekty

  • Martina
  • Markéta
  • Tereza
  • Aleš
  • Všichni, kdo (do)odevzdali...

Hra "Had" 🐍

  • Pořadí souřadnic: výška x šířka vs. šířka x výška
  • Varianty:
    • had pod ovocem, tzv. "lenochod"
    • vybíravý had (nebo nepoživatelné ovoce?)
    • had Copperfield/démon, kterému je vidět do žaludku
    • herní pole zavalené lavinou potravy (dvojice souřadnic)

Knihovna curses (windows-curses)

  • "Okénkové programy", jednoduché hry apod. v konzoli/terminálu/příkazové řádce
  • Více zde

Záludnost seznamů

Seznam předaný dovnitř funkce do libovolné lokální proměnné (proměnných) je ve finále stále jeden a ten samý seznam na jednom místě v paměti.

In [2]:
seznam = [3, 1, 2]

def setridit(szn):
   s = szn
   s.sort()
   
setridit(seznam)
print(seznam)
[1, 2, 3]

Zadání projektu (připomenutí)

  • Projít si od začátku do konce.
  • Podívat se, jaké proměnné budou použity, funkce, bloky atd.
  • Konzultovat nejasnosti.
  • Lépe se pochopí fungování dílčích částí...

Funkce uvnitř funkce

In [6]:
def a():
    def b():
        print("Bééé")
    b()
    
a()
b()
Bééé
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-6-6149e301b1f9> in <module>
      5 
      6 a()
----> 7 b()

NameError: name 'b' is not defined

Rekurze v seznamu

In [9]:
seznam = [5, 5, 5, 5, 5, 5]
seznam[5] = seznam
print(seznam)
print(seznam[5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][0])
[5, 5, 5, 5, 5, [...]]
5

Výchozí hodnota ve funkci

In [14]:
domaci_zvirata = ["pes", "kočka", "králík", "had"]

def prvni_pismeno(domaci_zvirata, pismeno):
    zvire_na_pismeno = []
    for zvire in domaci_zvirata:
        if zvire.startswith(pismeno):
            zvire_na_pismeno.append(zvire)
    return zvire_na_pismeno

print(prvni_pismeno(domaci_zvirata, "k"))
print(prvni_pismeno(domaci_zvirata, "h"))
['kočka', 'králík']
['had']

Chceme použít výchozí písmeno (např. "k") => použijeme pojmenovaný argument

In [17]:
domaci_zvirata = ["pes", "kočka", "králík", "had"]

def prvni_pismeno(domaci_zvirata, pismeno="k"):
    zvire_na_pismeno = []
    for zvire in domaci_zvirata:
        if zvire.startswith(pismeno):
            zvire_na_pismeno.append(zvire)
    return zvire_na_pismeno

print(prvni_pismeno(domaci_zvirata))
print(prvni_pismeno(domaci_zvirata, "h"))
['kočka', 'králík']
['had']

Výchozí hodnota MUSÍ být vždy tzv. immutable: int, float, bool, str, tuple, None

Třídění seznamů

  • Kapitola sama pro sebe.
  • Spousty algoritmů, každý má své plusy a mínusy. Lze si napsat vlastní algoritmus. My vystačíme pro začátek se .sort().
  • Klíč: sort(key=<typicky funkce>, reverse=...)
  • lambda funkce

Funkce sorted:

In [33]:
a = [3, 1, 2]
b = sorted(a)

print(a)
print(b)
[3, 1, 2]
[1, 2, 3]

List comprehension

In [38]:
a = list()
for i in range(10):
    a.append(i)
In [20]:
[i for i in range(10)]
Out[20]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [23]:
[i for i in range(10) if i % 2 == 0]
Out[23]:
[0, 2, 4, 6, 8]
In [18]:
x = []
for i in range(3):
    y = []
    for j in range(3):
        y.append(".")
    x.append(y)
    
print(x)
[['.', '.', '.'], ['.', '.', '.'], ['.', '.', '.']]

Nebo...

In [19]:
x = [["." for j in range(3)] for i in range(3)]
print(x)
[['.', '.', '.'], ['.', '.', '.'], ['.', '.', '.']]

Kde je problém s [["."] * 3] * 3?

In [ ]:
x = [["."] * 3] * 3
x[1][0] = "X"
print(x)
In [30]:
x = [["."] * 3 for i in range(3)]
x[1][0] = "X"
print(x)
[['.', '.', '.'], ['X', '.', '.'], ['.', '.', '.']]

Nástroje pro porovnání kódu

  • Dnes již běžná součást služeb GitHub apod.
  • Součást textových editorů
  • Atom
  • vimdiff
  • Online služby: Příklad

Obecné věci

  • Než udělám akci, provedu (obvykle) nejdříve kontroly:
    • Typicky uživatelský vstup
    • Hra "Had", než udělám pohyb na novou pozici:
      • Je tam konec plánu? => Konec hry.
      • Jsem tam já, tzn. hrozí, že se kousnu? => Konec hry.
      • Je tam ovoce? => Nechám hada narůst.
      • Pohyb => Uložím údaj o nové pozici.

Toto je stránka lekce z kurzu, který probíhá nebo proběhl naživo s instruktorem.