Feedback

Rekurze

Rekurze je speciální postup používaný v programování, v rámci kterého necháme funkci, aby volala sama sebe. Asi nejznámější příklad na rekurzi je generování fibonacciho čisla.

Fibonacciho posloupnost = 0, 1, 1, 2, 3, 5, 8, 13, 21, …

In [1]:
def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)
In [2]:
fib(6)
Out[2]:
8
In [3]:
fib(10)
Out[3]:
55

Záporná čísla a funkce range

Range generuje vždy čísla od nuly do zadaného kladného celého čísla.

In [4]:
cislo = 5

list(range(cislo + 1))
Out[4]:
[0, 1, 2, 3, 4, 5]

Pokud mu jako jediný argument zadáme číslo záporné, range nám nedá ani jedno číslo.

In [5]:
cislo = -10

list(range(cislo + 1))
Out[5]:
[]

Můžeme mu ale dát jako začátek tak konec intervalu a pak bude range používat i záporná čísla.

In [6]:
cislo = -10

list(range(cislo, cislo + 20))
Out[6]:
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Ve funkci pro mocniny

I range se dá přiřadit do proměnné :)

In [7]:
def vypocet_mocniny(cislo):
    if cislo < 0:
        muj_range = range(cislo, 0)
    else:
        muj_range = range(0, cislo + 1)

    vysledek = []
    for i in muj_range:
        vysledek.append((i, i**2))
    return dict(vysledek)
In [8]:
print(vypocet_mocniny(8))
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}
In [9]:
print(vypocet_mocniny(-8))
{-1: 1, -8: 64, -7: 49, -6: 36, -5: 25, -4: 16, -3: 9, -2: 4}

Proč mi to hodí jako poslední řádek None?

In [10]:
def vypsat_na_radek(znamky_matematika):
    for klic, hodnota in znamky_matematika.items():
        print("{}: {}".format(klic, hodnota))
In [11]:
znamky_matematika = {'Pepa': 5, 'Anicka': 2, 'Karlik': 1}
print(vypsat_na_radek(znamky_matematika))
Pepa: 5
Karlik: 1
Anicka: 2
None

Funkce, která neobsahuje return vždy vrátí None a protože je zde použita ve funkci print tak se None i vypíše jako poslední řádek. Řešením je volat funkce, které nic nevrací, bez printu.

In [12]:
vypsat_na_radek(znamky_matematika)
Pepa: 5
Karlik: 1
Anicka: 2

Najdi chybu

In [13]:
def slovnik_z_retezce(retezec):
    slovnik={}
    for klic in retezec:
        slovnik=slovnik.setdefault(klic,(retezec.count(klic)))
    return slovnik
In [14]:
print(slovnik_z_retezce("abcdebcdecdedee"))
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-14-e9e385c59daf> in <module>()
----> 1 print(slovnik_z_retezce("abcdebcdecdedee"))

<ipython-input-13-73390298797d> in slovnik_z_retezce(retezec)
      2     slovnik={}
      3     for klic in retezec:
----> 4         slovnik=slovnik.setdefault(klic,(retezec.count(klic)))
      5     return slovnik

AttributeError: 'int' object has no attribute 'setdefault'

Chyba je v tom, že výstup z funkce setdefault je nějaká hodnota, která přepíše proměnnou slovnik a ta už tedy nadále slovníkem není a znovu se na ní nedá metoda setdefault aplikovat.

In [15]:
def slovnik_z_retezce(retezec):
    slovnik={}
    for klic in retezec:
        slovnik.setdefault(klic,(retezec.count(klic)))
    return slovnik
In [16]:
print(slovnik_z_retezce("abcdebcdecdedee"))
{'e': 5, 'd': 4, 'c': 3, 'b': 2, 'a': 1}

Ještě o krapet lepší řešení

In [17]:
def slovnik_z_retezce(retezec):
    slovnik={}
    for klic in retezec:
        slovnik[klic] = retezec.count(klic)
    return slovnik
In [18]:
print(slovnik_z_retezce("abcdebcdecdedee"))
{'e': 5, 'd': 4, 'c': 3, 'b': 2, 'a': 1}

Skautská hra

In [19]:
from random import choice

questions = ['Kdo?', 'S kým?', 'Co dělali?']  # , 'Kde?', 'Kdy?', 'Proč?']
answers = {}
result = ''

for question in questions:
    print('Odpovídej na otázku. Až toho budeš mít dost, odpověz "konec"')
    while True:
        answer = input(question + ' ')
        if answer == 'konec':
            break
        else:
            if question not in answers:
                answers[question] = [answer]
            else:
                answers[question].append(answer)

for question in questions:
    result += choice(answers[question]) + ' '

print(result)
Odpovídej na otázku. Až toho budeš mít dost, odpověz "konec"
Kdo? Pepa
Kdo? Karel
Kdo? Jirka
Kdo? konec
Odpovídej na otázku. Až toho budeš mít dost, odpověz "konec"
S kým? s Alenou
S kým? s Majdalenkou
S kým? s Frantiskem
S kým? konec
Odpovídej na otázku. Až toho budeš mít dost, odpověz "konec"
Co dělali? pekli pizzu
Co dělali? sazeli brambory
Co dělali? koukali na film
Co dělali? konec
Karel s Alenou pekli pizzu 

Vychytávky

In [20]:
veta = ['Pepa', 'Mirka', 'pekli pizzu']

veta[0:1] + ['a'] + veta[1:] + ['.']

print(' '.join(veta))
Pepa Mirka pekli pizzu