Funkce

Známe spoustu matematických operací, které se zapisují symboly – třeba plus a minus. Python se snaží používat stejné symboly jako matematici:

  • 3 + 4
  • a - b

S násobením a dělením už je to složitější, matematický zápis se na běžné klávesnici nedá napsat:

  • 3 · 4
  • ¾

V Pythonu si ale pořád vystačíme se symbolem, byť trochu jiným – *, /.

Matematici ale píšou na papír, a tak si můžou dovolit vymýšlet stále zajímavější klikyháky, které se pak na klávesnici píšou dost špatně:

  • x²
  • xy
  • sin θ
  • Γ(x)
  • x
  • |s|
  • x
  • ab
  • ab

Ne že by neexistovaly programovací jazyky, na které je potřeba speciální klávesnice. Třeba program v jazyce APL laik jednoduše ani nenapíše, ani nepřečte:

⍎’⎕’,∈Nρ⊂S←’←⎕←(3=T)∨M∧2=T←⊃+/(V⌽”⊂M),(V⊖”⊂M),(V,⌽V)⌽”(V,V←1¯1)⊖”⊂M’

Expert v APL může být vysoce produktivní, ale Python se zaměřuje spíš na to, aby se dal snadno naučit. A tak používá symboly jen pro ty nejčastější operace. Je jich dokonce tak málo, že už jich zhruba půlku znáš!

Pro zajímavost, tady jsou všechny operátory v Pythonu, které používají symboly:

== != < > <= >= | ^ & << >> + - * @ / // % ~ ** [ ] ( ) { } .

Všechno ostatní vyjádříme slovně.

Délka řetězce

Jedna operace, na kterou v Pythonu není symbol, je zjištění délky řetězce.

Matematik by něco takového napsal třeba pomocí svislých čárek (s poznámkou, co přesně ty čárky reprezentují):

  • s = “Ahoj!”
  • delka = |s|

V Pythonu má operace „délka řetězce“ místo symolu název. Jmenuje se len (z angl. length, délka), a píše se len(s):

s = 'Ahoj'
delka = len(s)      # Vypočítání délky
print(delka)

Ono len(s) výraz – operace, která něco udělá podle hodnoty s a výsledek dá k dispozici. Funguje podobně jako jiné výrazy – třeba a + b, což je operace, která něco udělá podle hodnot a a b a výsledek dá k dispozici. V první případě je výsledkem délka; ve druhém součet.

To len je funkce a zápisu len(s) se říká volání funkce. Pojďme se si je popsat trochu zevrubněji.

Pro matematičky

Máš-li ráda matematiku, dej pozor! Funkce v Pythonu je něco jiného než funkce v matematice, i když se stejně jmenují a podobně zapisují. Pythonní funkce může např. dávat pro jeden argument různé hodnoty.

Volání funkcí

Funkci voláme jménem, například len.

Je to jméno jako u proměnných. (Vlastně to je proměnná, jen místo čísla nebo řetězce označuje funkci.)

Za jméno funkce patří závorky, do nichž uzavřeme argument (neboli vstup) funkce. To je informace, se kterou bude naše funkce pracovat – třeba len ze svého argumentu vypočítá délku.

Volání funkce je výraz a jeho výsledek, takzvaná návratová hodnota (angl. return value) se dá třeba přiřadit do proměnné.

#   jméno funkce
#       │
#      ╭┴╮
   x = len('Ahoj!')
#  ▲       ╰──┬──╯
#  │     argument
#  │
#  ╰── návratová hodnota

Nebo se volání funkce dá použít místo čísla v součtu:

delka = len('Ahoj') + len('!')

Nebo v podmínce ifu:

if len('Ahoj!') < 3:

Nebo dokonce jako argument jiné funkce:

print(len('Ahoj'))

Nebo to zkombinovat dohromady:

print(len('Ahoj') + 1)

… a podobně.

Funkce a procedury

Možná sis všimla, že příkaz print(x) vypadá podobně jako volání funkce. To není vůbec náhoda – print je totiž taky funkce! Stejně jako len dostává v závorkách argument – hodnotu, se kterou pracuje.

Na rozdíl od len ane print nic nevrací. Výsledek volání print('Ahoj') není žádná smysluplná hodnota. Místo vypočítání nějaké hodnoty print něco udělá – vypíše text na obrazovku.

Funkcím, které nic nevrací (jen něco udělají) se občas říká procedury. V Pythonu není hranice mezi „normální“ funkcí a procedurou příliš ostrá, ale přesto se hodí tento koncept znát. Pár příkladů:

  • Funkce, která vybere náhodné číslo, je „normální“. Svůj výsledek vrátí; program s ním může dál pracovat.
  • Funkce, která vykreslí na obrazovku kolečko, je procedura. Žádnou zajímavou hodnotu programu nevrací.
  • Funkce, která spočítá průměrný věk obyvatelstva podle informací ze sčítání lidu je „normální“. Svůj výsledek vrátí a program s ním může dál pracovat.
  • Funkce, která přehraje písničku reproduktorem, je procedura. Nic zajímavého programu nevrací.

Na rozdíl od ostatních termínů, které se tu učíš, není „procedura“ v Pythonu zavedený pojem. Je vypůjčený z jazyka Pascal. Kdybys o něm diskutovala s nějakým zkušeným programátorem, odkaž ho prosím na tyto materiály.

Argumenty

Argument je to, co funkci „předhodíš“ – dáš k dispozici. Chceš-li délku řetězce Ahoj!, použiješ funkci len která umí vypočítat délku jakéhokoli řetězce – a jako argument, v závorkách, jí dáš tu svoji konkrétní hodnotu: len('Ahoj!').

Podobně funkce print umí vypsat jakoukoli hodnotu. Tu, kterou má vypsat v tvém konkrétním případě, jí předáš jako argument.

Některým funkcím můžeš předat i více argumentů. Třeba zrovna funkci print, která všechny své argumenty vypíše na řádek. Jednotlivé argumenty se oddělují čárkami:

print(1, 2, 3)
print("Jedna plus dva je", 1 + 2)

Některé funkce nepotřebují žádný argument. Příkladem je zase print. Je ale nutné napsat závorky – i když jsou prázdné. Hádej, co tohle volání udělá?

print()

Řešení

Pojmenované argumenty

Některé funkce umí pracovat i s pojmenovanými argumenty. Píšou se podobně jako přiřazení do proměnné, s rovnítkem, ale uvnitř závorek.

Třeba funkce print normálně ukončí výpis novým řádkem, ale pomocí argumentu end se dá vypsat i něco jiného.

Tenhle příklad je potřeba napsat do souboru; v interaktivní konzoli nebude výstup vypadat, jak má.

print('1 + 2', end=' ')     # Místo přechodu na nový řádek jen napiš mezeru
print('=', end=' ')
print(1 + 2, end='!')
print()

Funkce je potřeba volat

Pozor na to, že když nenapíšeš závorky, funkce se nezavolá! Výraz len(s) je volání funkce, ale len bez závorek označuje funkci samotnou.

Výsledek len(s) je číslo; len je funkce.

Čísla můžeš sečítat, můžeš tedy napsat len(s) + 1. Funkce ale sečítat nejde – len + 1 nedává smysl.

Často se ale stane, že závorky prostě zapomeneš. Zkus si, co dělají následující příklady, a pozorně si přečti výsledky a chybové hlášky, abys pak podobné chyby poznala:

print(len('a'))     # Volání funkce (a vypsání výsledku)
print(len)          # Vypsání samotné funkce
print(len + 1)      # Sečtení funkce a čísla

Užitečné funkce

Nakonec si ukážeme pár základních funkcí, které nám Python nabízí. Můžeš si stáhnout i přehled, který se rozdává na srazech.

Vstup a výstup

Tyhle funkce už známe. print vypíše nepojmenované argumenty, oddělené mezerou. Pojmenovaný argument end určuje, co se vypíše na konci (místo přechodu na nový řádek); sep zase, co se vypíše mezi jednotlivými argumenty (místo mezery).

Příklad opět spusť ze souboru, ne interaktivně:

print(1, 'dvě', False)
print(1, end=' ')
print(2, 3, 4, sep=', ')

Základní funkce na načtení vstupu, input, vypíše otázku, počká na text od uživatele a ten vrátí jako řetězec.

input('zadej vstup: ')

Kontrolní otázky:

  • Je input „normální“ funkce, nebo procedura?
  • Co bere funkce input jako argument?
  • Jaká je návratová hodnota funkce input?

Řešení

Převádění typů

Co ale když nechceme pracovat s řetězcem, ale třeba s číslem? Tady nám pomůže skupina funkcí, které umí převádět čísla na řetězce a zpátky. Každý ze tří typů (angl. types) proměnných, které zatím známe, má funkci, která vezme nějakou hodnotu a vrátí podobnou hodnotu „svého“ typu. Na celá čísla je funkce int (z angl. integer), na reálná čísla je float (z angl. floating-point), a pro řetězce str (z angl. string).

int(x)              # převod na celé číslo
float(x)            # převod na reálné číslo
str(x)              # převod na řetězec

Příklady:

3 == int('3') == int(3.0) == int(3.141) == int(3)
8.12 == float('8.12') == float(8.12)
8.0 == float(8) == float('8') == float(8.0)
'3' == str(3) == str('3')
'3.141' == str(3.141) == str('3.141')

Ne všechny převody jsou možné:

int('blablabla')    # chyba!
float('blablabla')  # chyba!
int('8.9')          # chyba!

…a jak si poradit s chybou, která nastane, když použiješ špatnou hodnotu, si řekneme později.

Převádění a input

Převádění typů se často používá při načítání vstupu, třeba jako:

cislo = int(input('Zadej číslo: '))

Jak Python vyhodnotí tento výraz? Zadá-li uživatel 42, funkce input vrátí řetězec'42'. Ten pak funkce int vezme jako argument, udělá z něj číslo a to číslo vrátí:

cislo = int(input('Zadej číslo: '))
      #     ╰─────────┬─────────╯
cislo = int(        '42'          )
      # ╰────────────┬────────────╯
cislo =              42

Matematické funkce

Matematika je občas potřeba, takže se pojďme podívat, jak v Pythonu pracovat s čísly.

Jedna zajímavá matematická funkce je k dispozici vždy:

round(cislo)    # zaokrouhlení

Spousta dalších není k dispozici od začátku programu. Ne každý má rád matematiku, a ne ve všech druzích programu jsou takové operace potřeba. Proto musíme předem – typicky na začátku souboru – říct, že je budeme používat. To se dělá naimportováním z modulu math:

from math import sin, cos, tan, sqrt, floor, ceil

Naimportované funkce pak můžeš použít:

sin(uhel)       # sinus
cos(uhel)       # kosinus
tan(uhel)       # tangens
sqrt(cislo)     # druhá odmocnina

floor(cislo)    # zaokrouhlení dolů
ceil(cislo)     # zaokrouhlení nahoru

Import a pojmenování souborů

Při importování je potřeba si dávat pozor na pojmenování souborů: importuješ-li from math, nesmí se tvůj program jmenovat math.py.

Proč? Když Python v adresáři, ze kterého program pouštíš, najde soubor math.py, bude se snažit importovat sin z něho místo z předpřipravené sady matematických funkcí.

Náhoda

Nakonec si ukážeme dvě funkce, které vrací náhodná čísla: randrange a uniform. Jsou užitečné třeba pro hry, ve kterých se hází kostkou nebo tahají náhodné karty.

Opět nejsou potřeba tak často a je potřeba je naimportovat. Tentokrát z modulu random:

from random import randrange, uniform

Pak už se dají použít:

randrange(a, b)   # náhodné celé číslo od a do b-1
uniform(a, b)     # náhodné reálné číslo od a do b

Pozor na to, že randrange(a, b) nikdy nevrátí samotné b. Pokud potřebujeme náhodně vybrat ze tří možností, použij randrange(0, 3), což vrátí 0, 1, nebo 2:

from random import randrange

cislo = randrange(0, 3)  # číslo je od 0, 1, nebo 2
if cislo == 0:
    print('Kolečko')
elif cislo == 1:
    print('Čtvereček')
else:  # 2
    print('Trojúhelníček')

Pamatuj, když importuješ z modulu random, nesmí se tvůj soubor jmenovat random.py.

A další

Python dává k dispozici obrovské množství dalších funkcí a modulů, i když ne všem budeš ze začátku rozumět. Všechny jsou – anglicky – popsány v dokumentaci Pythonu, např. vestavěné funkce, matematika.

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2019/brno-jaro-2019-pondeli:cycles:0",
      "title": "Funkce",
      "html": "\n          \n    \n\n    <h1>Funkce</h1>\n<p>Zn&#xE1;me spoustu matematick&#xFD;ch operac&#xED;, kter&#xE9; se zapisuj&#xED; symboly &#x2013; t&#x159;eba plus\na&#xA0;minus.\nPython se sna&#x17E;&#xED; pou&#x17E;&#xED;vat stejn&#xE9; symboly jako matematici:</p>\n<ul>\n<li>3 + 4</li>\n<li><var>a</var> - <var>b</var></li>\n</ul>\n<p>S&#xA0;n&#xE1;soben&#xED;m a&#xA0;d&#x11B;len&#xED;m u&#x17E; je to slo&#x17E;it&#x11B;j&#x161;&#xED;,\nmatematick&#xFD; z&#xE1;pis se na b&#x11B;&#x17E;n&#xE9; kl&#xE1;vesnici ned&#xE1; napsat:</p>\n<ul>\n<li>3 &#xB7; 4</li>\n<li>&#xBE;</li>\n</ul>\n<p>V Pythonu si ale po&#x159;&#xE1;d vysta&#x10D;&#xED;me se symbolem, by&#x165; trochu jin&#xFD;m &#x2013; <code>*</code>, <code>/</code>.</p>\n<p>Matematici ale p&#xED;&#x161;ou na pap&#xED;r, a&#xA0;tak si m&#x16F;&#x17E;ou dovolit vym&#xFD;&#x161;let st&#xE1;le\nzaj&#xED;mav&#x11B;j&#x161;&#xED; klikyh&#xE1;ky, kter&#xE9; se pak na kl&#xE1;vesnici p&#xED;&#x161;ou dost &#x161;patn&#x11B;:</p>\n<ul>\n<li><var>x</var>&#xB2;</li>\n<li><var>x</var> &#x2264; <var>y</var></li>\n<li>sin &#x3B8;</li>\n<li>&#x393;(<var>x</var>)</li>\n<li>&#x222B;<var>x</var></li>\n<li>|<var>s</var>|</li>\n<li>&#x230A;<var>x</var>&#x230B;</li>\n<li><var>a</var> &#x2605; <var>b</var></li>\n<li><var>a</var> &#x2A01; <var>b</var></li>\n</ul>\n<p>Ne &#x17E;e by neexistovaly programovac&#xED; jazyky,\nna kter&#xE9; je pot&#x159;eba speci&#xE1;ln&#xED; kl&#xE1;vesnice.\nT&#x159;eba program v&#xA0;jazyce APL laik jednodu&#x161;e ani nenap&#xED;&#x161;e, ani nep&#x159;e&#x10D;te:</p>\n<p><!--z http://catpad.net/michael/apl/ --></p>\n<div class=\"highlight\"><pre><code>&#x234E;&#x2019;&#x2395;&#x2019;,&#x2208;N&#x3C1;&#x2282;S&#x2190;&#x2019;&#x2190;&#x2395;&#x2190;(3=T)&#x2228;M&#x2227;2=T&#x2190;&#x2283;+/(V&#x233D;&#x201D;&#x2282;M),(V&#x2296;&#x201D;&#x2282;M),(V,&#x233D;V)&#x233D;&#x201D;(V,V&#x2190;1&#xAF;1)&#x2296;&#x201D;&#x2282;M&#x2019;</code></pre></div><p>Expert v&#xA0;APL m&#x16F;&#x17E;e b&#xFD;t vysoce produktivn&#xED;, ale Python se zam&#x11B;&#x159;uje sp&#xED;&#x161; na to,\naby se dal snadno nau&#x10D;it.\nA tak pou&#x17E;&#xED;v&#xE1; symboly jen pro ty nej&#x10D;ast&#x11B;j&#x161;&#xED; operace.\nJe jich dokonce tak m&#xE1;lo, &#x17E;e u&#x17E; jich zhruba p&#x16F;lku zn&#xE1;&#x161;!</p>\n<div class=\"admonition note\"><p>Pro zaj&#xED;mavost, tady jsou v&#x161;echny oper&#xE1;tory v&#xA0;Pythonu, kter&#xE9; pou&#x17E;&#xED;vaj&#xED;\nsymboly:</p>\n<div>\n    <code>==</code> <code>!=</code>\n    <code>&lt;</code> <code>&gt;</code>\n    <code>&lt;=</code> <code>&gt;=</code>\n    <code class=\"text-muted\">|</code> <code class=\"text-muted\">^</code>\n    <code class=\"text-muted\">&amp;</code>\n    <code class=\"text-muted\">&lt;&lt;</code> <code class=\"text-muted\">&gt;&gt;</code>\n    <code>+</code> <code>-</code>\n    <code>*</code> <code class=\"text-muted\">@</code> <code>/</code>\n    <code>//</code> <code>%</code>\n    <code class=\"text-muted\">~</code>\n    <code>**</code>\n    <code class=\"text-muted\">[ ]</code> <code class=\"text-muted\">( )</code>\n    <code class=\"text-muted\">{ }</code>\n    <code class=\"text-muted\">.</code>\n</div></div><p>V&#x161;echno ostatn&#xED; vyj&#xE1;d&#x159;&#xED;me slovn&#x11B;.</p>\n<h2>D&#xE9;lka &#x159;et&#x11B;zce</h2>\n<p>Jedna operace, na kterou v&#xA0;Pythonu nen&#xED; symbol, je zji&#x161;t&#x11B;n&#xED; d&#xE9;lky &#x159;et&#x11B;zce.</p>\n<p>Matematik by n&#x11B;co takov&#xE9;ho napsal t&#x159;eba pomoc&#xED; svisl&#xFD;ch &#x10D;&#xE1;rek\n(s&#xA0;pozn&#xE1;mkou, co p&#x159;esn&#x11B; ty &#x10D;&#xE1;rky reprezentuj&#xED;):</p>\n<ul>\n<li><var>s</var> = &#x201C;Ahoj!&#x201D;</li>\n<li><var>delka</var> = |<var>s</var>|</li>\n</ul>\n<p>V&#xA0;Pythonu m&#xE1; operace &#x201E;d&#xE9;lka &#x159;et&#x11B;zce&#x201C; m&#xED;sto symolu n&#xE1;zev.\nJmenuje se <code>len</code> (z&#xA0;angl. <em>length</em>, d&#xE9;lka), a p&#xED;&#x161;e se <code>len(s)</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">s</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;Ahoj&apos;</span>\n<span class=\"n\">delka</span> <span class=\"o\">=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"p\">)</span>      <span class=\"c1\"># Vypo&#x10D;&#xED;t&#xE1;n&#xED; d&#xE9;lky</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">delka</span><span class=\"p\">)</span>\n</pre></div><p>Ono <code>len(s)</code> v&#xFD;raz &#x2013; operace, kter&#xE1; n&#x11B;co ud&#x11B;l&#xE1; podle hodnoty <code>s</code> a v&#xFD;sledek\nd&#xE1; k&#xA0;dispozici.\nFunguje podobn&#x11B; jako jin&#xE9; v&#xFD;razy &#x2013; t&#x159;eba <code>a + b</code>, co&#x17E; je operace, kter&#xE1; n&#x11B;co\nud&#x11B;l&#xE1; podle hodnot <code>a</code> a <code>b</code> a v&#xFD;sledek d&#xE1; k dispozici.\nV&#xA0;prvn&#xED; p&#x159;&#xED;pad&#x11B; je v&#xFD;sledkem d&#xE9;lka; ve druh&#xE9;m sou&#x10D;et.</p>\n<p>To <code>len</code> je <em>funkce</em> a z&#xE1;pisu <code>len(s)</code> se &#x159;&#xED;k&#xE1; <em>vol&#xE1;n&#xED; funkce</em>.\nPoj&#x10F;me se si je popsat trochu zevrubn&#x11B;ji.</p>\n<div class=\"admonition note\"><p class=\"admonition-title\">Pro matemati&#x10D;ky</p>\n<p>M&#xE1;&#x161;-li r&#xE1;da matematiku, dej pozor!\nFunkce v&#xA0;Pythonu je n&#x11B;co jin&#xE9;ho ne&#x17E; funkce v&#xA0;matematice,\ni kdy&#x17E; se stejn&#x11B; jmenuj&#xED; a podobn&#x11B; zapisuj&#xED;.\nPythonn&#xED; funkce m&#x16F;&#x17E;e nap&#x159;. d&#xE1;vat pro jeden argument r&#x16F;zn&#xE9; hodnoty.</p>\n</div><h2>Vol&#xE1;n&#xED; funkc&#xED;</h2>\n<p>Funkci vol&#xE1;me <em>jm&#xE9;nem</em>, nap&#x159;&#xED;klad <code>len</code>.</p>\n<p>Je to jm&#xE9;no jako u&#xA0;prom&#x11B;nn&#xFD;ch.\n(Vlastn&#x11B; to je prom&#x11B;nn&#xE1;, jen m&#xED;sto &#x10D;&#xED;sla nebo &#x159;et&#x11B;zce ozna&#x10D;uje funkci.)</p>\n<p>Za jm&#xE9;no funkce pat&#x159;&#xED; z&#xE1;vorky,\ndo nich&#x17E; uzav&#x159;eme <em>argument</em> (neboli <em>vstup</em>) funkce.\nTo je informace, se kterou bude na&#x161;e funkce\npracovat &#x2013; t&#x159;eba <code>len</code> ze sv&#xE9;ho argumentu vypo&#x10D;&#xED;t&#xE1; d&#xE9;lku.</p>\n<p>Vol&#xE1;n&#xED; funkce je v&#xFD;raz a&#xA0;jeho v&#xFD;sledek, takzvan&#xE1; <em>n&#xE1;vratov&#xE1;</em> hodnota\n(angl. <em>return value</em>) se d&#xE1; t&#x159;eba p&#x159;i&#x159;adit do prom&#x11B;nn&#xE9;.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"c1\">#   jm&#xE9;no funkce</span>\n<span class=\"c1\">#       &#x2502;</span>\n<span class=\"c1\">#      &#x256D;&#x2534;&#x256E;</span>\n   <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"s1\">&apos;Ahoj!&apos;</span><span class=\"p\">)</span>\n<span class=\"c1\">#  &#x25B2;       &#x2570;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x256F;</span>\n<span class=\"c1\">#  &#x2502;     argument</span>\n<span class=\"c1\">#  &#x2502;</span>\n<span class=\"c1\">#  &#x2570;&#x2500;&#x2500; n&#xE1;vratov&#xE1; hodnota</span>\n</pre></div><p>Nebo se vol&#xE1;n&#xED; funkce d&#xE1; pou&#x17E;&#xED;t m&#xED;sto &#x10D;&#xED;sla v&#xA0;sou&#x10D;tu:</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\">&apos;Ahoj&apos;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"s1\">&apos;!&apos;</span><span class=\"p\">)</span>\n</pre></div><p>Nebo v&#xA0;podm&#xED;nce ifu:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"s1\">&apos;Ahoj!&apos;</span><span class=\"p\">)</span> <span class=\"o\">&lt;</span> <span class=\"mi\">3</span><span class=\"p\">:</span>\n</pre></div><p>Nebo dokonce jako argument jin&#xE9; funkce:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"s1\">&apos;Ahoj&apos;</span><span class=\"p\">))</span>\n</pre></div><p>Nebo to zkombinovat dohromady:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"s1\">&apos;Ahoj&apos;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</pre></div><p>&#x2026; a&#xA0;podobn&#x11B;.</p>\n<h3>Funkce a procedury</h3>\n<p>Mo&#x17E;n&#xE1; sis v&#x161;imla, &#x17E;e p&#x159;&#xED;kaz <code>print(x)</code> vypad&#xE1; podobn&#x11B; jako vol&#xE1;n&#xED; funkce.\nTo nen&#xED; v&#x16F;bec n&#xE1;hoda &#x2013; <code>print</code> je toti&#x17E; taky funkce!\nStejn&#x11B; jako <code>len</code> dost&#xE1;v&#xE1; v&#xA0;z&#xE1;vork&#xE1;ch argument &#x2013; hodnotu, se kterou pracuje.</p>\n<p>Na rozd&#xED;l od <code>len</code> ane <code>print</code> nic nevrac&#xED;.\nV&#xFD;sledek vol&#xE1;n&#xED; <code>print(&apos;Ahoj&apos;)</code> nen&#xED; &#x17E;&#xE1;dn&#xE1; smyslupln&#xE1; hodnota.\nM&#xED;sto vypo&#x10D;&#xED;t&#xE1;n&#xED; n&#x11B;jak&#xE9; hodnoty <code>print</code> n&#x11B;co <em>ud&#x11B;l&#xE1;</em> &#x2013; vyp&#xED;&#x161;e text na obrazovku.</p>\n<p>Funkc&#xED;m, kter&#xE9; nic nevrac&#xED; (jen n&#x11B;co ud&#x11B;laj&#xED;) se ob&#x10D;as &#x159;&#xED;k&#xE1; <em>procedury</em>.\nV&#xA0;Pythonu nen&#xED; hranice mezi &#x201E;norm&#xE1;ln&#xED;&#x201C; funkc&#xED; a procedurou p&#x159;&#xED;li&#x161; ostr&#xE1;,\nale p&#x159;esto se hod&#xED; tento koncept zn&#xE1;t.\nP&#xE1;r p&#x159;&#xED;klad&#x16F;:</p>\n<ul>\n<li>Funkce, kter&#xE1; vybere n&#xE1;hodn&#xE9; &#x10D;&#xED;slo, je &#x201E;norm&#xE1;ln&#xED;&#x201C;.\nSv&#x16F;j v&#xFD;sledek vr&#xE1;t&#xED;; program s n&#xED;m m&#x16F;&#x17E;e d&#xE1;l pracovat.</li>\n<li>Funkce, kter&#xE1; vykresl&#xED; na obrazovku kole&#x10D;ko, je <em>procedura</em>.\n&#x17D;&#xE1;dnou zaj&#xED;mavou hodnotu programu nevrac&#xED;.</li>\n<li>Funkce, kter&#xE1; spo&#x10D;&#xED;t&#xE1; pr&#x16F;m&#x11B;rn&#xFD; v&#x11B;k obyvatelstva podle informac&#xED; ze s&#x10D;&#xED;t&#xE1;n&#xED;\nlidu je &#x201E;norm&#xE1;ln&#xED;&#x201C;. Sv&#x16F;j v&#xFD;sledek vr&#xE1;t&#xED; a program s n&#xED;m m&#x16F;&#x17E;e d&#xE1;l pracovat.</li>\n<li>Funkce, kter&#xE1; p&#x159;ehraje p&#xED;sni&#x10D;ku reproduktorem, je <em>procedura</em>.\nNic zaj&#xED;mav&#xE9;ho programu nevrac&#xED;.</li>\n</ul>\n<div class=\"admonition note\"><p>Na rozd&#xED;l od ostatn&#xED;ch term&#xED;n&#x16F;, kter&#xE9; se tu u&#x10D;&#xED;&#x161;, nen&#xED;\n&#x201E;procedura&#x201C; v&#xA0;Pythonu zaveden&#xFD; pojem.\nJe vyp&#x16F;j&#x10D;en&#xFD; z&#xA0;jazyka Pascal.\nKdybys o n&#x11B;m diskutovala s&#xA0;n&#x11B;jak&#xFD;m zku&#x161;en&#xFD;m program&#xE1;torem,\nodka&#x17E; ho pros&#xED;m na tyto materi&#xE1;ly.</p>\n</div><h3>Argumenty</h3>\n<p>Argument je to, co funkci &#x201E;p&#x159;edhod&#xED;&#x161;&#x201C; &#x2013; d&#xE1;&#x161; k&#xA0;dispozici.\nChce&#x161;-li d&#xE9;lku &#x159;et&#x11B;zce <code>Ahoj!</code>, pou&#x17E;ije&#x161; funkci <code>len</code> kter&#xE1; um&#xED; vypo&#x10D;&#xED;tat\nd&#xE9;lku <em>jak&#xE9;hokoli</em> &#x159;et&#x11B;zce &#x2013; a jako argument, v&#xA0;z&#xE1;vork&#xE1;ch, j&#xED; d&#xE1;&#x161; tu svoji\nkonkr&#xE9;tn&#xED; hodnotu: <code>len(&apos;Ahoj!&apos;)</code>.</p>\n<p>Podobn&#x11B; funkce <code>print</code> um&#xED; vypsat jakoukoli hodnotu.\nTu, kterou m&#xE1; vypsat v&#xA0;tv&#xE9;m konkr&#xE9;tn&#xED;m p&#x159;&#xED;pad&#x11B;, j&#xED; p&#x159;ed&#xE1;&#x161; jako argument.</p>\n<p>N&#x11B;kter&#xFD;m funkc&#xED;m m&#x16F;&#x17E;e&#x161; p&#x159;edat i&#xA0;v&#xED;ce argument&#x16F;.\nT&#x159;eba zrovna funkci <code>print</code>, kter&#xE1; v&#x161;echny sv&#xE9; argumenty vyp&#xED;&#x161;e na &#x159;&#xE1;dek.\nJednotliv&#xE9; argumenty se odd&#x11B;luj&#xED; &#x10D;&#xE1;rkami:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">)</span>\n</pre></div><div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Jedna plus dva je&quot;</span><span class=\"p\">,</span> <span class=\"mi\">1</span> <span class=\"o\">+</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n</pre></div><p>N&#x11B;kter&#xE9; funkce nepot&#x159;ebuj&#xED; &#x17E;&#xE1;dn&#xFD; argument.\nP&#x159;&#xED;kladem je zase <code>print</code>.\nJe ale nutn&#xE9; napsat z&#xE1;vorky &#x2013;&#xA0;i&#xA0;kdy&#x17E; jsou pr&#xE1;zdn&#xE9;.\nH&#xE1;dej, co tohle vol&#xE1;n&#xED; ud&#x11B;l&#xE1;?</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">()</span>\n</pre></div><div class=\"solution\" id=\"solution-0\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2019/brno-jaro-2019-pondeli/beginners/functions/index/solutions/0/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <p>Funkce <code>print</code> zavolan&#xE1; bez argument&#x16F; nap&#xED;&#x161;e pr&#xE1;zdn&#xFD; &#x159;&#xE1;dek.</p>\n<p>(Je to p&#x159;esn&#x11B; podle definice &#x2013; funkce <code>print</code> v&#x161;echny sv&#xE9; argumenty vyp&#xED;&#x161;e\nna &#x159;&#xE1;dek.)</p>\n    </div>\n</div><h3>Pojmenovan&#xE9; argumenty</h3>\n<p>N&#x11B;kter&#xE9; funkce um&#xED; pracovat i&#xA0;s&#xA0;<em>pojmenovan&#xFD;mi</em> argumenty.\nP&#xED;&#x161;ou se podobn&#x11B; jako p&#x159;i&#x159;azen&#xED; do prom&#x11B;nn&#xE9;,\ns&#xA0;rovn&#xED;tkem, ale uvnit&#x159; z&#xE1;vorek.</p>\n<p>T&#x159;eba funkce <code>print</code> norm&#xE1;ln&#x11B; ukon&#x10D;&#xED; v&#xFD;pis nov&#xFD;m &#x159;&#xE1;dkem,\nale pomoc&#xED; argumentu <code>end</code> se d&#xE1; vypsat i&#xA0;n&#x11B;co jin&#xE9;ho.</p>\n<div class=\"admonition note\"><p>Tenhle p&#x159;&#xED;klad je pot&#x159;eba napsat do souboru; v&#xA0;interaktivn&#xED; konzoli\nnebude v&#xFD;stup vypadat, jak m&#xE1;.</p>\n</div><div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;1 + 2&apos;</span><span class=\"p\">,</span> <span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">&apos; &apos;</span><span class=\"p\">)</span>     <span class=\"c1\"># M&#xED;sto p&#x159;echodu na nov&#xFD; &#x159;&#xE1;dek jen napi&#x161; mezeru</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;=&apos;</span><span class=\"p\">,</span> <span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">&apos; &apos;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"mi\">1</span> <span class=\"o\">+</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">&apos;!&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">()</span>\n</pre></div><h3>Funkce je pot&#x159;eba volat</h3>\n<p>Pozor na to, &#x17E;e kdy&#x17E; nenap&#xED;&#x161;e&#x161; z&#xE1;vorky, funkce se nezavol&#xE1;!\nV&#xFD;raz <code>len(s)</code> je <em>vol&#xE1;n&#xED; funkce</em>, ale <code>len</code> bez z&#xE1;vorek ozna&#x10D;uje\n<em>funkci samotnou</em>.</p>\n<p>V&#xFD;sledek <code>len(s)</code> je &#x10D;&#xED;slo; <code>len</code> je funkce.</p>\n<p>&#x10C;&#xED;sla m&#x16F;&#x17E;e&#x161; se&#x10D;&#xED;tat, m&#x16F;&#x17E;e&#x161; tedy napsat <code>len(s) + 1</code>.\nFunkce ale se&#x10D;&#xED;tat nejde &#x2013; <code>len + 1</code> ned&#xE1;v&#xE1; smysl.</p>\n<p>&#x10C;asto se ale stane, &#x17E;e z&#xE1;vorky prost&#x11B; zapomene&#x161;.\nZkus si, co d&#x11B;laj&#xED; n&#xE1;sleduj&#xED;c&#xED; p&#x159;&#xED;klady, a pozorn&#x11B; si p&#x159;e&#x10D;ti v&#xFD;sledky\na chybov&#xE9; hl&#xE1;&#x161;ky, abys pak podobn&#xE9; chyby poznala:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"s1\">&apos;a&apos;</span><span class=\"p\">))</span>     <span class=\"c1\"># Vol&#xE1;n&#xED; funkce (a vyps&#xE1;n&#xED; v&#xFD;sledku)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">)</span>          <span class=\"c1\"># Vyps&#xE1;n&#xED; samotn&#xE9; funkce</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"nb\">len</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span>      <span class=\"c1\"># Se&#x10D;ten&#xED; funkce a &#x10D;&#xED;sla</span>\n</pre></div><h2>U&#x17E;ite&#x10D;n&#xE9; funkce</h2>\n<p>Nakonec si uk&#xE1;&#x17E;eme p&#xE1;r z&#xE1;kladn&#xED;ch funkc&#xED;, kter&#xE9; n&#xE1;m Python nab&#xED;z&#xED;.\nM&#x16F;&#x17E;e&#x161; si st&#xE1;hnout i\n<a href=\"https://github.com/encukou/cheatsheets/raw/master/basic-functions/basic-functions-cs.pdf\">p&#x159;ehled</a>,\nkter&#xFD; se rozd&#xE1;v&#xE1; na srazech.</p>\n<h3>Vstup a v&#xFD;stup</h3>\n<p>Tyhle funkce u&#x17E; zn&#xE1;me.\n<code>print</code> vyp&#xED;&#x161;e nepojmenovan&#xE9; argumenty, odd&#x11B;len&#xE9; mezerou.\nPojmenovan&#xFD; argument <code>end</code> ur&#x10D;uje, co se vyp&#xED;&#x161;e na konci (m&#xED;sto p&#x159;echodu\nna nov&#xFD; &#x159;&#xE1;dek);\n<code>sep</code> zase, co se vyp&#xED;&#x161;e mezi jednotliv&#xFD;mi argumenty (m&#xED;sto mezery).</p>\n<div class=\"admonition note\"><p>P&#x159;&#xED;klad op&#x11B;t spus&#x165; ze souboru, ne interaktivn&#x11B;:</p>\n</div><div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s1\">&apos;dv&#x11B;&apos;</span><span class=\"p\">,</span> <span class=\"bp\">False</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">&apos; &apos;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"n\">sep</span><span class=\"o\">=</span><span class=\"s1\">&apos;, &apos;</span><span class=\"p\">)</span>\n</pre></div><p>Z&#xE1;kladn&#xED; funkce na na&#x10D;ten&#xED; vstupu, <code>input</code>,\nvyp&#xED;&#x161;e ot&#xE1;zku, po&#x10D;k&#xE1; na text od u&#x17E;ivatele a&#xA0;ten vr&#xE1;t&#xED; jako &#x159;et&#x11B;zec.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">&apos;zadej vstup: &apos;</span><span class=\"p\">)</span>\n</pre></div><p>Kontroln&#xED; ot&#xE1;zky:</p>\n<ul>\n<li>Je <code>input</code> &#x201E;norm&#xE1;ln&#xED;&#x201C; funkce, nebo procedura?</li>\n<li>Co bere funkce <code>input</code> jako argument?</li>\n<li>Jak&#xE1; je n&#xE1;vratov&#xE1; hodnota funkce <code>input</code>?</li>\n</ul>\n<div class=\"solution\" id=\"solution-1\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2019/brno-jaro-2019-pondeli/beginners/functions/index/solutions/1/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <p>Funkce <code>input</code> vrac&#xED; hodnotu, se kterou m&#x16F;&#x17E;e program d&#xE1;l pracovat.\nZa&#x159;adil bych ji tedy mezi &#x201E;norm&#xE1;ln&#xED;&#x201C; funkce.</p>\n<p>Jako argument bere <code>input</code> ot&#xE1;zku, na kterou se u&#x17E;ivatele zept&#xE1;.</p>\n<p>N&#xE1;vratov&#xE1; hodnota funkce <code>input</code> je u&#x17E;ivatelova odpov&#x11B;&#x10F;.</p>\n    </div>\n</div><h3>P&#x159;ev&#xE1;d&#x11B;n&#xED; typ&#x16F;</h3>\n<p>Co ale kdy&#x17E; nechceme pracovat s&#xA0;&#x159;et&#x11B;zcem, ale t&#x159;eba s&#xA0;&#x10D;&#xED;slem?\nTady n&#xE1;m pom&#x16F;&#x17E;e skupina funkc&#xED;, kter&#xE9; um&#xED; p&#x159;ev&#xE1;d&#x11B;t &#x10D;&#xED;sla na &#x159;et&#x11B;zce a&#xA0;zp&#xE1;tky.\nKa&#x17E;d&#xFD; ze t&#x159;&#xED; <em>typ&#x16F;</em> (angl. <em>types</em>) prom&#x11B;nn&#xFD;ch, kter&#xE9; zat&#xED;m zn&#xE1;me,\nm&#xE1; funkci, kter&#xE1; vezme n&#x11B;jakou hodnotu a&#xA0;vr&#xE1;t&#xED; podobnou hodnotu &#x201E;sv&#xE9;ho&#x201C; typu.\nNa cel&#xE1; &#x10D;&#xED;sla je funkce <code>int</code> (z angl. <em>integer</em>), na re&#xE1;ln&#xE1; &#x10D;&#xED;sla je <code>float</code>\n(z angl. <em>floating-point</em>), a pro &#x159;et&#x11B;zce <code>str</code> (z angl. <em>string</em>).</p>\n<div class=\"highlight\"><pre><span></span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>              <span class=\"c1\"># p&#x159;evod na cel&#xE9; &#x10D;&#xED;slo</span>\n<span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>            <span class=\"c1\"># p&#x159;evod na re&#xE1;ln&#xE9; &#x10D;&#xED;slo</span>\n<span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>              <span class=\"c1\"># p&#x159;evod na &#x159;et&#x11B;zec</span>\n</pre></div><p>P&#x159;&#xED;klady:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"mi\">3</span> <span class=\"o\">==</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"s1\">&apos;3&apos;</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"mf\">3.0</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"mf\">3.141</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n<span class=\"mf\">8.12</span> <span class=\"o\">==</span> <span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"s1\">&apos;8.12&apos;</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"mf\">8.12</span><span class=\"p\">)</span>\n<span class=\"mf\">8.0</span> <span class=\"o\">==</span> <span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"mi\">8</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"s1\">&apos;8&apos;</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"mf\">8.0</span><span class=\"p\">)</span>\n<span class=\"s1\">&apos;3&apos;</span> <span class=\"o\">==</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"s1\">&apos;3&apos;</span><span class=\"p\">)</span>\n<span class=\"s1\">&apos;3.141&apos;</span> <span class=\"o\">==</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"mf\">3.141</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"s1\">&apos;3.141&apos;</span><span class=\"p\">)</span>\n</pre></div><p>Ne v&#x161;echny p&#x159;evody jsou mo&#x17E;n&#xE9;:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"s1\">&apos;blablabla&apos;</span><span class=\"p\">)</span>    <span class=\"c1\"># chyba!</span>\n<span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"s1\">&apos;blablabla&apos;</span><span class=\"p\">)</span>  <span class=\"c1\"># chyba!</span>\n<span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"s1\">&apos;8.9&apos;</span><span class=\"p\">)</span>          <span class=\"c1\"># chyba!</span>\n</pre></div><p>&#x2026;a&#xA0;jak si poradit s&#xA0;chybou, kter&#xE1; nastane,\nkdy&#x17E; pou&#x17E;ije&#x161; &#x161;patnou hodnotu, si &#x159;ekneme pozd&#x11B;ji.</p>\n<h4>P&#x159;ev&#xE1;d&#x11B;n&#xED; a <code>input</code></h4>\n<p>P&#x159;ev&#xE1;d&#x11B;n&#xED; typ&#x16F; se &#x10D;asto pou&#x17E;&#xED;v&#xE1; p&#x159;i na&#x10D;&#xED;t&#xE1;n&#xED; vstupu, t&#x159;eba jako:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">cislo</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">&apos;Zadej &#x10D;&#xED;slo: &apos;</span><span class=\"p\">))</span>\n</pre></div><p>Jak Python vyhodnot&#xED; tento v&#xFD;raz?\nZad&#xE1;-li u&#x17E;ivatel <kbd>4</kbd><kbd>2</kbd>, funkce <code>input</code> vr&#xE1;t&#xED; &#x159;et&#x11B;zec<code>&apos;42&apos;</code>.\nTen pak funkce <code>int</code> vezme jako argument, ud&#x11B;l&#xE1; z&#xA0;n&#x11B;j &#x10D;&#xED;slo a to &#x10D;&#xED;slo vr&#xE1;t&#xED;:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">cislo</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">&apos;Zadej &#x10D;&#xED;slo: &apos;</span><span class=\"p\">))</span>\n      <span class=\"c1\">#     &#x2570;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x256F;</span>\n<span class=\"n\">cislo</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span>        <span class=\"s1\">&apos;42&apos;</span>          <span class=\"p\">)</span>\n      <span class=\"c1\"># &#x2570;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x256F;</span>\n<span class=\"n\">cislo</span> <span class=\"o\">=</span>              <span class=\"mi\">42</span>\n</pre></div><h3>Matematick&#xE9; funkce</h3>\n<p>Matematika je ob&#x10D;as pot&#x159;eba, tak&#x17E;e se poj&#x10F;me\npod&#xED;vat, jak v&#xA0;Pythonu pracovat s&#xA0;&#x10D;&#xED;sly.</p>\n<p>Jedna zaj&#xED;mav&#xE1; matematick&#xE1; funkce je k&#xA0;dispozici v&#x17E;dy:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"nb\">round</span><span class=\"p\">(</span><span class=\"n\">cislo</span><span class=\"p\">)</span>    <span class=\"c1\"># zaokrouhlen&#xED;</span>\n</pre></div><p>Spousta dal&#x161;&#xED;ch nen&#xED; k&#xA0;dispozici od za&#x10D;&#xE1;tku programu.\nNe ka&#x17E;d&#xFD; m&#xE1; r&#xE1;d matematiku, a ne ve v&#x161;ech druz&#xED;ch programu jsou takov&#xE9; operace\npot&#x159;eba.\nProto mus&#xED;me p&#x159;edem &#x2013; typicky na za&#x10D;&#xE1;tku souboru &#x2013; &#x159;&#xED;ct, &#x17E;e je budeme pou&#x17E;&#xED;vat.\nTo se d&#x11B;l&#xE1; <em>naimportov&#xE1;n&#xED;m</em> z&#xA0;modulu <code>math</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">math</span> <span class=\"kn\">import</span> <span class=\"n\">sin</span><span class=\"p\">,</span> <span class=\"n\">cos</span><span class=\"p\">,</span> <span class=\"n\">tan</span><span class=\"p\">,</span> <span class=\"n\">sqrt</span><span class=\"p\">,</span> <span class=\"n\">floor</span><span class=\"p\">,</span> <span class=\"n\">ceil</span>\n</pre></div><p>Naimportovan&#xE9; funkce pak m&#x16F;&#x17E;e&#x161; pou&#x17E;&#xED;t:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">sin</span><span class=\"p\">(</span><span class=\"n\">uhel</span><span class=\"p\">)</span>       <span class=\"c1\"># sinus</span>\n<span class=\"n\">cos</span><span class=\"p\">(</span><span class=\"n\">uhel</span><span class=\"p\">)</span>       <span class=\"c1\"># kosinus</span>\n<span class=\"n\">tan</span><span class=\"p\">(</span><span class=\"n\">uhel</span><span class=\"p\">)</span>       <span class=\"c1\"># tangens</span>\n<span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">cislo</span><span class=\"p\">)</span>     <span class=\"c1\"># druh&#xE1; odmocnina</span>\n\n<span class=\"n\">floor</span><span class=\"p\">(</span><span class=\"n\">cislo</span><span class=\"p\">)</span>    <span class=\"c1\"># zaokrouhlen&#xED; dol&#x16F;</span>\n<span class=\"n\">ceil</span><span class=\"p\">(</span><span class=\"n\">cislo</span><span class=\"p\">)</span>     <span class=\"c1\"># zaokrouhlen&#xED; nahoru</span>\n</pre></div><div class=\"admonition warning\"><p class=\"admonition-title\">Import a pojmenov&#xE1;n&#xED; soubor&#x16F;</p>\n<p>P&#x159;i importov&#xE1;n&#xED; je pot&#x159;eba si d&#xE1;vat pozor na pojmenov&#xE1;n&#xED; soubor&#x16F;:\nimportuje&#x161;-li <code>from math</code>, nesm&#xED; se tv&#x16F;j program jmenovat <code>math.py</code>.</p>\n<p>Pro&#x10D;? Kdy&#x17E; Python v&#xA0;adres&#xE1;&#x159;i, ze kter&#xE9;ho program pou&#x161;t&#xED;&#x161;, najde soubor\n<code>math.py</code>, bude se sna&#x17E;it importovat <code>sin</code> z&#xA0;n&#x11B;ho m&#xED;sto\nz&#xA0;p&#x159;edp&#x159;ipraven&#xE9; sady matematick&#xFD;ch funkc&#xED;.</p>\n</div><h3>N&#xE1;hoda</h3>\n<p>Nakonec si uk&#xE1;&#x17E;eme dv&#x11B; funkce, kter&#xE9; vrac&#xED; n&#xE1;hodn&#xE1; &#x10D;&#xED;sla:\n<code>randrange</code> a <code>uniform</code>.\nJsou u&#x17E;ite&#x10D;n&#xE9; t&#x159;eba pro hry, ve kter&#xFD;ch se h&#xE1;z&#xED; kostkou nebo tahaj&#xED;\nn&#xE1;hodn&#xE9; karty.</p>\n<p>Op&#x11B;t nejsou pot&#x159;eba tak &#x10D;asto a je pot&#x159;eba je <em>naimportovat</em>.\nTentokr&#xE1;t z&#xA0;modulu <code>random</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">random</span> <span class=\"kn\">import</span> <span class=\"n\">randrange</span><span class=\"p\">,</span> <span class=\"n\">uniform</span>\n</pre></div><p>Pak u&#x17E; se daj&#xED; pou&#x17E;&#xED;t:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">randrange</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">)</span>   <span class=\"c1\"># n&#xE1;hodn&#xE9; cel&#xE9; &#x10D;&#xED;slo od a do b-1</span>\n<span class=\"n\">uniform</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">)</span>     <span class=\"c1\"># n&#xE1;hodn&#xE9; re&#xE1;ln&#xE9; &#x10D;&#xED;slo od a do b</span>\n</pre></div><p>Pozor na to, &#x17E;e <code>randrange(a, b)</code>\nnikdy nevr&#xE1;t&#xED; samotn&#xE9; <code>b</code>.\nPokud pot&#x159;ebujeme n&#xE1;hodn&#x11B; vybrat ze t&#x159;&#xED; mo&#x17E;nost&#xED;,\npou&#x17E;ij <code>randrange(0, 3)</code>,\nco&#x17E; vr&#xE1;t&#xED; <code>0</code>, <code>1</code>, nebo\n<code>2</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">random</span> <span class=\"kn\">import</span> <span class=\"n\">randrange</span>\n\n<span class=\"n\">cislo</span> <span class=\"o\">=</span> <span class=\"n\">randrange</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">)</span>  <span class=\"c1\"># &#x10D;&#xED;slo je od 0, 1, nebo 2</span>\n<span class=\"k\">if</span> <span class=\"n\">cislo</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Kole&#x10D;ko&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">elif</span> <span class=\"n\">cislo</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;&#x10C;tvere&#x10D;ek&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">else</span><span class=\"p\">:</span>  <span class=\"c1\"># 2</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Troj&#xFA;heln&#xED;&#x10D;ek&apos;</span><span class=\"p\">)</span>\n</pre></div><div class=\"admonition note\"><p>Pamatuj, kdy&#x17E; importuje&#x161; z modulu <code>random</code>, nesm&#xED; se tv&#x16F;j soubor\njmenovat <code>random.py</code>.</p>\n</div><h3>A dal&#x161;&#xED;</h3>\n<p>Python d&#xE1;v&#xE1; k dispozici obrovsk&#xE9; mno&#x17E;stv&#xED; dal&#x161;&#xED;ch\nfunkc&#xED; a&#xA0;modul&#x16F;, i&#xA0;kdy&#x17E; ne v&#x161;em bude&#x161; ze za&#x10D;&#xE1;tku\nrozum&#x11B;t.\nV&#x161;echny jsou &#x2013; anglicky &#x2013; pops&#xE1;ny v&#xA0;dokumentaci Pythonu, nap&#x159;.\n<a href=\"https://docs.python.org/3/library/functions.html\">vestav&#x11B;n&#xE9; funkce</a>,\n<a href=\"https://docs.python.org/3/library/math.html\">matematika</a>.</p>\n\n\n        "
    }
  }
}