![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Ústředním pojmem programovacího jazyka Python je objekt ("všechno v Pythonu je objekt"). Objektem je míněna instance programové struktury, zvané třída (viz odst. 12.2).
Každý objekt má 3 základní vlastnosti:
"Nazdar světe!"
; celá čísla patří k typu int (integer) a výraz v uvozovkách k typu str (string) neboli řetězec.
Pokud si nejsme jisti, k jakému typu neboli třídě hodnota patří, zjistíme to vestavěnou funkcí type():
>>> type("Hello, World!") <class 'str'> >>> type(17) <class 'int'>
Významy pojmů třída a funkce budou vysvětleny v samostatných kapitolách. Vestavěná funkce je součástí programového vybavení Pythonu.
Víme již, že řetězce (strings) patří k typu str a celá čísla (integers) k typu int. Čísla s desetinnou čárkou (či tečkou) patří k typu označeném jako float, protože tato čísla jsou vyjádřena formátem zvaným plovoucí desetinná čárka (floating-point).
>>> type(3.2) <class 'float'>
A což hodnoty jako "17" a "2.3"? Vypadají jako čísla, ale jsou v uvozovkách.
>>> type("17") <class 'str'> >>> type("3.2") <class 'str'>
Jsou to tedy řetězce.
Řetězce mohou být v Pythonu uzavřeny v jednoduchých ('), dvojitých (") nebo i trojitých uvozovkách.
>>> type('Toto je retiazka.') <class 'str'> >>> type("A toto taky.") <class '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.
Jedním z nejmocnějších rysů programovacího jazyka je jeho schopnost používat proměnné. Proměnná je jméno, které ukazuje na nějakou hodnotu. Na rozdíl od jiných programovacích jazyků nelze v Pythonu deklarovat název a typ proměnné bez současného určení její hodnoty. Deklarace proměnné tedy spočívá v zadání názvu a jemu přiřazené hodnoty. Typ hodnoty je doplněn automaticky.
Příkaz přiřazení tedy přiřazuje hodnotu ke jménu proměnné:
>>> n = 17 >>> pi = 3.14159 >>> message = "What's up, Doc?"
Znak přiřazení (=) by neměl být chápán jako "je totožno"
, protože pro tento vztah se používá znak ==.
Znak přiřazení spojuje jméno na levé straně s hodnotou
na pravé straně. Vytvoříme chybu, když napíšeme:
>>> 17 = n
Grafické vyjádření vztahů je méně zavádějící:
Názvy proměnných (zde n, pi, message
) odkazují na různé hodnoty (instance tříd), vytvořené ve shodě s definicemi příslušných tříd.
Zobrazené souvztažnosti můžeme vyjádřit slovy: "proměnné n je přiřazena hodnota 17" nebo "n odkazuje na objekt 17". Nikdy neřekneme "n rovná se 17".
Název proměnné lze použít ve funkci print:
>>> print(message) What's up, Doc? >>> print(n) 17 >>> print(pi) 3.14159V konzole (nikoliv ve skriptu) se obejdeme i bez funkce print:
>>> message What's up, Doc?
Ve všech případech je výsledkem hodnota proměnné. Typ proměnné můžeme zjistit dotazem v překladači. Proměnná má typ hodnoty, jež jí je přiřazena:
>>> type(message) <class 'str'> >>> type(n) <class 'int'> >>> type(pi) <class 'float'>
Změna přiřazení
Stejné proměnné lze postupně přiřazovat různé hodnoty:
>>> bruce = 5
>>> bruce
5
>>> bruce = 7
>>> print(bruce)
7
Nové přiřazení ruší přiřazení předchozí.
Aktualizace proměnné
Nejběžnější formou změny přiřazení je aktualizace, kdy nová hodnota proměnné závisí na její předchozí hodnotě, například:
x = 6 # inicializace print(x) # --> 6 x = x + 1 # aktualizace print(x) # --> 7
Aktualizace proměnné přičtením hodnoty 1 se nazývá increment, aktualizace odečtením hodnoty 1 se nazývá decrement. Aktualizovaná proměnná musí mít předem přiřazenou počáteční hodnotu (viz inicializace).
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. Podtržítko na počátku názvu mívá speciální význam, takže jej zatím raději takto nepoužívejte.
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 čtyři klíčová slova:
and as assert break class continue
def del elif else except exec
finally for from global if import
in is lambda nonlocal not or
pass raise return try while with
yield True False None
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č.
Datový typ je jedním z trojice tří základních atributů objektu (ID, typ, hodnota), jenž je ve skutečnosti názvem třídy, jíž je daný objekt instancí (viz odst. 12.2). Jinak řečeno: atribut objektu zvaný "typ", je název třídy, z níž je objekt (neboli `instance`) odvozen.
Níže uvádíme stručný přehled datových typů (tříd) jazyka Python, z nichž zpočátku budeme používat jenom některé:
Hodnoty některých typů lze po jejich vytvoření dodatečně změnit; říkáme, že jsou měnitelné neboli mutable: list, set, dict
Hodnoty některých typů po jejich vytvoření dodatečně změnit nelze; říkáme, že jsou neměnitelné neboli immutable: int, float, complex, str, bytes, tuple, frozen set.
Všechny názvy typů kromě NoneType
jsou zároveň i názvy vestavěných funkcí - viz zde.
Změna typu neboli konverze se provádí pomocí několika vestavěných funkcí. Funkce
int například přjímá libovolnou hodnotu a je-li to možné, přemění ji na typ integer
:
>>> int("32") 32 >>> int("Hello") ValueError: invalid literal for int(): Hello
Funkce int také přemění hodnotu typu float
(desetinné číslo) na integer, ale v tom případě
odsekne desetinnou část čísla:
>>> int(3.99999) 3 >>> int(-2.3) -2 >>> int(1.0) 1
Funkce float přemění celá čísla a řetězce na čísla v plovoucí čárce:
>>> float(32) 32.0 >>> float("3.14159") 3.14159 >>> float(1) 1.0
Může se zdát divné, že Python rozlišuje mezi celočíselnou hodnotou 1 a desetinnou hodnotou 1.0. Obě hodnoty představují stejné číslo, ale patří k rozdílným datovým typům.
Funkce str přemění zadaný argument na typ řetězec:
>>> str(32) '32' >>> str(3.14149) '3.14149' >>> str(True) 'True' >>> str(true) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'true' is not defined
Operátory jsou specielní symboly, které reprezentují výpočty jako sčítání, násobení a dělení. 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 5**2 (5+9) * (15-7)
Symboly +, - a kulaté závorky znamenají v Pythonu totéž co v matematice. Hvězdička * je symbol pro násobení, ** je symbol pro umocňování a / je symbol pro dělení.
>>> 4*3 / 2 6.0 >>> 2**3 8
Objeví-li se na místě operandu proměnná
, je zaměměna za svou hodnotu před tím, než se operace
provede.
Operátor // je operátorem celočíselného dělení.
>>> minute = 59 >>> minute // 60 0
Při celočíselném dělení zaokrouhluje Python dolů a to i v těch případech, kdy jeden z operandů je ve formátu float
.
>>> minute // 60.0 0.0
Operátor modulo pracuje s celými čísly (číselnými výrazy) a poskytuje zbytek při dělení prvního operandu druhým. V Pythonu jej označujeme znakem pro procento (%). V pořadí operací má stejnou preferenci jako násobení.
>>> q = 7 // 3 # operátor celočíselného dělení >>> print(q) 2 >>> r = 7 % 3 # operátor modulo (určení zbytku) >>> print(r) 1
Ukazuje se, že modulo operátor je překvapivě užitečný. Na příklad, můžeme zjistit, zda jedno číslo je dělitelné druhým: je-li x % y == 0, pak x je dělitelné číslem y.
Lze jím také oddělit krajní číslice zprava od zadaného čísla. Například, x % 10 vyčlení nejkrajnější číslici čísla x zprava (při základu 10). Podobně x % 100 vyčlení dvě poslední číslice.
Použití operátoru % si ukážeme na pěkném příkladu převodu vteřin na hodiny, minuty a zbývající vteřiny:
secs_celk = int(input("Kolik vteřin celkem?")) hodiny = secs_celk // 3600 secs_navic = secs_celk % 3600 minuty = secs_navic // 60 sekundy = secs_navic % 60 print("Celkem vteřin: ", secs_celk) print("Hodin, minut, vteřin: ", hodiny, minuty, sekundy)
Logické operátory jsou tři: and , or a not. Jak vidíme, jsou to zároveň klíčová slova. Význam těchto operátorů je podobný jejich významu v češtině (a, nebo, ne). Například, výrazy x > 0 and x < 10 jsou pravdivé pouze tehdy, jsou-li pravdivá obě tvrzení, to jest, je-li x větší než 0 a menší než 10.
Tvrzení n%2 == 0 or n%3 == 0 je pravdivé, je-li alespoň jedna z podmínek pravdivá, to jest, je-li číslo dělitelné dvěma nebo třemi.
Konečně, operátor not neguje následující výraz
, takže not(x > y) je pravda, je-li
x > y nepravda; to jest je-li x menší nebo rovno y.
Pythonovský typ pro uložení hodnoty True nebo False zvaný bool je pojmenován po britském matematikovi George Booleovi, jenž vytvořil tak zvanou booleovu algebru, která je základem moderní počítačové aritmetiky.
Jsou pouze dvě booleovské hodnoty: True a False. Velká počáteční písmena jsou důležitá, neboť true a false booleovskými hodnotami nejsou.
>>>type(True) <class 'bool'> >>>type(true) Traceback (most recent call last): >>File "<stdin>", line 1, in <module> NameError: name 'true' is not defined
Booleovský výraz je výraz, který vede k boooleovské hodnotě. Operátor == (je totožné) porovná dvě hodnoty a předá booleovskou hodnotu:
>>> 5 == 5 True >>> 5 == 6 False
Operátor == je jedním z relačních operátorů, dalšími jsou tyto:
x != y # x není totožné y x > y # x je větší než y x < y # x je menší než y x >= y # x je větší nebo rovno y x <= y # x je menší nebo rovno y
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 anglicky):
>>> 2**3**2 512
Příkaz je instrukce, kterou může překladač provést. Samotný příkaz však neprodukuje žádný výstup. Dosud jsme poznali pouze příkaz přířazení =. V krátké době se seznámíme s příkazy while, for, if a import. Jak vidíme, jsou to také klíčová slova.
Výraz je kombinace hodnot, proměnných, operátorů a případně i volaných funkcí. Zapíšeme-li výraz na příkazový řádek, překladač jej vyhodnotí a zobrazí výsledek.
>>> 1 + 1
2
>>> len("hello")
5
V ukázce vidíme vestavěnou funkci len, která vrací délku zadané sekvence, v tomto případě délku řetězce. Po print a type je to třetí ukázka vestavěné funkce.
Vyhodnocení výrazu dává hodnotu a proto se výrazy mohou vyskytovat jen na pravé straně příkazu přiřazení. Hodnota sama o sobě je jednoduchý výraz, stejně jako proměnná.
>>> x = 5+3 >>> x 8 >>> 17 17
Pro vkládání údajů do programu z klávesnice se používá funkce input(). V konzole nebo ve skriptu zadáme
>>> n = input("Zadejte své jméno: ")
načež se na novém řádku zadá vstup, nebo pokud tuto záležitost řešíme v PyScripteru (či skriptu), otevře se nám následující okno, do kterého svůj vstup zapíšeme:
>>> m = int(input("Zadejte svůj věk: "))
Výzva v závorce je nepovinná, pokud je uvedena, zobrazí se v dialogovém okně či na příkazovém řádku.
n = n + 1
>>> print(n = 7)
>>> print(7 + 5)
Nebo toto?
>>> print(5.2, "toto", 4-2, 5/2.0)
All work and no play makes Jack a dull boy.
Každé slovo uložte
do samostatné proměnné a potom větu vytiskněte na jeden řádek s použitím funkce
print().
NameError: name 'houby' is not defined(jméno 'houby není definováno') Jménu houby přiřaďte takovou hodnotu, aby houby + 4 bylo 10.
Co se stalo s posledním příkladem a proč? Měl-li jste všechny výsledky kromě posledního správně, můžete jít dál. Pokud ne, sestavte si vlastní příklady a pohrávejte si s modulo operátorem tak dlouho, dokud mu zcela neporozumíte.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |