V minulej časti sme si spravili prvý jednoduchý program, ktorý nám počítal obsah a objem kocky. Nieje však dostatočne ošetrený proti zadaniu nesprávnych údajov. Užívateľ momentálne môže zadať čokoľvek ako vstup, nielen číslo. A tak, pokiaľ by užívateľ zadal napríklad číslo slovom (jedenásť), vyskočilo by naňho niečo takéto:
Traceback (most recent call last): File "./second.py", line 4, in <module> a = int(inp) ValueError: invalid literal for int() with base 10: 'jedenásť'
Z tohto výpisu chyby vieme vyčítať, že práve na vypísanom riadku 4 v súbore s cestou ./second.py sa pri spracovaní vyskytla chyba s názvom ValueError, ktorá hovorí, že sme zadali zlý vstup 'jedenásť'
pre funkciu int()
. My však nechceme, aby toto uvidel užívateľ, a preto použijeme výnimku (anglicky exception), aby sme zabránili vypísaniu tejto chyby a namiesto toho spravili to, čo budeme chcieť my.
Pre zapísanie výnimiek používame anglické kľúčové slová try
, except
a voliteľne aj finally
. Tie používame s takýmto zápisom:
try: #something pass except: #something pass finally: #something pass
V bloku try
je priestor pre kód, v ktorom pri určitých okolnostiach môže nastať chyba. Python najprv spustí tento blok, a pokiaľ v ňom dôjde k akejkoľvek chybe, nebude ju vypisovať, ale namiesto toho spustí obsah bloku except
. V bloku except
tak môžeme chybu napríklad ošetriť alebo na ňu ľudským spôsobom upozorniť užívateľa, či ju zaznamenať do logu. Týchto blokov môžeme použiť aj viac, pričom pre každý jeden môžeme určiť, pri akej chybe sa má vykonať. Blok finally
je voliteľný, takže nemusí byť súčasťou zápisu výnimky. Kód nachádzajúci sa v tomto bloku sa vykoná bez ohľadu na to, či sa chyba stala alebo nie. Poďme si použitie ukázať na konkrétnom príklade:
#!/usr/bin/env python3 print("1/x=y") try: x = int(input("Zadajte x: ")) y = 1/x print("y=1/{}={}".format(x, y)) except ValueError: print("Prosím, zadávajte celé číslo.") except ZeroDivisionError: print("Delenie nulou nieje možné. Teoretický výsledok je nekonečno.") finally: print("Dovidenia!")
Pokiaľ teraz pri vstupe zadáme niečo iné, ako celé číslo, Python nám už nebude vypisovať ValueError, ale namiesto toho vypíše „Prosím, zadávajte celé číslo.“, čiže urobí to, čo sa nachádzalo v except
bloku pre chybu ValueError. To isté platí aj pre delenie nulou, kedy sa spustí obsah bloku pre túto chybu. Obsah bloku finally
sa vykoná vo všetkých prípadoch a je vlastne jedno, či sa kód nachádza v danom bloku alebo mimo neho.
Výnimku teraz môžeme aplikovať aj do nášho jednoduchého programu tak, aby sa pri zadaní chybného nečíselného vstupu zobrazilo naše upozornenie a nie Python chyba.
#!/usr/bin/env python3 inp = input("Zadajte dĺžku strany kocky (bez jednotiek): ") try: a = int(inp) volume = a**3 surface_area = 6*a**2 print("Objem kocky je: {}".format(volume)) print("Príklad: {a}^3={result}".format(a=a, result=volume)) print("Povrch kocky je: {}".format(surface_area)) print("Príklad: 6×{a}^2={result}".format(a=a, result=surface_area)) except ValueError: print("Zadávajte celé číslo.")
Podmienky
Podmienky sú základným prvkom pre vetvenie programov. Keďže väčšinou od programu vyžadujeme, aby sa takpovediac samostatne rozhodoval podľa určených pravidiel, musíme mu najprv tieto pravidlá nejakým spôsobom definovať. Vieme určiť, čo sa má vykonať a pri akých okolnostiach.
Porovnávacie a logické operátory
Predtým, ako sa dostaneme k samotnému tvoreniu podmienok, vráťme sa na chvíľu do interpreteru, kde si ukážeme, ako môžeme v Pythone porovnávať alebo vykonávať logické operácie, a tak vytvárať výrazy, ktoré nadobudnú jednu z dvoch možných pravdivostných hodnôt True (pravda) alebo False (nepravda). Najprv sa pozrime na klasické matematické porovnávacie operátory, ktoré ukážem v okomentovanom výstupe interpretera:
>>> 5 == 5 # 5 sa rovná 5 True >>> 3 != 3 # 3 sa NErovná 3 False >>> 9 > 4 # 9 je väčší ako 4 True >>> 8 < 0 # 8 je menší ako 0 False >>> 7 >= 5 # 7 je väčší alebo sa rovná 5 True >>> 6 <= 6 # 6 je menší alebo sa rovná 6 True
Porovnávať môžeme aj iné dátový typy ako čísla:
>>> "98" > "009" True >>> "Ahoj" > "Dobrý deň" False >>> ["Lorem Ipsum"] <= ["a", 4, 5, (7, 8)] True >>> True < False False >>> True > False True
Špeciálnym porovnávacím operátorom je is, ktorý porovnáva, či sa jedná o zhodné objekty. Objektovosť Pythonu som vysvetľoval v druhej časti seriálu, kedy som pre porovnanie totožnosti dvoch objektov získaval id oboch objektov. is porovnávací operátor, ktorý porovnáva práve id každého z objektov.
>>> a = "Totožný reťazec" >>> b = "Totožný reťazec" >>> a == b True >>> a is b False >>> id(a) == id(b) False
Logické operátory v Pythone nájdete len tri, a to and, or a not. Fungovanie si znovu ukážeme na komentovanom príklade:
>>> a = True >>> b = False >>> a and b # pokiaľ je a pravdivé, vráti b False >>> a and True # pokiaľ je a pravdivé, vráti b (teraz sme ho nahradili True) True >>> a and b # pokiaľ je a pravdivé, vráti b, inak vráti a False >>> "slovo" and "dve slová" # vracia "dve slová", pretože string obsahujúci aspoň jeden znak má vždy pravdivostnú hodnotu True 'dve slová' >>> bool("slovo") True >>> a or b # pokiaľ je a pravdivé, vráti a, inak vráti b True >>> "slovo" or "dve slová" 'slovo' >>> not a # negácia: vráti obrátenú pravdivostnú hodnotu a False >>> not "slovo" False
Tabuľka hodnôt sa zhoduje s tabuľkou pre operátory/výrokové spojky logiky: konjunkcia (and), disjunkcia (or) a negácia (not):
Podmienky
Vo väčšine programovacích jazykoch sa pri tvorení podmienok používa zápis typu: ak platí x, sprav y, pričom Python nieje výnimkou. V Pythone sa ako kľúčové slovo používa preklad slovíčka „ak“ do angličtiny, čiže if. Za if nasleduje nejaký výraz, ktorý nadobudne jednu z dvoch možných pravdivostných hodnôt dátového typu Boolean (True/False), alebo napríklad nejaká premenná s touto zapísanou hodnotou. Riadok začínajúci if zakončuje dvojbodka, tak ako tomu bolo aj pri výnimkách, a tak tomu bude aj pri cykloch, funkciách, triedach atď. V nasledujúcich riadkoch zvyčajne osadených o 4 medzery sa nachádza kód, ktorý sa má vykonať v prípade, že je výraz pravdivý (True), čiže podmienka splnená.
a = int(input("Zadajte celé číslo: ")) if a > 0: # ak je a väčšie ako 0 sprav: print ("{} je kladné číslo.".format(a))
Výstup:
$ python3 fourth.py Zadajte celé číslo: 8 8 je kladné číslo $ python3 fourth.py Zadajte celé číslo: -5
Ďalším kľúčovým slovom v podmienkach je else – inak. V else bloku sa nachádza kód, ktorý sa má vykonať, pokiaľ nieje splnená podmienka.
a = int(input("Zadajte celé číslo: ")) if a > 0: print ("{} je kladné číslo.".format(a)) else: print ("{} nieje kladné číslo.".format(a))
Výstup:
$ python3 fourth.py Zadajte celé číslo: 10 10 je kladné číslo. $ python3 fourth.py Zadajte celé číslo: -98 -98 nieje kladné číslo.
Ak chceme vytvoriť viacej podmienok na jednom mieste, zvyčajne týkajúcich sa jednej veci, vytvoríme blok za pomoci kľúčového slova, ktoré je tak-trochu skomoleninou else a if: elif. Podmienkové bloky elif vkladáme medzi if a else blok a môžeme ich vytvoriť koľko potrebujeme.
a = int(input("Zadajte celé číslo: ")) if a > 0: print ("{} je kladné číslo.".format(a)) elif a == 0: print ("{} je nula.".format(a)) else: print ("{} je záporné číslo.".format(a))
Výstup:
$ python3 fourth.py Zadajte celé číslo: 3 3 je kladné číslo. $ python3 fourth.py Zadajte celé číslo: -45 -45 je záporné číslo. $ python3 fourth.py Zadajte celé číslo: -0 {} je číslo rovné nule.
V prípade nášho programu na počítanie objemu a obsahu kocky nám stačí vytvoriť len jednoduchú podmienku. Možností, ako tú podmienku formulovať, máme viacero.
#!/usr/bin/env python3 inp = input("Zadajte dĺžku strany kocky (bez jednotiek): ") try: a = int(inp) except ValueError: exit("Zadávajte celé číslo.") # zastaví program a vypíše určený text if 0 > a: exit("Zadávajte kladné čislo.") volume = a**3 surface_area = 6*a**2 print("Objem kocky je: {}".format(volume)) print("Príklad: {a}^3={result}".format(a=a, result=volume)) print("Povrch kocky je: {}".format(surface_area)) print("Príklad: 6×{a}^2={result}".format(a=a, result=surface_area))
Ukážka fungovania vylepšenej verzie second.py
Záver
Ani takéto riešenie však samozrejme nieje najideálnejšie, ale je funkčné. V ďalších častiach si budeme náš jednoduchý program postupne vylepšovať a nabudúce nás čakajú cykly while a for.