98
Kapitola 6 Proměnné
Výpis 6.3: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
Současné přiřazení skupiny hodnot proměnným
>>> a = 1; b = 2 >>> a 1 >>> a, b (1, 2) >>> x = y = z = 123 >>> x, y, z (123, 123, 123) >>> x, y, z = 10, 20, 30 >>> x, y, z (10, 20, 30) >>> a, b, c = 11, 22 Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> a, b, c = 11, 22 ValueError: not enough values to unpack (expected 3, got 2) >>> a, b, c = 11, 22, 33, 44 Traceback (most recent call last): File "<pyshell#10>", line 1, in <module> a, b, c = 11, 22, 33, 44 ValueError: too many values to unpack (expected 3) >>> a, b, c Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> a, b, c NameError: name 'c' is not defined >>> a, b (1, 2) >>>
Zadáním několika hodnot oddělených čárkami vytvoříte objekt označovaný jako n-tice (anglicky tuple). Ten se pak zobrazuje jako sada čárkami oddělených hodnot uzavřená v kulatých závorkách. Vytvoření tohoto objektu nám však nebrání v tom, abychom pracovali s jednotlivými hodnotami samostatně. S n-ticemi se podrobněji seznámíme v kapitole 18 N-tice na straně 261.
Obdobně můžeme požádat o vypsání hodnot skupiny proměnných. Stačí napsat jejich názvy oddělené čárkami, jak je naznačeno na řádcích 4, 7 a 10. Nevýhodou posledního způsobu zadávání hodnot je, že je trochu méně přehledný a zejména při zadávání většího počtu hodnot je náchylný k zadání špatných hodnot. Je-li zadaných hodnot méně, než je požadováno (řádek 12), vypíše interpret chybové hlášení, v němž oznámí očekávaný a zadaný počet hodnot (řádek 16). Jak ukazuje reakce na příkaz na řádku 17, překladači se nebude líbit ani to, když zadáte hodnot více, protože ty přebytečné nebude mít kam uložit. V obou případech ohlásí chybu překladu a nepřiřadí nic. 68_Python_3,10_ZLOM.doc; verze 1.03.8814_2021-08-10_út_17-05
Strana 98 z 585 Ukázka elektronické knihy, UID: KOS504617
6.5 Vnořená volání funkčních objektů
99
Když se program na řádku 22 pokouší vytisknout hodnoty proměnných, které se na řádcích 12 a 17 pokusil inicializovat, interpret opět ohlásí chybu a oznámí (řádek 26), že proměnná c neexistuje. Jak ale ukazuje reakce na příkaz na řádku 24, s proměnnými, které existovaly před zadáním inkriminovaného chybného příkazu, lze nadále pracovat. Jsou v nich uloženy hodnoty, které tam byly před zadáním chybných příkazů.
Proměnné inf a nan V pasáži Nekonečna a nesmyslná čísla na straně 87 jsme si ukazovali, že Python zavádí pro čísla typu float pomocné hodnoty inf a nan, ale současně jsme si ukázali, že je nemůžeme použít přímo, protože interpret tvrdí, že tyto názvy nezná. Nic nám ale nebrání definovat v případě potřeby příslušné proměnné a pak je použít. Ukazují to příkazy ve výpisu 6.4 a reakce systému na ně. Výpis 6.4: 1 2 3 4 5 6
Zavedení proměnných inf a nan
>>> inf = float('inf'); nan = float('nan') >>> inf*inf, -inf*inf, -123/inf, -123/-inf, nan (inf, -inf, -0.0, 0.0, nan) >>> type(inf), type(nan) (<class 'float'>, <class 'float'>) >>>
6.5 Vnořená volání funkčních objektů Jak jsme si vysvětlili v minulé kapitole, funkce (a obecně funkční objekty) voláme proto, aby počítač něco udělal a vrátil nám požadovaný výsledek, i když tímto výsledkem je pro některé funkce hodnota None. Obdržený výsledek se však může stát argumentem následně volané funkce. Přitom máme dvě možnosti:
● Zavolat první funkci, obdržený výsledek uložit do proměnné a tuto proměnnou pak zadat jako argument druhé funkce. ● Zadat volání druhé funkce a na místě předávaného argumentu zadat volání té první. Překladač musí nejprve připravit argumenty volané (tj. druhé) funkce (tj. vyhodnotit zadané výrazy). V rámci této přípravy zavolá první funkci a obdržený výsledek pak druhé funkci předá. Pokud jste teprve začátečníci, bude pro vás možná první uvedený způsob přehlednější, ale buďte ubezpečeni, že se postupně bude rozšiřovat množina situací, v nichž budete dávat přednost druhému způsobu. Ukázky obou způsobů jsou připraveny ve výpisu 6.5, v němž jsou na řádku 1 definovány všechny potřebné proměnné a na řádku 2 je volání funkce print(), v němž jsou tyto proměnné předány jako argumenty, jejichž hodnotami se pak inicializují příslušné parametry. 68_Python_3,10_ZLOM.doc; verze 1.03.8814_2021-08-10_út_17-05
Strana 99 z 585 Ukázka elektronické knihy, UID: KOS504617
100
Kapitola 6 Proměnné
Výpis 6.5: 1 2 3 4 5 6
Ukázky vnořeného volání funkcí
>>> c = '€'; code = ord(c); >>> print('VAR: Kód znaku', c, VAR: Kód znaku € je 8364 = >>> print('CALL: Kód znaku', c, CALL: Kód znaku € je 8364 = >>>
hexcode = hex(code) "je", code, "=", hexcode) 0x20ac "je", ord(c), "=", hex(ord(c))) 0x20ac
Na řádku 4 je pak obdobné volání téže funkce, jenom v něm jsou hodnoty předávaných argumentů získávány prostřednictvím volání funkcí. Postup vyhodnocení tohoto příkazu je následující: 1. Překladač zjistí, že volám funkci print s mnoha argumenty, a pustí se do jejich vyhodnocování. 2. Prvním argumentem je string, druhým hodnota proměnné a třetím opět string. Zde je vše připraveno, takže jejich hodnoty je možné uložit do příslušných parametrů. 3. Čtvrtým argumentem je volání funkce ord(). Překladač proto: 1. Uloží hodnotu proměnné c do parametru funkce ord(). 2. Zavolá funkci ord(). 3. Převezme návratovou hodnotu a zadá její uložení jako výchozí hodnoty čtvrtého parametru funkce print(). 4. Pátým argumentem je volání funkce hex(). Překladač proto: 1. Začne chystat předání argumentu, ale zjistí, že argumentem je volání funkce ord(). 2. Postupem popsaným v předchozím bodě zavolá tuto funkci a zadá uložení její návratové hodnoty jako výchozí hodnoty parametru funkce hex(). 3. Zavolá funkci hex(). 4. Převezme návratovou hodnotu funkce hex() a zadá ji jako pátý argument funkce print(). 5. Zavolá funkci print(). Ze zkušenosti vím, že pochopení tohoto mechanismu dělá některým studentům problémy. Ukázku, která nám tento mechanizmus názorně předvede, proto odložím na dobu, až budete mít větší zkušenosti – konkrétně až se v podkapitole 11.2 Definice vlastní funkce na straně 163 naučíte definovat vlastní funkce. Vše si pak ukážeme v podkapitole 13.7 Vnořená volání funkcí na straně 196.
68_Python_3,10_ZLOM.doc; verze 1.03.8814_2021-08-10_út_17-05 Ukázka elektronické knihy
Strana 100 z 585