comment up next how to englisch dex

2. Proměnné, výrazy a příkazy

  1. Hodnoty a typy
  2. Proměnné
  3. Jména proměnných a klíčová slova
  4. Příkazy
  5. Vyhodnocení výrazů
  6. Operátory a operandy
  7. Pořadí operací
  8. Operace na řetězcích
  9. Vstup
  10. Kompozice
  11. Komentáře
  12. Glosář
  13. Cvičení

2.1 Hodnoty a typy

Hodnota je nejzákladnějším objektem – jako je písmeno nebo číslice – se kterým program pracuje. Zatím jsme se s hodnotou setkali dvakrát, a to s číslem 2 (výsledek našeho sčítání 1 + 1) a s větou "Hello, World!".

Tyto hodnoty patří k rozdílným typům: 2 je celé číslo (integer) a "Hello, World!" je řetězec (string). Říkáme mu tak proto, že se skládá z řetězce písmen. Překladač i my poznáme řetězce podle toho, že jsou uzavřeny v uvozovkách.

Příkaz tisku platí i pro celá čísla.

>>> print 4
4

Pokud si nejsme jisti, jakého typu je hodnota, může nám to překladač říci.

>>> type("Hello, World!")
<type 'str'>
>>> type(17)
<type 'int'>

Nepřekvapuje nás, že řetězce (strings) patří k typu string a celá čísla (integers) k typu int. Méně je zřejmé, že čísla s desetinnou čárkou (či tečkou) patří k typu označeném jako float, protože tato čísla jsou zastoupena formátem zvaným plovoucí desetinná čárka (floating-point).

>>> type(3.2)
<type 'float'>

A což hodnoty jako "17" a "2.3"? Vypadají jako čísla, ale jsou v uvozovkách.

>>> type("17")
<type 'str'>
>>> type("3.2")
<type 'str'>

Jsou to řetězce.

Řetězce mohou být v Pythonu uzavřeny v jednoduchých (') nebo dvojitých (") uvozovkách:

>>> type('Toto je retiazka.')
<type 'str'>
>>> type("A toto taky.")
<type 'str'>

Uvnitř dvojitých uvozovek mohou být uvozovky jednoduché a obráceně: 'Pravil "ne!" '.

Při zapisování velkého celého čísla bychom mohli být v pokušení použít oddělovací čárky či tečky mezi trojicemi číslic, např. 1,000,000. Legální celé číslo to není, ale legální číslo to je:

>>> print 1,000,000
1 0 0

Není to však to, co jsme očekávali. Python interpretuje 1,000,000 jako seznam tří položek, které se mají vytisknout. Takže si budeme pamatovat - žádné čárky do celého čísla.

2.2 Proměnné

Jedním z nejmocnějších rysů programovacího jazyka je jeho schopnost používat proměnné. Proměnná je jméno, které poukazuje na nějakou hodnotu.

Příkaz přiřazení vytváří nové proměnné a přiřazuje jim hodnoty:

>>> message = "What's up, Doc?"
>>> n = 17
>>> pi = 3.14159

Tento příklad vytváří tři přiřazení. První přiřazuje řetězec "What's up, Doc?" nové proměnné s názvem message. Druhé přiřazuje celé číslo 17 proměnné n a třetí přiřazuje číslo s plovoucí čárkou 3.14159 proměnné pi.

Operátor přiřazení (=) by neměl být zaměňován s rovnítkem i když používá stejný znak. Operátory přiřazení spojují jméno na levé straně s hodnotou na pravé straně. Vytvoříme chybu, když napíšeme:

>>> 17 = n

Proměnné na papíře obvykle zobrazujeme tak, že zapíšeme jméno proměnné s šipkou, která ukazuje k její hodnotě. Tomuto zobrazení říkáme schéma vztahů (state diagram). Následující schéma ukazuje výsledek příkazů přiřazení:

Příkaz tisku lze také použít pro proměnné.

>>> print message
What's up, Doc?
>>> print n
17
>>> print pi
3.14159

Ve všech případech je výsledkem hodnota proměnné. Typ proměnné můžeme zjistit dotazem v překladači.

>>> type(message)
<type 'str'>
>>> type(n)
<type 'int'>
>>> type(pi)
<type 'float'>

Proměnná má typ hodnoty, jež jí je přiřazena.

2.3 Jména proměnných a klíčová slova

Programátoři pro své proměnné většinou volí jména smysluplná – taková, která napovídají k čemu má proměnná sloužit.

Jména proměnných mohou být libovolně dlouhá. Mohou obsahovat jak písmena tak číslice, ale musejí začínat písmenem. I když je přípustné použít velká písmena, z konvenčních důvodů to neděláme. Pokud tak učiníme, musíme si uvědomit, že velikost písmena hraje roli. Bruce a bruce jsou různá jména.

Podtržítko (_) se ve jménu smí použít. Často se používá u jmen s více slovy, jako je moje_jmeno nebo price_of_tea_in_china.

Dáme-li proměnné nepřípustné jméno, obdržíme syntaktickou chybu:

>>> 76trombones = "big parade"
SyntaxError: invalid syntax
>>> more$ = 1000000
SyntaxError: invalid syntax
>>> class = "Computer Science 101"
SyntaxError: invalid syntax

76trombones není legální, protože nezačíná písmenem, more$ není legální, protože obsahuje nedovolený znak, označení dolaru. Co je ale špatného na class?

Ukazuje se, že class je jedno z klíčových slov Pythonu. Klíčová slova definují pravidla a strukturu jazyka a nemohou být použita jako jména proměnných.

Python má třicet jedno klíčové slovo:


and       del       from       not        while
as        elif      global     or         with
assert    else      if         pass       yield
break     except    import     print
class     exec      in         raise
continue  finally   is         return
def       for       lambda     try


Tento seznam bychom měli mít po ruce, abychom do něj mohli nahlédnout, když překladač protestuje proti nějakému jménu naší proměnné a my nevíme proč.

2.4 Příkazy

Příkaz je instrukce, kterou může překladač provést. Dosud jsme poznali dva druhy příkazů: print a přiřazení.

Napíšeme-li příkaz na příkazovou řádku, Python jej provede a zobrazí výsledek, je-li nějaký. Výsledkem příkazu k tisku (print) je hodnota. Příkazy k přiřazení (=) neprodukují výstup.

Skript obvykle obsahuje řadu příkazů. Je-li příkazů více než jeden, zobrazují se výsledky jeden za druhým, jak se postupně provádějí příkazy.

Na příklad skript

print 1 
 x = 2 
print x 

vytvoří výstup

1
2

Příkaz přiřazení nemá žádný přímý výstup.

2.5 Vyhodnocení výrazů

Výraz je kombinace hodnot, proměnných a operátorů. Zapíšeme-li výraz na příkazovou řádku, překladač jej vyhodnotí a zobrazí výsledek.

>>> 1 + 1
2

Vyhodnocení výrazu dává hodnotu a proto se výrazy mohou vyskytovat na pravé straně přiřazení. Hodnota sama o sobě je jednoduchý výraz, stejně jako proměnná.

>>> 17
17
>>> x
2

Je poněkud matoucí, že vyhodnocení výrazu není totéž co vytisknutí hodnoty.

>>> message = "What's up, Doc?"
>>> message
"What's up, Doc?"
>>> print message
What's up, Doc?

Když Python zobrazuje hodnotu výrazu, použije týž formát jako při zadávání hodnoty. V případě řetězců to znamená, že se zobrazí i uvozovky. Příkaz tisku však vrací jen hodnotu výrazu, což v tomto případě je řetězec bez uvozovek.

Výraz ve skriptu je sám o sobě přípustným příkazem, ale nic nekoná. Tento skript např.

17
3.2
"Hello, World!"
1  + 1

neprodukuje vůbec žádný výstup.

Cvičení:  Jak bychom změnili uvedený skript, aby se nám zobrazily hodnoty všech čtyř výrazů?

2.6 Operátory a operandy

Operátory jsou specielní symboly, které reprezentují výpočty jako sčítání a násobení. Hodnoty, které operátor používá, jsou operandy.

Následující výrazy jsou všechno přípustné výrazy Pythonu, jejichž význam je více či méně jasný.

20+32   hour-1   hour*60+minute   minute/60   5**2   (5+9)*(15-7)

Symboly +, -, /, a užití kulatých závorek znamenají v Pythonu totéž co v matematice. Hvězdička (*) je symbol pro násobení a ** je symbol pro umocňování.

Objeví-li se na místě operandu proměnná, je zaměměna za svou hodnotu před tím, než se operace provede.

Sčítání, odčítání, násobení a umocňování se provádí běžným způsobem, může nás ale překvapit dělení. Následující operace dává nečekaný výsledek.

>>> minute = 59
>>> minute/60
0

Hodnota minute je 59 a 59 děleno 60 je 0.98333, nikoliv 0. Důvodem pro tuto nesrovnalost je to, že Python provádí celočíselné dělení.

Jsou-li oba operandy celá čísla, musí být výsledkem také celé číslo a podle konvence se při celočíselném dělení vždy zaokrouhluje dolů a to i v těch případech, jako zde, kdy se přesný výsledek těsně blíží vyššímu číslu.

Možné řešení tohoto problému je počítat spíš procenta než zlomek:

>>> minute*100/60
98

Výsledek je opět zaokrouhlen dolů, nyní je však alespoň přibližně správný. Jinou alternativou je použití dělení s plovoucí desetinnou čárkou. V příští kapitole uvidíme, jak přeměnit celé číslo či proměnnou na hodnotu s plovoucí čárkou.

2.7 Pořadí operací

Objeví-li se ve výrazu více než jeden operátor, závisí pořadí výpočtu na pravidlech o pořadí operací. Python respektuje stejná pravidla, jaká se používají v matematice. Pořadí operací si lze pamatovat pomocí akronymu ZUNDSO (PEMDAS in english):

2.8 Operace na řetězcích

Obecně vzato, na řetězcích nelze provádět matematické operace, i když vypadají jako čísla. Následující výrazy nejsou přípustné (za předpokladu, že message je typu řetězec):

message-1   "Hello"/123   message*"Hello"   "15"+2

Kupodivu, operátor + s řetězci umí pracovat, i když jinak, než bychom očekávali. Pro řetězce představuje operátor + příkaz zřetězení, což je spojení dvou operandů jejich připojením těsně k sobě. Například:

fruit = "banana"  
bakedGood = " nut bread" 
print fruit + bakedGood 

Výstupem tohoto programu je banana nut bread. Mezera před slovem nut je součástí řetězce nut bread.

Operátor * rovněž pracuje s řetězci, provádí opakování. Například, 'Fun' *3 je 'FunFunFun'. Jeden z operandů musí být řetězec, druhým operandem musí být celé číslo.

Tato interpretace (+ a *) dává na jedné straně smysl analogií se sčítáním a násobením. Stejně jako 4*3 je ekvivalentní k 4+4+4, tak očekáváme, že "Fun" *3 bude stejné jako "Fun"+"Fun"+"Fun" Na druhou stranu je ale veliký rozdíl mezi zřetězením a opakováním řetězce a sčítáním a násobením.

Cvičení:  Jmenujte vlastnost, kterou sčítání i násobení má a zřetězení i opakování nemá.

2.9 Vstup

V Pythonu jsou dvě vestavěné funkce pro vkládání údajů z klávesnice:

n = raw_input ("Zadej svoje jmeno, prosim: ") 
print n
n = input ("Zadej ciselny vyraz: ") 
print n

Skript spuštěný z příkazové řádky v Unixu může dát tento výstup:

$ python input.py
Zadej svoje jmeno, prosim: Arthur, King of the Britons
Arthur, King of the Britons
Zadej ciselny vyraz: 7 * 3
21

2.10 Kompozice

Dosud jsme na prvky programu - proměnné, výrazy a příkazy - nahlíželi izolovaně, bez vzájemné provázanosti.

Nejužitečnější vlastností programovacího jazyka je jeho schopnost skládat menší stavební prvky do větších celků. Umíme například sečíst čísla a známe příkaz print, nyní uvidíme, že obojí můžeme provést najednou:

>>> print 17 + 3
20

Ve skutečnosti se součet provede před tiskem, takže obě akce neprobíhají úplně najednou. Důležité je, že jakýkoliv výraz, který obsahuje čísla, řetězce a proměnné, může být použit uvnitř příkazu k tisku. Již známe příklad:

print "Number of minutes since midnight: " 
hour * 60 + minute

Na pravou stranu příkazu přiřazení můžeme dát libovolný výraz:

percentage = (minute * 100) / 60 

Tato vlastnost nám nemusí připadat v tuto chvíli ohromující, ale později uvidíme jiné příklady, kde nám skladba umožní vyjádřít složitý výpočet úhledně a stručně.

Varování: Pro používání výrazů existují jistá omezení. Například, levou stranou přiřazení musí být jméno proměnné, nikoliv výraz. Takže tento zápis je chybný: minute+1 = hour.

2.11 Komentáře

Tím jak se program stává větším a složitějším, stává se také méně přehledným. Formální jazyky jsou hutné a často je obtížné při pohledu na část kódu určit, co má být prováděno a proč.

Proto je dobré doplnit program poznámkami, které vysvětlují, co příslušná část programu má provádět. Poznámky či komentáře uvádíme symbolem #.

# compute the percentage of the hour that has elapsed 
percentage = (minute * 100) / 60 

Poznámka je v tomto případě umístěna na samostatné řádce. Lze ji umístit také na konec řádky:

percentage = (minute * 100) / 60 # caution: integer division 

Všechno od znaku # (hash) až do konce řádku je ignorováno - nemá na program žádný vliv. Informace je určena pro programátora nebo budocí programátory, kteří mohou programový kód používat. V tomto případě je čtenář upozorněn na vždy překvapující chování celočíselného dělení.

2.12 Glosář

hodnota (value)
Číslo nebo řetězec (nebo jiná entita, o které budeme hovořit později) jež může být přiřazeno k proměnné nebo počítáno ve výrazu.
typ (type)
Soustava hodnot. Typ hodnoty určuje jak může být použita ve výrazech. Typy, které jsme zatím poznali, jsou celá čísla (integers, typ int), čísla s plovoucí desetinnou čárkou (floating-point numbers, typ float ), a řetězce (strings, typ string).
int
Datový typ Pythonu pro kladná a záporná celá čísla.
str
Datový typ Pythonu pro "řetězce" alfanumerických znaků.
float
Datový typ Pythonu pro čísla s plovoucí desetinnou čárkou. Interně se tato čísla skládají ze dvou částí: z báze a exponentu. Kvůli chybě při zaokrouhlování jde o číslo s přibližnou hodnotou.
proměnná (variable)
Jméno, které odkazuje na hodnotu.
příkaz přířazení (assignment statement)
Příkaz, který jménu (proměnné) přiřadí hodnotu. Na levé straně operátoru přiřazení (=) je jméno. Na pravé straně operátoru je hodnota nebo výraz, který je překladačem Pythonu nejprve vyhodnocen a potom přiřazem jménu. Rozdíl mezi levou a pravou stranou si začínající programátoři někdy pletou. V následujícím přiřazení:
 n = n + 1 
hraje písmeno n velmi rozdílnou roli na obou stranách přiřazení. Na pravé straně je to hodnota a tvoří část výrazu, který je vyhodnocen před přiřazením proměnné na levé straně.
plovoucí desetinná čárka (floating point)
Formát pro zobrazení čísel s desetinnou částí.
příkaz (statement)
Instrukce, kterou překladač Pythonu může provést. Příkazy, které jsme dosud poznali jsou: přiřazení a příkaz tisku (print).
přiřazení (assignment)
Příkaz (=), který proměnné přiřadí hodnotu.
schema stavu (state diagram)
Grafické zobrazení řady proměnných a hodnot, na které tyto proměnné ukazují.
klíčové slovo (keyword)
Vyhražené slovo, které používá kompiler při analýze skladby programu; klíčová slova jako if, def, a while nemůžeme použít jako jména proměnných.
operátor (operator)
Specielní symbol, který představuje jednoduchý výpočet jako je sčítání, násobení, nebo zřetězení řetězců.
operand (operand)
Jedna z hodnot, s nimiž operátor pracuje.
výraz (expression)
Kombinace proměnných, operátorů a hodnot, které lze vyjádřit výslednou hodnotou.
vyhodnocení (evaluation)
Zjednodušení výrazu provedením operací, které jsou tak nahrazeny jednou hodnotou.
celočíselné dělení (integer division)
Operace, která dělí jedno celé číslo druhým celým číslem. Celočíselné dělení udává celým číslem kolikrát je dělenec dělitelný dělitelem; jakýkoliv zbytek se zanedbává.
pravidla pro pořadí důležitosti (rules of precedence)
Pravidla, určující pořadí v němž je prováděn výpočet výrazů obsahujících vícero operátorů a operandů.
zřetězit (concatenate)
Připojit těsně k sobě dva operandy.
kompozice (composition)
Spojení jednoduchých výrazů a příkazů do složených příkazů a výrazů za účelem stručné prezentace složitých výpočtů.
komentář (comment)
Informace v programu určená pro jiného programátora (či kohokoliv, kdo bude číst zdrojový kód), která nemá žádný vliv na provedení programu.

2.13 Cvičení

  1. Co se stane, když dáš příkaz k tisku přiřazení?
    >>> print n = 7
    
  2. A což toto?
    >>> print  7 + 5
    
    Nebo toto?
    >>> print 5.2, "toto", 4-2, 5/2.0
    
    Uměl bys formulovat obecné pravidlo o tom, co následuje po příkazu print ? Co příkaz print vrací?
  3. Použij větu: All work and no play makes Jack a dull boy. Každé slovo ulož do samostatné proměnné a potom větu vytiskni na řádek s použitím příkazu print.
  4. Přidej závorky k výrazu 6 * 1 - 2 tak, aby se změnila jeho hodnota ze 4 na 6.
  5. Připoj poznámku před první řádek předchozího kódu a sleduj, co se stane, když znovu spustíš program.
  6. Rozdíl mezi input a raw_input je ten, že input přijme hodnotu typu int, float, str a jejich typ nezmění, zatímco raw_input všechny typy přemění na typ str (případně unicode). Vyzkoušej si několik vstupů:
    >>> x = input()
    3.14
    >>> type()
    
    >>> x = raw_input()
    3.14
    >>> type()
    
    >>> x = input()
    'The knights who say "ni!"'
    >>> x
    
    Co se stane, když v posledním příkladě neuvedeme uvozovky?
    >>> x = input()
    The knights who say "ni!"
    >>> x
    
    >>> x = raw_input()
    The knights who say "ni!"
    >>> x
    
    Popiš a vysvětli oba výsledky.
  7. Za prompt překladače Pythonu zapiš houbes + 4. To vyvolá chybu:
    NameError: name 'houbes' is not defined
    
    (jméno 'houbes není definováno') Jménu houbes přiřaď takovou hodnotu, aby houbes + 4 bylo 10.
  8. Příklad 7. mi přijde nepřiměřeně náročný, a proto jej nepřekládám. Stránky, na které odkazuje, jsou však zábavné. Kdo trochu umí anglicky, může si zkusit http://madlibs.org.

comment up next how to englisch dex