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 PythonieFalse”. 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 funkcjiall” 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ść funkcjiall”. 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 PythonieFalse”. 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.