přejít na obsah přejít na navigaci

Linux E X P R E S, Python 3 (4): výnimky a podmienky

Python 3 (4): výnimky a podmienky

python.png

Výnimky a podmienky nám umožňujú zabraňovať chybám a usmerňujú správny beh programu. Ukážeme si, ako predísť spadnutiu programu na chybe, vyhnúť sa nechceným výsledkom alebo rozhodnúť o pokračovaní behu programu.


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.

Ukážka príkladu Ukážka príkladu

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

tabulka.png

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 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.

Nahoru

Příspěvky

Python 3 (4): výnimky a podmienky
Wrunx 21. 05. 2015, 18:22:06
Odpovědět  Odkaz 
Dobré pokračování!
Mohu-li jen maličko přispět k těm binárním operacím, tak XOR v Pythonu supluje znaménko ^
>>>7^3
výsledek je 4
Případně - pokud se programátorovi nechce implementovat si XOR vlastní - je k dispozici v knihovně operator
>>> from operator import xor
>>>xor(7,3)
výsledek je 4.
Samosebou v Pythonu najdeme i bitový posun, SHL a SHR v podobě symbolů >.
Krom toho Python vlastní znaménko ~ (tilda) coby komplement, neboli doplněk.
>>> ~3
výsledek je -4
Python 3 (4): výnimky a podmienky
Wrunx 21. 05. 2015, 18:25:25
Odpovědět  Odkaz 
Oj, vidím že mi editor "sežral" dvojité šipečky, takže mám v příspěvku momentálně pěknou hloupost... no, co se dá dělat, takže bitové posuny prosím např. na http://www.tutorialspoint.com/python/bitwise_operators_example.htm
:-)
Python 3 (4): výnimky a podmienky
fd 25. 05. 2015, 15:57:41
Odpovědět  Odkaz 
Hmm ja bych pripodotkl, ze onen priklad s vyjimkou je presne pripad, za ktery bych osobne (a nejen osobne) kazdemu tvurci zlomil nejen ruce.

Protoze vstup MUSI byt osetren jeste PRED tim, nez se pouzije. A to VZDY. Duvod je pomerne primitivni a jasny - ta funkce ve ktere se vstup pouzije muze uplne klidne v mnoha pripadech projit, a to presto, ze vstup je zcela vadny. A spolehat se na to, ze nekde neco skonci vyjimkou ...

Nemluve o tom, ze to je jeden z mnoha krasnych zpusobu jak neco hacknout.
Python 3 (4): výnimky a podmienky
Pavel 29. 05. 2015, 16:05:28
Odpovědět  Odkaz 
Dík za články, snad ti to vydrží a dostaneš se daleko. Držím palce
Python 3 (4): výnimky a podmienky
jose 15. 09. 2015, 22:44:48
Odpovědět  Odkaz 
> finally .. a je vlastne jedno, či sa kód nachádza v danom bloku alebo mimo neho.

tak to si nemyslim, skuste si trebars toto:

try:
3/0
except ValueError as e:
print "chyba!"
finally:
print "finally blok"

print "ideme dalej"
Python 3 (4): výnimky a podmienky
Tom 7. 08. 2019, 16:10:52
Odpovědět  Odkaz 
Ještě k těm výjimkám, chybí tady jak ty výjimky vyvolávat
raise Exception("some exception text")

Přidat názor

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích a pravidlech najdete v nápovědě.
Diskuzi můžete sledovat pomocí RSS kanálu rss



 
 

Top články z OpenOffice.cz