× Aktuálně z oboru

SHIELD Experience Upgrade 7 – méně hledání a více zábavy [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]
Celá zprávička [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]

Python - 6. lekce

[ http://programujte.com/profil/120-pavel-kosina/ ]Google [ :5:?rel=author ]       [ http://programujte.com/profil/118-zdenek-lehocky/ ]Google [ ?rel=author ]       22. 7. 2005       28 990×

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 Python 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 Python 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 Python 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)

Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2005080301-python-6-lekce/ ].