Programování v Pythonu
Programování v Pythonu (11/21) · 10:06

Definování funkce faktoriálu Definování funkce faktoriálu

V minulém videu jsme si tady napsali hezký malý program, který vyžadoval číselný vstup od uživatele a potom vypočítal faktoriál tohoto čísla a nakonec ho vypsal. A to je krásné, ale můžete si představit svět, kde byste chtěli vypočítat faktoriál na několika místech nebo v několika různých programech nebo byste ve stejném programu chtěli vypočítat faktoriál několikrát. A nemůžete psát tento kód znovu a znovu, abyste vypočítali faktoriál. Takže co chci dělat v tomto videu je to, že definuji funkci, která vypočítá faktoriál a potom tuto funkci budeme moc použít pokaždé, když budeme chtít faktoriál vypočítat. Co tahle funkce v podstatě bude dělat je to, že v podstatě dá tento kód, dá tento kód přímo zde, na jedno místo a potom další program, po kterém budu chtít vypočítat faktoriál, prostě zavolá tento kód. Nebudu to přepisovat. Tak vám ukážu, o čem mluvím. Jdu definovat funkci a klíčové slovo v Pythonu, takže toto je druh speciálního slova, které říká interpretu, že je tady něco speciálního, co se stane. Klíčové slovo v Pythonu pro definování funkce je "def". Takže jdu definovat funkci, jdu zavolat funkci faktoriálu. A to směřuje k dobrému nápadu - pojmenovávat věci tak, aby jejich názvy napovídaly, co skutečně dělají. Někteří začínající programátoři mají zvyk pojmenovávat věci například "x245" a někdo, kdo přijde později, potom nemá ponětí, o čem tato proměnná nebo funkce vlastně je. Takže je určitě lepší ji pojmenovat tak, abychom mohli předpokládat, co asi bude dělat. Moje funkce se jmenuje faktoriál a uživatelé, když zavolají faktoriál, potřebují říci číslo, ze kterého se faktoriál vypočítá. A tak jej vloží do argumentu, který se jmenuj "číslo". A přestože jsou tato slova trochu matoucí, za chvíli je detailně vysvětlím, a můžete doufat, že až je uvidíte po několikáté, budou vám již povědomé. A tak napíšou číslo a já se musím vrátit zpět, abych zavolala program a vlastně jsem neměl říkat, že uživatel zadá číslo. Volací program zadá číslo a já potřebuji vrátit faktoriál tohoto čísla, abych zavolal program. Tak to napíšu dolů jako komentář. Takže vrátit faktoriál argumentu "číslo". A někdy můžete slyšet slovo parametr a někdy zase slovo argument. Když děláte definici funkce, je více formální nazývat to parametr. "Číslo" je jedno z parametrů funkce faktoriál. Aktuální číslo do něj někdo vložil, říkáme tak, že někdo zavolal faktoriál s "3" tady, to je formálnější než kdyby 3 byla argumentem. Takže vrátí faktoriál argumentu "číslo". A toto přímo zde je argument "číslo". Nemyslím, že je to jako libovolné slovo číslo, mluvím o tom číslu přímo zde. Možná řeknu argument "číslo". Možná to dám do uvozovek, aby bylo jasnější, že toto je argument. Nemluvím o žádném obecném čísle. Tak ho definujme. V podstatě použijeme ten stejný kód, takže ho jen zkopíruji a vložím, zkopíruji a vložím to, co jsem vzal tady. Takže to odsud vyjmu a tady to vložím. Ale musím být opatrný u odsazení, protože odsazení je způsob, jak Python ví, která část k čemu patří, ví, jak ji má interpretovat. Takže všechno v definici této funkce musí být odsazeno a uděláme to čtyřmi mezerami. Jeden, dva, tři, čtyři. A další čtyři. Jeden, dva, tři, čtyři. A další část cyklu for. Jeden, dva, tři, čtyři. A pojďme popřemýšlet o tom, co zatím máme. Vloží to nějaké číslo, definujeme proměnnou "produkt", která se rovná 1. A budeme více mluvit o pravidlech definování proměnných, ale tato proměnná může být použita pouze v definici tohoto faktoriálu, protože poprvé, když jsem ji definoval, byla venku - přímo zde. Takže potzději se více dostaneme k pravidlům definování proměnných. A teď se stejnou logikou, jako jsme to dělali předtím, "for i in range(number)". Teď nedostáváme číslo s použitím funkce input (vložit), číslo je pouze vloženo do funkce, potom se "produkt" rovná "produkt" x("i" + 1). Ta stejná logika, jakou jsme dělali předtím. Potom půjdete přímo do tohoto cyklu for, a až ho přejdete, v podstatě přes něj půjdete ještě "číslo" krát. "Produkt" v něm bude obsahovat faktoriál "čísla". A namísto toho, aby se přímo vypsalo, vrátí se, vrátíme se do volacího programu a v dalším videu udělám diagram, aby to bylo jasnější a méně matoucí pro vás. Jdu vrátit produkt. Je to v podstatě přesně stejný kód, jaký jsme měli předtím, ale zabalil jsem ho dovnitř funkce, definovali jsme funkci. Je vložen v ní, má parametr, který se jmenuje "číslo", když chcete faktoriál čísla 3, vyzkoušejte faktoriál 3 a 3 bude argument, bude to hodnota, která bude vložena na místě proměnné "číslo" nebo hodnota, na kterou "číslo" odkazuje. Definovali jsme, že se "produkt" rovná 1 a potom půjdeme "číslo" krát. Takže "for i in range(number)", logiku tohoto jsme si vysvětlili v předchozím videu. Pokaždé, když začnete s 1, dostanete 1 x 1 a to se rovná 1, potom se bude "produkt" rovnat 1, ale potom se "i" bude rovnat 1. "i" začíná na nule, takže to bude 1 x (0 + 1) a to nám dá 1, potom "i" bude 2, takže to bude 1 x 1, promiňte, potom bude "i" 1. To bude 1 x (1 + 1), což je 1 x 2, a to je 2, potom a tímto způsobem se bude provádět inkremetace, detailně jsme si to vysvětlili v minulém videu. A nakonec to vrátí tento "produkt". Takže chceme, aby se program choval úplně stejně jako předtím, ale teď používáme tuto funkci. Co bychom měli udělat je, že bychom měli říci, stále máme vstup, takže toto je definice naší funkce, ale podle našeho hlavního programu jsme definovali funkci a teď bychom měli říci: "Podívej, od uživatele jsme nedostali žádné negativní číslo, abychom z něj vypočítali faktoriál." A dejme to do proměnné, kterou pojmenujme "user_input". A potom to, co udělám, je, že definuji další proměnnou, kterou pojmenuji "factorial<u>of</u>user_input" a teď to bude zajímavé. Tady tu funkci zavolám, takže se to bude rovnat faktoriálu čehokoliv, co uživatel vloží. Takže faktoriál "user_input", faktoriál této proměnné přímo zde. Faktoriál uživatelského vstupu. Takže teď "factorial<u>of</u>user_input" bude uchovávat, hádám, že bychom měli říci, že bude ukazovat aktuální odpověď a teď bychom ji měli vypsat. Takže teď můžeme vypsat "factoriaů<u>of</u>user_input". Vypadají jako věty, ale jsou to pouze názvy proměnných, které jsem tímto způsobem pojmenoval, abyste věděli, co je uvnitř těchto proměnných nebo na co každá proměnná opravdu ukazuje. Takže "factorial<u>of</u>user_input". Teď přijde moment pravdy, kdy pokaždé ukládám program a potom se ho pokouším spouštět. Takže vyzkoušejme jeho běh právě teď a sledujme, co se stane. Sledujme, co se zde stane. Tak zatím se nic nevypsalo, takže znovu, jsem si jistý, že program tady začne, ale vše, co ve všem, co jsme definovali, jsme ještě nevytvořili žádnou interakci s uživatelem takže to opravdu ještě fungovat nemůže. Pouze jsme definovali tuto funkci, která řekne: "Ok, dej mi nějaký vklad od uživatele" a to je to, co tady děláme. Po tom, co jsem vložíme nějaké číslo, to zavolá tuto funkci s číslem, které jsme vložili a číslo, které jsme vložili, se vloží do proměnné "user_input" a potom zavolá faktoriál s proměnnou "user_input" jako argumentem. Tak to pojďme vyzkoušet s číslem 3. A nefunguje to! Oh, už vidím, proč to nefunguje. Protože tady je tento pozůstatek z předchozího programu, který tady nemá žádný smysl. Dovolte mi tedy se ho zbavit. To je skvělá hodina, kdy se mi poprvé nepodařilo udělat něco, co perfektně funguje. Tak mě to nechte zkusit znovu! To byl prostě nesmysl, že jsem si ani neuvědomil, co je tam dole. Takže mě to nechte zkusit znovu. Tak znovu 3. A dá mi to správnou odpověď. Dá mi to faktoriál čísla 3 a to je fajn, protože teď interpret mého Pythonu předpokládá, že tato definice byla vytvořena. Teď můžu zavolat faktoriál přímo z interpretu, když mám další program, mohu ho zavolat několika způsoby a teď byste snad měli ocenit, proč je to, co jsme udělali v definici této funkce, tak fajn. Protože můžeme počítat, z toho důvodu, že jsem definoval tuto funkci faktoriálu, mohu vypočítat faktoriál čísla 4. Je to 24. Mohu říci, že faktoriál 5 - faktoriál 3. 114. Můžu získat faktoriál 12 a můžete říct počítači, dokonce přestože tohle všechno je pouze interpret, budeme si o interpretu a kompilování kódu povídat více, je to neuvěřitelné rychlé. Rychlejší, než jsme schopni pochopit. Takže toto je ta pravá síla funkcí, je to to, že nemusím pokaždé přepisovat kód, pouze ho mohu volat s rozdílnými argumenty. Takže faktoriál 2, mohu to dělat pořád, nemusím vracet program. A když píšu další programy, které používají faktoriál, možná to mohu kombinovat, mohu pouze použít toto jako funkci, ve skutečnosti ani nevím, co se děje uvnitř funkce. Jeden z těch dalších mocných aspektů funkcí je, že řekněme mohu napsat hromady programů jako je tento, takže mám tady tento program, který volá faktoriál. Ale řekněme, že můžete přijít s lepším způsobem toho, jak to napsat. Po veškerý čas, kdy bude váš program dělat stejné věci ale s jiným kóde uvnitř koncový uživatel nic nezpozoruje. Možná napíšete rychlejší nebo jednoduší způsob toho, jak toto udělat. Způsob, který využívá méně paměti nebo méně energie procesoru. Později to tedy budete moci nahradit a potom program, který to volá, během doby, kdy bude stále pracovat, bude pracovat lépe. Bude pracovat lépe než toto.
video