Pamatuješ na funkce len()
a print()
?
Jsou jako kouzelná zaříkadla z knihy vázané v kůži: když víš jak se jmenují
a umíš je správně napsat, něco pro tebe udělají.
Teď postoupíme na další úroveň: vymyslíme si vlastní zaříkadla! Jak? Budeme kombinovat příkazy, které už známe.
Třeba funkce, která tě pozdraví, by měla:
Definice funkce v Pythonu začíná klíčovým slovem def
,
dále je uveden název a následují závorky (zatím prázdné).
Pak je jako po if
dvojtečka – a odsazené příkazy,
které má funkce provést.
def pozdrav():
print('Ahoj!')
print('Jak se máš?')
Naše první funkce je připravena!
Když ale tenhle program spustíš, nic neudělá. To proto, že tohle je jen definice funkce. Python teď ví jak pozdravit – ale neřeklo se, že to má udělat!
Na konec programu přidej volání. To už není součást funkce, ale pokračování samotného programu. Proto nesmí být odsazené:
def pozdrav():
print('Ahoj!')
print('Jak se máš?')
pozdrav()
Co se stane, když funkci zavoláš několikrát po sobě?
def pozdrav():
print('Ahoj!')
print('Jak se máš?')
pozdrav()
pozdrav()
pozdrav()
Co se stane, když volání dáš nad definici funkce, místo na konec programu?
pozdrav()
def pozdrav():
print('Ahoj!')
print('Jak se máš?')
Tvoje funkce se dá volat jen jako pozdrav()
.
Funkce ale jako len('slovo')
a print(1 + 2)
umí navíc pracovat s hodnotou.
Poďme napisať funkciu, ktorá ťa pozdraví menom. (Uľahčíme si to použitím jazyka, ktorý nepoužíva piaty pád.)
def pozdrav(meno):
print('Vitam ťa,', meno)
pozdrav('Ola')
pozdrav('Soňa')
pozdrav('Hubert')
pozdrav('Anička')
Jak to funguje? V definici funkce uvedeš závorkách parametr – jméno proměnné se kterou bude funkce pracovat. Hodnotu pro tenhle parametr pak zadáš při volání funkce.
Zvládneš napsat program, který se zeptá na jméno a pak tě pozdraví?
Co se stane, když funkci zavoláš bez hodnoty pro parametr?
Funkce může obsahovat jakýkoli kód.
Třeba podmíněný příkaz, if
.
Příkazy po if
je pak potřeba odsatit o další čtyři mezery:
def pozdrav(meno):
print('Vitam ťa,', meno)
if meno == 'Ola':
print('Ty umíš programovať!')
pozdrav('Hubert')
pozdrav('Ola')
pozdrav('Soňa')
Další věc, kterou funkce jako len
umí, je vrátit výsledek:
delka = len('Ola')
print(delka) # napíše: 3
Jak na to?
Ve funkci můžeš použít příkaz return
, který funkci okamžitě ukončí
a vrátí danou hodnotu:
def dvojnasobek(x):
return x * 2
print(dvojnasobek(42))
Zkus se zamyslet, jak napsat funkci, která pátý pád nějakého jména. Třeba:
paty_pad('Ola')
→ 'Olo'paty_pad('Soňa')
→ 'Soňo'paty_pad('Hubert')
→ 'Huberte'Tohle je velice složitý úkol, tak si ho trochu zjednodušíme. Funkce by měla dělat tohle:
Huberte
a
:o
místo posledního písmenkadef paty_pad(jmeno):
if jmeno == 'Hubert':
return 'Huberte'
elif jmeno[-1] == 'a':
return jmeno[:-1] + 'o'
else:
return jmeno
Dokážeš změnit funkci pozdrav
, aby zdravila v češtině?
Co bylo nového tentokrát?
return
ukončí funkci a vrátí hodnotu{ "data": { "sessionMaterial": { "id": "session-material:2019/brno-podzim-snake:intro:11", "title": "VlastnĂ funkce", "html": "\n \n \n\n <h1>Vlastní funkce</h1>\n<p>Pamatuješ na funkce <code>len()</code> a <code>print()</code>?\nJsou jako kouzelná zaříkadla z knihy vázané v kůži: když víš jak se jmenují\na umíš je správně napsat, něco pro tebe udělají.</p>\n<p>Teď postoupíme na další úroveň: vymyslíme si vlastní zaříkadla!\nJak? Budeme kombinovat příkazy, které už známe.</p>\n<p>Třeba funkce, která tě pozdraví, by měla:</p>\n<ul>\n<li>Vypsat „ahoj!“</li>\n<li>Vypsat „jak se máš?“</li>\n</ul>\n<p>Definice funkce v Pythonu začíná klíčovým slovem <code>def</code>,\ndále je uveden název a následují závorky (zatím prázdné).\nPak je jako po <code>if</code> dvojtečka – a odsazené příkazy,\nkteré má funkce provést.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">pozdrav</span><span class=\"p\">():</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Ahoj!'</span><span class=\"p\">)</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Jak se máš?'</span><span class=\"p\">)</span>\n</pre></div><p>Naše první funkce je připravena!</p>\n<p>Když ale tenhle program spustíš, nic neudělá.\nTo proto, že tohle je jen <em>definice</em> funkce.\nPython teď ví jak pozdravit – ale neřeklo se, že to má udělat!</p>\n<p>Na konec programu přidej volání.\nTo už není součást funkce, ale pokračování samotného programu.\nProto nesmí být odsazené:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">pozdrav</span><span class=\"p\">():</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Ahoj!'</span><span class=\"p\">)</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Jak se máš?'</span><span class=\"p\">)</span>\n\n<span class=\"n\">pozdrav</span><span class=\"p\">()</span>\n</pre></div><p>Co se stane, když funkci zavoláš několikrát po sobě?</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">pozdrav</span><span class=\"p\">():</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Ahoj!'</span><span class=\"p\">)</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Jak se máš?'</span><span class=\"p\">)</span>\n\n<span class=\"n\">pozdrav</span><span class=\"p\">()</span>\n<span class=\"n\">pozdrav</span><span class=\"p\">()</span>\n<span class=\"n\">pozdrav</span><span class=\"p\">()</span>\n</pre></div><p>Co se stane, když volání dáš <em>nad</em> definici funkce, místo na konec programu?</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">pozdrav</span><span class=\"p\">()</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">pozdrav</span><span class=\"p\">():</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Ahoj!'</span><span class=\"p\">)</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Jak se máš?'</span><span class=\"p\">)</span>\n</pre></div><div class=\"solution\" id=\"solution-0\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-podzim-snake/fast-track/def/index/solutions/0/\"><span class=\"link-text\">Ukázat řešení</span></a>\n </div>\n <div class=\"solution-body\" aria-hidden=\"true\">\n <div class=\"highlight\"><pre><span></span><span class=\"gt\">Traceback (most recent call last):</span>\n File <span class=\"nb\">"<stdin>"</span>, line <span class=\"m\">1</span>, in <span class=\"n\"><module></span>\n<span class=\"gr\">NameError</span>: <span class=\"n\">name 'pozdrav' is not defined</span>\n</pre></div><p>Python si stěžuje na <code>NameError</code> – nezná nic jménem <code>pozdrav</code>.</p>\n<p>Python totiž program čte odzhora dolů.\nAž příkazem <code>def</code> se „naučí" jak zdravit.\nPředtím, než se k příkazu <code>def</code> dostane, funkce neexistuje.</p>\n </div>\n</div><h2>Parametry</h2>\n<p>Tvoje funkce se dá volat jen jako <code>pozdrav()</code>.\nFunkce ale jako <code>len('slovo')</code> a <code>print(1 + 2)</code> umí navíc pracovat s hodnotou.</p>\n<p>Poďme napisať funkciu, ktorá ťa pozdraví menom.\n(Uľahčíme si to použitím jazyka, ktorý nepoužíva piaty pád.)</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">pozdrav</span><span class=\"p\">(</span><span class=\"n\">meno</span><span class=\"p\">):</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Vitam ťa,'</span><span class=\"p\">,</span> <span class=\"n\">meno</span><span class=\"p\">)</span>\n\n<span class=\"n\">pozdrav</span><span class=\"p\">(</span><span class=\"s1\">'Ola'</span><span class=\"p\">)</span>\n<span class=\"n\">pozdrav</span><span class=\"p\">(</span><span class=\"s1\">'Soňa'</span><span class=\"p\">)</span>\n<span class=\"n\">pozdrav</span><span class=\"p\">(</span><span class=\"s1\">'Hubert'</span><span class=\"p\">)</span>\n<span class=\"n\">pozdrav</span><span class=\"p\">(</span><span class=\"s1\">'Anička'</span><span class=\"p\">)</span>\n</pre></div><p>Jak to funguje?\nV definici funkce uvedeš závorkách <em>parametr</em> – jméno proměnné se kterou bude\nfunkce pracovat.\nHodnotu pro tenhle parametr pak zadáš při volání funkce.</p>\n<p>Zvládneš napsat program, který se zeptá na jméno a pak tě pozdraví?</p>\n<div class=\"solution\" id=\"solution-1\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-podzim-snake/fast-track/def/index/solutions/1/\"><span class=\"link-text\">Ukázat řešení</span></a>\n </div>\n <div class=\"solution-body\" aria-hidden=\"true\">\n <div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">pozdrav</span><span class=\"p\">(</span><span class=\"n\">meno</span><span class=\"p\">):</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Vitam ťa,'</span><span class=\"p\">,</span> <span class=\"n\">meno</span><span class=\"p\">)</span>\n\n<span class=\"n\">pozdrav</span><span class=\"p\">(</span><span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">'Jak se jmenuješ? '</span><span class=\"p\">))</span>\n</pre></div>\n </div>\n</div><p>Co se stane, když funkci zavoláš bez hodnoty pro parametr?</p>\n<div class=\"solution\" id=\"solution-2\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-podzim-snake/fast-track/def/index/solutions/2/\"><span class=\"link-text\">Ukázat řešení</span></a>\n </div>\n <div class=\"solution-body\" aria-hidden=\"true\">\n <div class=\"highlight\"><pre><span></span><span class=\"gt\">Traceback (most recent call last):</span>\n File <span class=\"nb\">"<stdin>"</span>, line <span class=\"m\">9</span>, in <span class=\"n\"><module></span>\n<span class=\"gr\">TypeError</span>: <span class=\"n\">pozdrav() missing 1 required positional argument: 'meno'</span>\n</pre></div><p>Python si stěžuje na <code>TypeError</code> – funkce <code>pozdrav</code> nedostala povinný\nargument <code>meno</code>.</p>\n </div>\n</div><p>Funkce může obsahovat jakýkoli kód.\nTřeba podmíněný příkaz, <code>if</code>.\nPříkazy po <code>if</code> je pak potřeba odsatit o <em>další</em> čtyři mezery:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">pozdrav</span><span class=\"p\">(</span><span class=\"n\">meno</span><span class=\"p\">):</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Vitam ťa,'</span><span class=\"p\">,</span> <span class=\"n\">meno</span><span class=\"p\">)</span>\n <span class=\"k\">if</span> <span class=\"n\">meno</span> <span class=\"o\">==</span> <span class=\"s1\">'Ola'</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Ty umíš programovať!'</span><span class=\"p\">)</span>\n\n<span class=\"n\">pozdrav</span><span class=\"p\">(</span><span class=\"s1\">'Hubert'</span><span class=\"p\">)</span>\n<span class=\"n\">pozdrav</span><span class=\"p\">(</span><span class=\"s1\">'Ola'</span><span class=\"p\">)</span>\n<span class=\"n\">pozdrav</span><span class=\"p\">(</span><span class=\"s1\">'Soňa'</span><span class=\"p\">)</span>\n</pre></div><h2>Vracení</h2>\n<p>Další věc, kterou funkce jako <code>len</code> umí, je <em>vrátit</em> výsledek:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">delka</span> <span class=\"o\">=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"s1\">'Ola'</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">delka</span><span class=\"p\">)</span> <span class=\"c1\"># napíše: 3</span>\n</pre></div><p>Jak na to?\nVe funkci můžeš použít příkaz <code>return</code>, který funkci okamžitě ukončí\na vrátí danou hodnotu:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">dvojnasobek</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">):</span>\n <span class=\"k\">return</span> <span class=\"n\">x</span> <span class=\"o\">*</span> <span class=\"mi\">2</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">dvojnasobek</span><span class=\"p\">(</span><span class=\"mi\">42</span><span class=\"p\">))</span>\n</pre></div><p>Zkus se zamyslet, jak napsat funkci, která pátý pád nějakého jména. Třeba:</p>\n<ul>\n<li><code>paty_pad('Ola')</code> → 'Olo'</li>\n<li><code>paty_pad('Soňa')</code> → 'Soňo'</li>\n<li><code>paty_pad('Hubert')</code> → 'Huberte'</li>\n</ul>\n<p>Tohle je velice složitý úkol, tak si ho trochu zjednodušíme.\nFunkce by měla dělat tohle:</p>\n<ul>\n<li>Pokud jméno je „Hubert“:<ul>\n<li>vrátí <code>Huberte</code></li>\n</ul>\n</li>\n<li>Pokud jméno končí na <code>a</code>:<ul>\n<li>vrátí jméno s <code>o</code> místo posledního písmenka</li>\n</ul>\n</li>\n<li>Jinak:<ul>\n<li>Vrátí původní jméno. (Uživatel si toho snad nevšimne.)</li>\n</ul>\n</li>\n</ul>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">paty_pad</span><span class=\"p\">(</span><span class=\"n\">jmeno</span><span class=\"p\">):</span>\n <span class=\"k\">if</span> <span class=\"n\">jmeno</span> <span class=\"o\">==</span> <span class=\"s1\">'Hubert'</span><span class=\"p\">:</span>\n <span class=\"k\">return</span> <span class=\"s1\">'Huberte'</span>\n <span class=\"k\">elif</span> <span class=\"n\">jmeno</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"s1\">'a'</span><span class=\"p\">:</span>\n <span class=\"k\">return</span> <span class=\"n\">jmeno</span><span class=\"p\">[:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"s1\">'o'</span>\n <span class=\"k\">else</span><span class=\"p\">:</span>\n <span class=\"k\">return</span> <span class=\"n\">jmeno</span>\n</pre></div><p>Dokážeš změnit funkci <code>pozdrav</code>, aby zdravila v češtině?</p>\n<div class=\"solution\" id=\"solution-3\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-podzim-snake/fast-track/def/index/solutions/3/\"><span class=\"link-text\">Ukázat řešení</span></a>\n </div>\n <div class=\"solution-body\" aria-hidden=\"true\">\n <div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">pozdrav</span><span class=\"p\">(</span><span class=\"n\">jmeno</span><span class=\"p\">):</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Vítam tě,'</span><span class=\"p\">,</span> <span class=\"n\">paty_pad</span><span class=\"p\">(</span><span class=\"n\">jmeno</span><span class=\"p\">))</span>\n\n<span class=\"n\">pozdrav</span><span class=\"p\">(</span><span class=\"s1\">'Hubert'</span><span class=\"p\">)</span>\n<span class=\"n\">pozdrav</span><span class=\"p\">(</span><span class=\"s1\">'Ola'</span><span class=\"p\">)</span>\n<span class=\"n\">pozdrav</span><span class=\"p\">(</span><span class=\"s1\">'Soňa'</span><span class=\"p\">)</span>\n</pre></div>\n </div>\n</div><h2>Shrnutí</h2>\n<p>Co bylo nového tentokrát?</p>\n<ul>\n<li><strong>Funkce</strong> umožňuje pojmenovat nějkolik příkazů, a pak je zavolat najednou.</li>\n<li><strong>Parametry</strong> funkce, hodnoty se kterými funkce pracuje,\nse zadávají v závorkách.</li>\n<li><code>return</code> ukončí funkci a vrátí hodnotu</li>\n</ul>\n\n\n " } } }