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

Feedback k domácím projektům

Zvířátka

Najdi chyby, nejasnosti či nepřesnosti v tomto kódu:

In [3]:
zvire = input("Zadej zvíře: ")

def je_v_seznamu(zvire):
    zvirata = ["pes", "kočka", "králík", "had", "andulka", "želva"]
    for jmeno in zvirata: 
        if zvire in zvirata:
            return "True"
        else:
            return "False"
            
print(je_v_seznamu(zvire))
Zadej zvíře: ježek
False

Po úpravě:

In [4]:
zvirata = ["pes", "kočka", "králík", "had", "andulka", "želva"]
zvire = input("Zadej zvíře: ")

def je_v_seznamu(zvirata, zvire):
    if zvire in zvirata:
        return True
    else:
        return False

print(je_v_seznamu(zvirata, zvire))
Zadej zvíře: ježek
False

Je možné tuto funkci ještě zkrátit a zjednodušit?

In [8]:
zvirata = ["pes", "kočka", "králík", "had", "andulka", "želva"]
zvire = input("Zadej zvíře: ")

def je_v_seznamu(zvirata, zvire):
    return zvire in zvirata

print(je_v_seznamu(zvirata, zvire))
Zadej zvíře: ježek
False

Další podobná funkce:

In [6]:
def kratke(jmeno = zvirata):
    for i in range(len(jmeno)):
        if len(jmeno[i]) < 5:
            print(jmeno[i])
        else:
            print(end = "")
    return jmeno

kratke(zvirata)
pes
had
Out[6]:
['pes', 'kočka', 'králík', 'had', 'andulka', 'želva']

A její přehlednější varianta:

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

def kratke(seznam):
    novy_seznam = []
    for zvire in zvirata:
        if len(zvire) < 5:
            novy_seznam.append(zvire)
    return novy_seznam
        
print(kratke(zvirata))
['pes', 'had']

Básnička

Obrácené pořadí veršů

In [10]:
with open("static/basnicka.txt", encoding="utf-8") as soubor_s_basnickou:
    basnicka = soubor_s_basnickou.read()

seznam_versu = basnicka.split("\n")  # Rozdělí básničku na jednotlivé verše (řádky) [seznam]
seznam_versu.reverse()  # Obrátí pořadí veršů v seznamu
obracena_basnicka = "\n".join(seznam_versu)  # Složí zpět seznam na řetězec a mezi verše vloží \n
print(obracena_basnicka)
Anyway the wind blows doesn't really matter to me, to me.
Little high, little low,
Because I'm easy come, easy go,
I'm just a poor boy, I need no sympathy,
Look up to the skies and see,
Open your eyes,

No escape from reality.
Caught in a landslide,
Is this just fantasy?
Is this the real life?
In [11]:
with open("static/basnicka.txt", encoding="utf-8") as soubor_s_basnickou:
    seznam_versu = soubor_s_basnickou.readlines()

for vers in seznam_versu[::-1]:
    print(vers, end="")
Anyway the wind blows doesn't really matter to me, to me.
Little high, little low,
Because I'm easy come, easy go,
I'm just a poor boy, I need no sympathy,
Look up to the skies and see,
Open your eyes,

No escape from reality.
Caught in a landslide,
Is this just fantasy?
Is this the real life?

Obrácené pořadí slov ve verších

In [12]:
with open("static/basnicka.txt", encoding="utf-8") as soubor_s_basnickou:
    basnicka = soubor_s_basnickou.read()

seznam_versu = basnicka.split("\n")  # Rozdělí básničku na jednotlivé verše (řádky) [seznam]

nova_basnicka = []  # Seznam pro novou básničku, která obrácením pořadí slov vznikne

for vers in seznam_versu:  # Pro každý verš v originální básničce
    slova = vers.split()  # Rozdělí verš na slova [seznam]
    slova.reverse()  # Obrátí pořádí slov
    novy_vers = " ".join(slova)  # Spojí obrázená slova zpět do řetězce
    nova_basnicka.append(novy_vers)  # Přidá nový verš do nové básničky

obracena_basnicka = "\n".join(nova_basnicka)  # Složí zpět seznam na řetězec a mezi verše vloží \n
print(obracena_basnicka)
life? real the this Is
fantasy? just this Is
landslide, a in Caught
reality. from escape No

eyes, your Open
see, and skies the to up Look
sympathy, no need I boy, poor a just I'm
go, easy come, easy I'm Because
low, little high, Little
me. to me, to matter really doesn't blows wind the Anyway

In [13]:
with open("static/basnicka.txt", encoding="utf-8") as soubor_s_basnickou:
    seznam_versu = soubor_s_basnickou.readlines()

for i, vers in enumerate(seznam_versu):
    slova = vers.split()
    slova.reverse()
    seznam_versu[i] = " ".join(slova)

print("\n".join(seznam_versu))
life? real the this Is
fantasy? just this Is
landslide, a in Caught
reality. from escape No

eyes, your Open
see, and skies the to up Look
sympathy, no need I boy, poor a just I'm
go, easy come, easy I'm Because
low, little high, Little
me. to me, to matter really doesn't blows wind the Anyway

Obrácené pořadí slok

In [14]:
with open("static/basnicka.txt", encoding="utf-8") as soubor_s_basnickou:
    basnicka = soubor_s_basnickou.read()

seznam_slok = basnicka.split("\n\n")  # Rozdělí básničku na jednotlivé sloky [seznam]
seznam_slok.reverse()
basnicka = "\n".join(seznam_slok)
print(basnicka)
Open your eyes,
Look up to the skies and see,
I'm just a poor boy, I need no sympathy,
Because I'm easy come, easy go,
Little high, little low,
Anyway the wind blows doesn't really matter to me, to me.

Is this the real life?
Is this just fantasy?
Caught in a landslide,
No escape from reality.

Slova v náhodném pořadí (Mr. Yoda style)

In [15]:
from random import shuffle

with open("static/basnicka.txt", encoding="utf-8") as soubor_s_basnickou:
    seznam_versu = soubor_s_basnickou.readlines()

for i, vers in enumerate(seznam_versu):
    slova = vers.split()
    shuffle(slova)
    seznam_versu[i] = " ".join(slova)

print("\n".join(seznam_versu))
real Is the this life?
this fantasy? Is just
in Caught landslide, a
No escape from reality.

Open your eyes,
Look and the skies to up see,
a I'm need poor I sympathy, boy, no just
easy I'm come, go, Because easy
little high, low, Little
really doesn't me, to matter Anyway wind to me. the blows

Funkce jako stavební blok programu

Takto použitá funkce situaci spíše komplikuje, než aby něčemu pomohla.

In [16]:
zvirata = ['had', 'andulka', 'pes', 'kočka', 'králík']
dvojice = []
vysledek = []

def razeni_had(seznam1, seznam2, seznam3):
    '''seřadí výchozí seznam1 podle abecedy, ale bude ignorovat první písmeno'''
    for slovo in seznam1:
        seznam2.append([slovo[1:], slovo])
    seznam2.sort()
    for item in seznam2:
        seznam3.append(item[1])
    seznam3

razeni_had(zvirata, dvojice, vysledek)
print(vysledek)
['had', 'pes', 'andulka', 'kočka', 'králík']

Co se asi stane, když takovou funkci zavoláme vícekrát?

In [17]:
zvirata = ['had', 'andulka', 'pes', 'kočka', 'králík']
dvojice = []
vysledek = []

def razeni_had(seznam1, seznam2, seznam3):
    '''seřadí výchozí seznam1 podle abecedy, ale bude ignorovat první písmeno'''
    for slovo in seznam1:
        seznam2.append([slovo[1:], slovo])
    seznam2.sort()
    for item in seznam2:
        seznam3.append(item[1])
    seznam3

razeni_had(zvirata, dvojice, vysledek)
print(vysledek)
razeni_had(zvirata, dvojice, vysledek)
print(vysledek)
['had', 'pes', 'andulka', 'kočka', 'králík']
['had', 'pes', 'andulka', 'kočka', 'králík', 'had', 'had', 'pes', 'pes', 'andulka', 'andulka', 'kočka', 'kočka', 'králík', 'králík']

Ověření, že funkce funguje

Nejsnazší je funkci prostě spustit s různými argumenty a podívat se, zda dělá to, co by dělat měla.

In [20]:
def absolutni_soucet(a, b):
    if a < 0:
        a = -a
    if b < 0:
        b = -b
    return a + b
In [21]:
print(absolutni_soucet(1, 2))
print(absolutni_soucet(100, 200))
print(absolutni_soucet(-1, -2))
print(absolutni_soucet(-1, 2))
print(absolutni_soucet(100, -2))
3
300
3
3
102

Rubber duck problem solving

Jde o techniku řešení problému, při které se svůj problém snažíte vysvětlit někomu (nebo v případě gumové kachny něčemu), kdo programování nemusí vůbec rozumět. Když řešenou problematiku a vaše současné řešení popisujete nahlas, uvědomíte si, co váš program aktuálně dělá a co by dělat měl, což zpravidla vede k vyřešení problému.


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