Prawda czy fałsz ?
Python jako optymistycznie nastawiony do życia gad większość rzeczy ocenia pozytywnie. Zatem łatwiej sprawdzić co w Pythonie przyjmuje wartość logiczną ”False”, a cała resztę można taktować jako ”True”. Wydaje się proste. Pobawmy się zatem w zgadywanki „prawda czy fałsz”.
Lista składana
'prawda' if [x for x in range(10) if x > 20] else 'fałsz'
Odpowiedź: fałsz
Mamy tutaj listę składaną. Wydawało by się zatem, że taka lista powinna być raczej potraktowana jako ”True”. Problem w tym, że nasza lista jest pusta. Zauważcie, że powinna składać się z cyfr od 0 do 9 niestety z uwagi na warunek filtrujący if x > 20
żadna z nich nie trafi do końcowej listy. Pusta lista to ”False”.
Liczba zmiennoprzecinkowa
'prawda' if 0.0 else 'fałsz'
Odpowiedz: fałsz
I znowu wszystkie liczby zarówno zmiennoprzecinkowe jak i całkowite tłumaczone są przez Pythona jako ”True”. Wszystkie poza tą jedną. Zarówno zero „0” jak i jej odpowiednik „0.0” zostaną rozwiązane jako ”False”.
Kolejna kolekcja
'prawda' if (x for x in range(10) if x > 20) else 'fałsz'
Odpowiedź: prawda
Wydawało by się, że powyższy przykład jest analogiczny do już omówionej listy składanej. Nic bardziej mylnego. W obu przypadkach mamy puste kolekcje. Jak już wcześniej udowodniliśmy puste kolekcje takie jak listy czy zbiory oznaczają w Pythonie ”False”. Jednak w tym przypadku mamy do czynienia z generatorem. Czyli tak naprawdę sprawdzamy jak Python rozwiąże obiekt reprezentujący nasz generator. Oczywiście instancje klas rozwiązywane są jako ”True”.
Funkcja all
'prawda' if all([]) else 'fałsz'
Odpowiedź: prawda
To zachowanie funkcji ”all” może być dla niewtajemniczonych zaskoczeniem. Przypomnijmy, że ”all” zwraca ”True” jeśli wszystkie elementy kolekcji przekazanej jako parametr można rozwiązać jako ”True”. Jednak w tym konkretnym przypadku zaobserwowaliśmy drugą chyba mniej znaną właściwość funkcji ”all”. Otóż ”all” zwraca ”True” w przypadku przekazania pustej kolekcji.
Nasza własna klasa
class W: def __len__(self): return 0 'prawda' if W else 'fałsz'
Jak już wiesz puste kolekcje oznaczają w Pythonie ”False”. To, że kolekcja jest pusta znaczy, że jej długość jest równa zero. W naszym przykładzie posłużyliśmy się magiczną metodą ”len” by zasymulować taką sytuację. Spójrzmy teraz na odpowiedź:
Odpowiedź: prawda
Przyznam, że zagrałem tu troszkę podstępnie i nieczysto. Oczywiście obiekt klasy W został by potraktowany jako ”False”. Niestety w nasz przykład wdarł się mały błąd. Zamiast na instancji klasy sprawdziliśmy samą klasę W, co spowodowało zwrócenie słowa prawda.