Feedback k domácím projektům

Testování funkcí

Nedjříve si udělám libovolnou funkci

In [1]:
from math import sqrt

def pythagorova_veta(a, b):
    c2 = a**2 + b**2
    return sqrt(c2)

A pak ji můžu snadno otestovat přímo v tom samém souboru

In [2]:
print(pythagorova_veta(1, 1))
print(pythagorova_veta(2, 2))
print(pythagorova_veta(3, 3))
print(pythagorova_veta(1, 2))
print(pythagorova_veta(2, 1))
1.4142135623730951
2.8284271247461903
4.242640687119285
2.23606797749979
2.23606797749979

Globální vs lokální proměnné

Použití globální proměnné ve funkci

In [3]:
herni_pole = 'O-XX-O---XXX-O--X'

def vyhrava(symbol):
    if symbol * 3 in herni_pole:
        return True
    else:
        return False
In [4]:
vyhrava('O')
Out[4]:
False
In [5]:
vyhrava('X')
Out[5]:
True

Změna globální proměnné ve funkci

In [6]:
herni_pole = 'O-XX-O---XXX-O--X'

def vynuluj_hru():
    herni_pole = '-' * 20
In [7]:
print(herni_pole)
vynuluj_hru()
print(herni_pole)
O-XX-O---XXX-O--X
O-XX-O---XXX-O--X

Použití lokální proměnné mimo funkci

In [8]:
veta = 'Minule Pyvo bylo super, diky!'

def pocet_pismen(text, pismeno):
    pocet = text.count(pismeno)
    
    print('Pocet "{}" v textu je {}'.format(pismeno, pocet))
    
pocet_pismen(veta, 'y')
Pocet "y" v textu je 3
In [9]:
print(pocet)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-9-c2aae4b76403> in <module>()
----> 1 print(pocet)

NameError: name 'pocet' is not defined

Jak z toho ven?

Nepouřívat globální proměnné

Pomáhá s testováním

In [10]:
def vyhrava(pole, symbol):
    if symbol * 3 in pole:
        return True
    else:
        return False

herni_pole = 'O-XX-O---XXX-O--X'
    
print(vyhrava(herni_pole, 'X'))
print(vyhrava(herni_pole, 'O'))
True
False

Sestavování řetězců v printu

Pozor na sestavování řetězců a jiných proměnných v printu, nikam se neuloží.

Špatně

In [11]:
pocet_pokusu = 20
print(pocet_pokusu + 1)
21
In [12]:
if pocet_pokusu > 20:
    print('Konec hry')
else:
    print('Pokracujeme')
Pokracujeme

Správně

In [13]:
pocet_pokusu = 20
pocet_pokusu = pocet_pokusu + 1
print(pocet_pokusu)
21
In [14]:
if pocet_pokusu > 20:
    print('Konec hry')
else:
    print('Pokracujeme')
Konec hry

continue a break

  • continue zastaví průběh cyklu a vrátí se zpět na jeho začátek, vezme další prvek z řady a projíždí cyklus znovu s novým prvkem
  • break ukončuje celý cýklus a skáče v programu až na jeho konec a pokračuje za ním dál v programu
In [15]:
for x in range(11, 20):
    if x % 5 == 0:
        continue
    print(x, 'neni nasobek peti')
print('To je vse pratele ...')
11 neni nasobek peti
12 neni nasobek peti
13 neni nasobek peti
14 neni nasobek peti
16 neni nasobek peti
17 neni nasobek peti
18 neni nasobek peti
19 neni nasobek peti
To je vse pratele ...
In [16]:
for x in range(11, 20):
    if x % 5 == 0:
        break
    print(x, 'neni nasobek peti')
print('To je vse pratele ...')
11 neni nasobek peti
12 neni nasobek peti
13 neni nasobek peti
14 neni nasobek peti
To je vse pratele ...

Záměna znaku v piškvorkách

In [17]:
retezec = '-----------------'
pozice = 5
znak = 'X'

retezec = retezec[:pozice] + znak + retezec[pozice+1:]

print(retezec)
-----X-----------

Obojího může být ve funkci libovolné množství, ale:

  • když Python narazí na print, tak vypíše požadované informace a pokračuje dál v provádění následujících příkazů
  • když Python narazí na return, tak funkcí ukončí (tedy nic dalšího už se ve funkci neprovede) a vrátí hodnotu, která je za return napsaná
In [18]:
def existuje_prazdne_pole(herni_pole):
    for znak in herni_pole:
        if znak == '-':
            print('Mame ho')
            return True
        else:
            print('Tohle neni prazdne ...')
    return False
In [19]:
print('Prvni test')
print(existuje_prazdne_pole('XXOOXXO-XXOOXOXOOX'))
print('Druhy test')
print(existuje_prazdne_pole('XXOOXXOOXXOOXOXOOX'))
Prvni test
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Mame ho
True
Druhy test
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
Tohle neni prazdne ...
False

Cesty k souborům

Absolutní

In [20]:
cesta = 'F:\\pyladies\\popis.txt'

Relativní

In [21]:
cesta = 'popis.txt'

Najdi chyby

In [ ]:
def utajene_slovo():
    pocet_pismen = len(slovo) * "_"
    return pocet_pismen

print(pocet_pismen)

Obecné

  • Odevzdávat vždy všechny soubory potřebné k běhu programu
  • Psát do názvu souboru čísla úloh