Dnes bychom se měli v našem snažení s modulem Livewires a funkcemi i obličejem dostat zase o kus dál. Snad je jasné, že malování obličeje slouží jako záminka. Že malovat dokážeme daleko lépe, jinak a jednodušeji. Nám tady ale jde jednak o pochopení toho, co se to na obrazovce při malování děje a jednak o funkce. O ty hlavně. Tak s chutí do toho!
...pokračujeme z minula....
Otevíráme ústa
Jak jsem již řekl, ústa jsou těžší. Je třeba, abychom se naučili vykreslit jen část kruhu. Můžeme to udělat tak, že řekneme, kde je střed kruhu a kde jsou konce oblouku. V obrázku nahoře, koncové body pusy jsou na (280,180) a (320,180). Není zcela zřejmé, kde by měl být střed, já to odhaduji na asi (300,195) -- jen trochu pod středem velkého kruhu.
Z toho vyplývá, že do programu potřebujeme dodat toto:
circle(300,195, endpoints = ((280,180),(320,180)))
Vypadá to trochu hrozivě, pokusím se to vysvětlit. Nejprve udáte střed kruhu (300,195), jako kdybyste ho malovali celý. Pak abyste řekli počítači, že ho nechcete celý, ale jen jeho část, zadáte kde jsou koncové body (endpoints) té části kruhu. Kde jsou koncové body řeknete pomocí souřadnic.
Výzva: Udělejte další změny na tváři, abyste plně pochopili smysl, jak tyto grafické příkazy fungují. Například:
- Zvedněte trochu oči.
- Přidejte obočí (čáry nad očima, snad trochu šikmo).
- Přidejte uši, vlasy.
- Změňte jemně tvar nosu.
- Použijte barvy.
Barvičky
Možná budete chtít udělat z černobílého obrázku barevný. Modul livewires umí pár základních barev, např. red, green, pink, yellow, atd. Použití u kruhů je následující:
circle(300,200,100, colour=Colour.red) # namaluje kruh červeně
# namaluje kruh s červenou výplní:
circle(300,200,100, colour=Colour.red, filled=1)
# chcete-li i jiné barvy, můžete si je "vyrobit",
# stačí znát RGB složky....
# jak zjistíte RGB složky?: třeba
# PSPad - Nástroje - Zobrazit barvu....
# co je to RGB?: tak to je téma pro jiný kurz
# nebo pro strýčka googla :-)
dpp=255.0
# je důležité, aby dpp bylo desetinné číslo a ne pouhých 255,
# protože jinak by v následujícím řádku vycházela ve zlomcích celá čísla
ruzova=Colour(255/dpp, 192/dpp, 203/dpp)
draw (40, 120, colour=ruzova)
Dvě hlavy je víc než jedna
Co kdybyste chtěli namalovat dvě takové hlavy? Mohli byste vše zkopírovat, vložit na konec programu, změnit v kopii souřadnice a bylo by to, že? To by jistě fungovalo, ale bylo by to nudné a lehce byste se mohli splést. A pokud byste chtěli ještě jednu tvář, tak byste se asi zapotili.
Je zde lepší cesta.Již víte, že vám umožňuje pojmenovávat čísla, řetězce, seznamy a další věci. Také vám dává možnost pojmenovat části programu. Část programu, která dostane jméno, se nazývá "funkce" (proč? - to je složitější a teď na tom nezáleží).
Funkce
Zkuste následující příklad. (pythonýrský "prompt", kterým začíná
každá řádka se bude měnit jako u příkladu cyklu for.
Nezapomeňte
na mezery na začátcích řádků!)
>>> def vyzva():
... print 'Python je bajecny!'
... print 'Stejne jako ja.'
... # Zde jen stiskněte Enter
Co se stane, když napíšete?:
>>> vyzva()
Zkuste to. Vy jste vlastně "nadefinovali" nové
slovo, kterému teď Python rozumí. (def
je zkratka pro
definovat
.) Zkuste si také tyto tři řádky napsat do souboru, do programu, samozřejmě
bez těch >>> a uložit. Pak program spusťte a pokud jste to napsali správně,
vidíte před sebou >>>
. No a teď můžete znovu zkusit funkci
zavolat: vyzva()
.
Funkce je něco jako proměnná, jen že uvnitř není uložené číslo, ale malý
program, pár řádků kódu. Jiný je ale způsob použití. U funkce jsou nutné na
konci závorky (podle toho se lehce zjistít, že to není proměnná, ale funkce).
A rozhodně nemůžeme použít, jako u proměnných, např. vyzva()=10
.
Za názvem funkce musí být závorky, a to jak při definici, tak při použití.
Bez závorek to sice nevyhodí chybu, protože vám prostě napíše na které adrese v paměti ta funkce leží, ale rozhodně se nevykoná kód, který je schovaný uvnitř.
Výzva: Napište funkci takovou, že když napíšete bedovani()
,
tak počítač vytiskne:
Python je pro kocku! A stejne tak tento kurz!
Dobrý argument
Funkce jsou však více než pouhá úspora při psaní. Vyzkoušejte naspat následující definici a přemýšlejte o tom, co může znamenat.
>>> def dvakrat(x):
... print x, ' + ', x, ' = ', x+x
... # Zde jen stiskněte Enter.
Pokud si myslíte, že tomu rozumíte (nebo jste se rozhodli, že tomu nebudete
rozumět nikdy :-) ), experimentujte. Zkuste se zeptat Pythona na
dvakrat(3)
, nebo dvakrat(99)
, nebo dokonce
dvakrat('och')
.
Nyní je to snad již jasnější. Když řeknete dvakrat(7)
,
počítač vykoná kód uvnitř definice dvakrat
(stejně
jako to vykonal u funkce vyzva
a bedovani
již dříve) jen s tím rozdílem, že "x = 7"
.
Takže je to tak, jako kdybyste řekli:
print 7, ' + ', 7, ' = ', 7+7
Věci, které se takto dostanou dovnitř funkce, se z jistých důvodů
nazývají "argumenty" nebo "parametry". Takže když řeknete
dvakrat('superstar')
, tak řetězec 'superstar'
je
argumentem funkce dvakrat
. Pythonu se ale nebude líbit, když mu
zadáte dvakrat()
>, tedy bez argumentu. Vyzkoušejte. Víte co se to
děje? (Python hlásí chybu , že funkce dvakrat()
očekávala 1
argument a nedostala žádný).
Výzva: Napište funkci, která se chová skoro jako
dvakrat
, ale narozdíl od tisku kolik je x+x
(kde
x
je argumentem funkce), vytiskne, kolik je
x*x
. Vyzkoušejte. (Bohužel to nebude fungovat na řetězce!)
Funkce může mít více jak jeden argument. Jak to funguje bude zřejmé, jakmile to uvidíte, takže dávám příklad.
def secti(x,y):
print x, ' + ', y, ' = ', x+y
a=input('Zadej prvni cislo: ')
b=input('Zadej druhe cislo: ')
secti(a,b)
Vestavěné funkce
Mimochodem je mnoho věcí, které jste doposud Pythonu říkali, a
které jsou ve skutečnosti funkce. Když jste například říkali
move(100,100)
, tak jste používali funkci se dvěma argumenty.
Jediný rozdíl byl v tom, že jste nemuseli psát definici funkce sami.
...pokračování příště...
Příště to snad již doděláme.Úkol
5 libovolných příkladů (to jsou ty kódy v rámečcích) z 1. lekce spáchejte pomocí funkcí. To znamená definici a hned za ní použití, aby mi prostě při spuštění programu postupně vypisoval to, co je v příkladech. Samozřejmě bez těch >>> :-). Dám příklad pro "plat":
def tiskniPlat(plat):
print "plat = ", plat
print "plat * 4 = ", plat * 4
print "plat/12 = ", plat / 12
tiskniPlat(123456)