A Pythonban minden objektum rendelkezik logikai igaz vagy hamis értékkel. Ez azt jelenti, hogy bármely objektumra elvégezhető a logikai értékvizsgálat. Egy objektum logikai értékét közvetlenül úgy kérdezhetjük le, hogy a vizsgált objektumot a bool() konstruktor zárójelei közé írjuk, és ennek eredményeképpen True vagy False értéket kapunk.
Alapértelmezésben minden objektum logikai igaz (True) értékkel rendelkezik. Ez alól kivételt képeznek:
- Az üres konténerek. Pl.: ”, (), [], {}, set(), frozenset(), bytes(), bytearray(), range(0).
- Bármelyik számtípus nulla értéke. Pl.: 0, 0.0, 0j, 0e0.
- A None és False konstansok, vagy ezeket eredményező kifejezések.
- Azok a saját készítésű objektumok, amelyeket a definíciójukban szándékosan False értékre állítunk a __bool__ metódus felülírásával.
Azzal, hogy az objektumok önmagukban is rendelkeznek igazságértékkel egyszerűsíthetjük a kódot és csökkenthetjük a hibázás lehetőségét. Ezt szemlélteti a következő példaprogram.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
a, b, c = [0,1,1,1,0,1,1], [4,5,6,8,10], {1,3,5,7} # Megoldás 1.-Nem használjuk ki az objektumok igazságértékét. # Ha a, b, c egyike sem üres, akkor fut le a ciklustörzs. while len(a)>0 and len(b)>0 and len(c)>0: e = a.pop() if e != 0: # Ha e nem 0, akkor fut le az if blokk kódja. f = b.pop() if f % 2 ==0 : c.pop() print(a, b, c) # Eredmény: # [0] [] set() a, b, c = [0,1,1,1,0,1,1], [4,5,6,8,10], {1,3,5,7} # Megoldás 2.-Kihasználjuk az objektumok igazságértékét. # Ha a, b, c egyike sem üres, akkor fut le a ciklustörzs. while a and b and c: e = a.pop() if e: # Ha e nem 0, akkor fut le az if blokk kódja. f = b.pop() if f % 2 == 0: c.pop() print(a, b, c) # Eredmény: # [0] [] set() |
Az 1. Megoldásban nem használtuk ki a konténerek és azok elemeinek igazságértékét sem a while ciklus leállási feltételében, sem az első if feltételének meghatározásakor. A 2. Megoldásban viszont kihasználtuk mindkét esetben, és látható, hogy kevesebbet kellett gépelni, ami a hibalehetőséget csökkenti, és egyszerűsödött a feltételek kódja, ami így jobban áttekinthető.
A __bool__ metódus felülírásával kapcsolatos tudnivalókról a Python tudásépítés lépésről lépésre című e-könyv „Konténerek megvalósítása” fejezetében tájékozódhatunk.