Funkce a podmínky

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

Cyklus 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é typy

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:

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

Booleovská aritmetika

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).

Řešení. (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

Ř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.

Řešení. i = 0 while "666" not in str(2**i): i += 1 print(i) # vypíše: 157