Programování v Pythonu
Přihlásit se
Programování v Pythonu (12/21) · 9:12

Co se odehrává při volání funkce Rozsah platnosti proměnných a volání funkcí.

V tomto videu se zamyslíme nad tím, co se stane, když definujeme funkci a co se skutečně krok po kroku stane, když funkci použijeme. Řekněme, že píšeme program, stejně jako v předchozím videu, a že ho spustíme. Interpretr začne prvním řádkem a řekne si: „Podívejme se! Tady je definice funkce factorial.“ Tady udělá to, že vytvoří velkou krabici a ta krabice bude prostředím. Prostředím pro program. Pro všechny rozdílné definice a proměnné a vše ostatní, co souvisí s částí programu, která zrovna běží. Program si okamžitě přiřadí „factorial“ k této funkci. To znamená, že jakmile uvidí „def factorial“, ve skutečnosti přiřadí... Jen to sem napíšu... Ve skutečnosti přiřadí „factorial“ ... lépe řečeno jmenovku „factorial“ k funkci, která vypadá tak, jak vidíme zde.. Vy jí předáte „number“... Předáte jí „number“... je to funkce... já nepoužívám... napíšu to radši takhle. Můžete se setkat s jiným zápisem jako je pokročilá lambda notace, která se vyučuje ve školách, ale já jen říkám, že „factorial“ odkazuje na funkci, která přebírá parametry... přebírá jeden parametr jménem „number“. A když dostane parametr „number“, provede celý tenhle kód. Jen to sem vložím... Ale ne, dělám to ve špatné vrstvě... jen to vložím znovu... Takže to zkopíruju... zkopíruju a vložím. A přesně tohle to bude dělat. Tenhle rámeček... tohle prostředí obsahuje celý kód, mějte se mnou trpělivost, nakreslil jsem ten oranžový rámeček moc malý. Předělám to, abych předešel nedorozumění, jen abych vás nemátl rozšířím ten oranžový rámeček. Kousek jsem si umazal. Jeden z parametrů je „number“ a všechno je to uvnitř oranžového rámečku. Tohle je zelená, zelenou ne. A máme to! Takže jakmile se dostaneme na první řádky, je zde napsáno: „V celém našem globálním prostředí definujeme funkci „factorial", která přebírá parametr „number" a která provede celý tenhle kód, který jsme předtím napsali a vrátí to, co vytvořila, vrátí hodnotu proměnné „product“. A tak to pokračuje řádek po řádku až se dostaneme k tomuto řádku, kde je napsáno, že proměnná „user_input“ se rovná... a pak se zavolá funkce „input“ a předá se jí... (teď začínám používat něco z odborných výrazů, se kterými jsme se setkali) ...funkci „input“ se předá řetězec. Tohle je řetězec. Opakuji, „řetězec“ zní složitě, ale ve skutečnosti je to jen posloupnost znaků... nebo text, který vidíte zde. Text „Enter a non-negative integer to take the factorial of: “ Součástí řetězce jsou dokonce i mezery. Poznávacím znakem řetězců je to, že jsou uzavřeny v uvozovkách, buď v jednoduchých nebo dvojitých. Předáním tohoto funkci „input“ říkáme funkci, co má vypsat pro uživatele. Takže se vypíše tento řetězec, uživatel zadá číslo nebo výraz, který je vyhodnocen a uložen do proměnné „user_input“. S hlediska Pythonu bych měl správně říct, že „user_input“ odkazuje na hodnotu. Takže žekněme, že uživatel zadá „3“. Proměnná „user_input“... Proměnná „user_input“ teď bude globální. „factorial“ odkazuje na funkci, „user_input“ odkazuje na to, co zadal uživatel. V našem konkrétním případě to bude „3“. A pak se dostaneme k dalšímu řádku, kde je požadováno, aby proměnná „factorial<u>of</u>user_input“ odkazovala na hodnotu, kterou dostaneme zavoláním funkce „factorial“ s parametrem „user_input“. Faktoriál téhle proměnné. A tohle je zajímavý okamžik. V tomhle bodě v programu, kde je „factorial“ s parametrem „user_input“ se zavolá funkce a předá se jí hodnota, která je v „user_input“. Teď je to „3“, takže funkci „factorial“ se předá „3“. „3“ se předává zde. A v rozsahu této funkce... (řekněme, že tohle je rozsah naší funkce) v rozsahu naší funkce... trochu to ujasním... v rozsahu naší funkce a jejího těla proměnná „number“ odkazuje na „3“. Tady musím být trochu opatrný, protože se začínám dotýkat tématu rozsahu platnosti proměnné. Proměnná „number“ je platným odkazem pouze v těle funkce, ve které ji používám. Není k dispozici mimo funkci, takže když třeba zde napíšu „print number“, způsobím chybu, protože jsem mimo rozsah platnosti této proměnné. Funkce je oblast platnosti pro tuto proměnnou, která je dostupná jen uvnitř této funkce. Rozsah platnosti proměnné je jen uvnitř této funkce. Takže dostaneme číslo a provede se kód, který jsme probírali dříve, a který nastaví proměnnou „product“, která nyní odkazuje na číslo „1“. Pak se provede tento kód... Když už mluvíme o rozsahu platnosti, zde je další příklad. Proměnná „i“ je dostupná pouze v rozsahu tohoto „for“ cyklu. Pokud třeba tady napíšu „return i“, způsobím chybu. Můžeme se na ní odkázat jen uvnitř tohoto „for“ cyklu. Takovýto kód jsme probírali už mnohokrát. Provádí se pro „i“ rovno 0, 1, 2, ... až po „i“ rovno méně než „number“, ale pokaždé přičteme jedničku. ...tenhle výraz... Začneme jedničkou, pak máme 2, 3 atd. až máme „number“ a pokaždé tím vynásobíme původní „product“, abychom dostali nový „product“. Takže nakonec, poté, co jsme prošli celým for cyklem, „product“ bude obsahovat faktoriál čísla „number“. V průběhu bude „product“ odkazovat na různá čísla. Bude odkazovat na 1, pak na 2, pak 6, protože násobíme 2x3, a nakonec bude „product“ odkazovat na „6“. A to bude také vráceno. „Vráceno“ znamená, že když se vyhodnotí tenhle kód, tak bude roven 6. Při opuštění tohoto kódu je interpreter vyrozuměn, že „factorial<u>of</u>user_input“ odkazuje na hodnotu 6. Chápu, že tyhle schémata mohou být matoucí, ale rád bych, abyste opravdu porozuměli tomu, co se zde odehrává. „user_input“ odkazuje na nějakou hodnotu, kterou předáme programu „factorial“, tím pádem přeskočíme sem nahoru, a uvnitř programu „factorial“, kterému jsme předali „user_input“ a „user_input“ je rovno 3, proměnná „number“ bude odkazovat na „3“ i uvnitř tohoto úseku. Potom se vrátí proměnná „product“, která bude obsahovat faktoriál z „number“, takže celý tenhle kus se vyhodnotí jako faktoriál čehokoliv, co bylo zde. Což je faktoriál z 3. Takže proměnná „factorial<u>of</u>user_input“ bude na toto odkazovat, protože tak byla přiřazena a při výpisu to uvidíme. To se skutečně ukáže v našem interpreteru. Doufám, že jsem vás příliš nezmátl. V příštím videu si popovídáme o tom, co zajímavého se dá s naší funkcí udělat.
video