![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
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.
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.
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č.
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.
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.
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.
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):
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.
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
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.
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í.
n = n + 1
>>> print n = 7
>>> 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í?
>>> 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.
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.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |