A feltételes kifejezést (vagy feltételes értékadást) a Pythonban többféleképpen is megvalósíthatjuk.
A klasszikus megoldás[]
Ez a C nyelv feltétel ? igazérték : hamisérték szerkezetének felel meg:
<igazérték> if <feltétel> else <hamisérték>
Példa:
minimum=a if a<b else b
A trükkös megoldás: listaelem kiválasztása[]
Azt használjuk ki, hogy a hamis logikai érték nullának, az igaz egynek felel meg, és ezzel indexeljük a kételemű listát. Példa a konzolról (a minimum kiválasztása másképp):
>>> a=7 >>> b=9 >>> print([b,a][a<b]) 7
Figyelem! Mivel a hamis logikai érték a nulla, ezért a listában a hamisértéket írtuk előre! (Tehát éppen fordítva, mint a klasszikus feltétes kifejezésben.)
Logikai műveletekkel[]
A Python a logikai műveleteket addig értékeli ki, amíg bizonyosságot nem nyer, tovább nem. Látni fogjuk a példák között, hogy a ki nem értékelt részben a nullával való osztás nem okoz hibát. Figyeljünk oda, hogy
- az alábbi kifejezések típusa függhet a változók értékétől!
- a példák azt mutatják, hogy – meglepő módon – az and és az or nem kommutatív!
A jobb olvashatóság érdekében üres sorokkal tagoltuk a példákat, a konzolon ezek közvetlenül egymás után jönnek. (Természetesen programszövegben is ugyanígy használhatjuk őket, kísérletezésre viszont kényelmesebb a konzol. Programszövegben értékadásban vagy print() függvényben használhatjuk a kifejezéseket, a puszta kifejezés hatására nem jelenik meg semmi a képernyőn.)
>>> x=6 >>> y=0 >>> y and x/y 0 >>> y or x/y Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: int division or modulo by zero >>> y!=0 and x/y False >>> y and x/y or 'Hiba!' 'Hiba!' >>> y=-3 >>> y and x/y -2.0 >>> y or x/y -3 >>> x/y and y -3 >>> x/y or y -2.0 >>> y!=0 and x/y -2.0 >>> y and x/y or 'Hiba!' -2.0 >>> a=7 >>> b=9 >>> a<b and a 7 >>> a>b and a False >>> a<b and a or b 7 >>> a>b and a or b 9
Egy példa: szótár olvasása hibaüzenet nélkül[]
Ebben a példában egy szótárban (asszociatív tömbben) tárolunk néhány telefonszámot. Ha olyant akarunk kiolvasni, amelyik nem létezik, KeyError kivételt kapunk – ezt akár elágazással, akár kivételkezeléssel kivédhetjük. De van egy harmadik módszer, amelyik egyszerre teszteli azt, hogy létezik-e a kulcs és hogy ahhoz rendeltünk-e létező értéket:
>>> telefon = { ... 'Jancsi' : '301234567', ... 'Juliska' : '201234567', ... 'Mama' : '', ... } >>> ember = 'Jancsi' >>> telefon[ember] '301234567' >>> ember = 'boszorka' >>> telefon[ember] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'boszorka' >>> ember = 'Mama' >>> telefon[ember] '' >>> def szám(ember): ... return ember in telefon and telefon[ember] or 'Nem tudjuk.' ... >>> for e in ['Jancsi','Juliska','Mama','boszorka']: ... print(e+':',szám(e)) ... Jancsi: 301234567 Juliska: 201234567 Mama: Nem tudjuk. boszorka: Nem tudjuk.
Az utolsó két sor megérdemel egy kis magyarázatot: a boszorkánál az első feltétel vált hamissá, mert nincs ilyen kulcs, Mamánál pedig a második, mert a kulcshoz tartozó érték egy üres string, amely ugyan definíció szerint nem azonos a hamis értékkel (a ''==False sor eredménye False), de feltételvizsgálatban mégis hamis értéket szolgáltat, szemben tetszőleges nem üres stringgel. Természetesen ha a Mama nem lenne elérhetetlen a gyerekek számára, Jancsi és Juliska nem kóborolna összevissza az erdőben, és nem jutna a boszorka karmai közé. Szűrjük le a tanulságot ebből!
Egyéb[]
Feltételes kifejezéseket készíthetünk lambdafüggvényekkel is.
Lásd még[]
- Elágazás
- Lambdafüggvény