Funkce se v Pythonu vyrábějí pomocí klíčového slova def
.
def nazev_funkce(prvni_parametr, druhy_parametr, cokoliv):
...kód
Podmínka přináší snad jediné překvapení: abychom si šetřili prsty, místo else if
se píše elif
(a nejde to jinak).
if prvni_podminka:
...kód, když platí první podmínka
elif druha_podminka:
...kód, když neplatí první podmínka a platí druhá
else:
...kód, když neplatí ani jedna z předchozích
Pro ukázku – funkce dvou parametrů, která navrací ten větší z nich:
def ten_vetsi(x, y):
if x > y:
return x
else:
return y
>>> ten_vetsi(7, 83)
83
Mimochodem, podobná funkce je v Pythonu už připravená a jmenuje se max
. Liší se tím, že bere neomezený počet parametrů.
>>> max(7, 8, 3, 83)
83
while
Chová se stejně jako v Javascriptu, liší se jen zápisem – podmínku není potřeba psát do závorek a za ni napíšeme dvojtečku.
while podmínka:
...kód
Pro ukázku použijeme zabudouvanou funkci input()
, která nechá uživatele napsat jeden řádek a navrací výsledek. Mimo to používáme funkci print(něco)
, která prostě vypíše všechno, co dostane. Program chce po uživateli zadat heslo a obtěžuje, dokud si nepřijde na své.
print("Zadej heslo. Jestli nevíš, přečti si ho v kódu o řádek níž.")
while input() != "heslokleslo":
print("Ne, tohle nebylo správně. Zkus to znova.")
print("No proto.")
Datových typů zabudovaných do Pythonu od výroby je celá spousta a není problém si vymyslet nějaké další. Pro úvod si snad vystačíme s následujícími:
int
: celé číslo. Jeho velikost je omezená jenom pamětí vašeho počítače.float
: číslo (jakoby) desetinné. Píšeme ho s desetinnou tečkou. Vzniká z celých čísel při dělení. Má omezený rozsah i přesnost.bool
: pravdivostní hodnota: buďto True
, nebo False
. Pozor na velikost písmen.str
: řetězec. Píšeme buďto s jednoduchými, nebo dvojitými uvozovkami.Voláním funkcí s těmito názvy můžeme skoro cokoliv na daný typ převést.
Navíc máme speciální hodnotu None
. Někdy se hodí ji použít. Když funkce nenavrací žádnou hodnotu, navrací ve skutečnosti None
. Ale pozor – když zkusíme číst z nedefinované proměnné, nastane chyba:
>>> dej_mi_zmrzlinu
Traceback (most recent call last):
File "", line 1, in
NameError: name 'dej_mi_zmrzlinu' is not defined
Když použijeme jako podmínku něco, co není booleovského typu, zavolá se na to automaticky funkce bool
. V takové situaci se číslo 0
vyhodnocuje jako False
a všechna ostatní čísla jako True
. Prázdný řetězec se vyhodnocuje jako False
, všechny ostatní jako True
.
>>> while 1:
... print("AAAAA!")
...
# tradá... Jestli to chcete ukončit, zmáčkněte Ctrl+C
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt
>>> if "False":
... print("Cože?")
...
Cože?
Pozor – v případě převodu na booleovskou hodnotu z předchozího důvodu neplatí, na co jsme zvyklí u čísel:
>>> bool(str(False))
True
Složitější logické výrazy můžeme vyrábět pomocí spojek and
, or
, not
. Když je to potřeba, dané hodnoty se automaticky převedou na bool
.
>>> True and False
False
>>> (not True) or (not False)
True
A samozřejmě můžeme vyrábět podmínky porovnáváním něčeho. Specialitou Pythonu je, že jde porovnání libovolně psát za sebe – berou se z něj jenom sousední dvojice, a ty musí být splněné všechny, aby podmínka platila.
>>> 4 > 3 == 3 != 2 < 7
True
Příklad.Napište podmínku se dvěma proměnnými x, y
, která platí jedině když je jediná z nich pravdivá (výlučné nebo, též známé jako xor).
(x or y) and not (x and y)
# nebo
bool(x) ^ bool(y) # stříška je přímo zabudovaná značka pro tu operaci
Řetězce jde sčítat, jako jsme zvyklí. I jediné písmeno (v uvozovkách, samozřejmě) je řetězec a jde ho přičíst. Přičítání jiných datových typů k řetězci je chyba; číslo musíme výslovně převést pomocí funkce str(číslo)
.
>>> "baum" + "wolle"
'baumwolle'
>>> "osto" + 6
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
>>> "osto" + str(6)
'osto6'
Řetězce můžeme porovnávat na rovnost, a to i s čímkoliv jiným, např. čísly – v tom případě ale vždycky vyjde False
. Ze dvou řetězců můžeme dokonce najít i ten menší: to bude ten, který je dříve v abecedním pořadí. Nezvyklé může být, že všechna velká písmena jsou v téhle abecedě před všemi malými.
>>> "dvě slova" == 'dvě slova'
True
>>> "42" == 42
False
>>> "adam" < "bára"
True
>>> "adam" < "Bára"
False
Délku řetězce, tedy počet písmen, zjistíme funkcí len(řetězec)
:
>>> len("bavlna")
6
Užitečné je klíčové slovo in
. Navrací booleovskou hodnotu, zda se levá hodnota vyskytuje někde v té pravé. V našem případě tedy zkouší, jestli řetězec na levé straně je někde vcelku uvnitř toho napravo (odborněji řečeno, je jeho podřetězcem, anglicky substring).
>>> "trol" in "petrolej"
True
>>> "skin" in "skaut"
False
Příklad. Najděte nejmenší mocninu dvojky, která v desítkovém zápisu obsahuje 666. Asi nejjednodušší je použít while
cyklus a k nějaké proměnné pořád přičítat jedničku. Pro převod do desítkového zápisu potřebujete funkci str
.
i = 0
while "666" not in str(2**i):
i += 1
print(i)
# vypíše: 157