or
i and
zwarcie, zobacz dokumentację Boolean operations:
Wyrażenie x and y
ocenia najpierw x
; jeśli x
ma wartość false, zwracana jest jego wartość; w przeciwnym razie wartość y
jest obliczana, a wynikowa wartość jest zwracana.
Wyrażenie x or y
najpierw ocenia x
; jeśli x
ma wartość true, zwracana jest jego wartość; w przeciwnym razie wartość y
jest obliczana, a wynikowa wartość jest zwracana.
Uwaga jak na and
, y
jest oceniano tylko jeśli x
ma wartość true. Odwrotnie, dla or
, y
jest oceniany tylko wtedy, gdy x
jest oceniany jako wartość fałszu.
Dla pierwszego wyrażenia True or blah
oznacza to, że blah
nigdy nie jest oceniany, ponieważ pierwsza część to już True
.
Ponadto niestandardowe Blah
klasa jest uważany Prawda:
W kontekście operacji logicznych, a także wtedy, gdy wyrażenia są używane przez rachunku przepływów sterowania, następujące wartości są interpretowane jako fałsz: False
, None
, numeryczne zero wszystkich typów oraz puste ciągi i kontenery (w tym łańcuchy, krotki, listy, słowniki, zestawy i frozensety). Wszystkie pozostałe wartości są interpretowane jako prawdziwe. (Patrz specjalnej metody __nonzero__()
sposobu, aby to zmienić.)
Ponieważ klasa nie wdrożyć __nonzero__()
metody (ani metody __len__
), uważa się True
miarę wyrażenia boolowskie są zainteresowane.
W wyrażeniu blah or blah.notexist
, blah
jest zatem prawdziwe, a blah.notexist
nigdy nie jest oceniane.
Ta funkcja jest używana dość regularnie i skutecznie przez doświadczonych programistów, najczęściej określić domyślne:
some_setting = user_supplied_value or 'default literal'
object_test = is_it_defined and is_it_defined.some_attribute
Czy uważać na te i łańcuchowym użyć conditional expression zamiast w stosownych przypadkach.
Opcja 'bla lub jeden true' nie wyjątek dla mnie, to drukuje. –
Może to szczęście? –
@ TIMS .: tylko jeśli zdefiniujesz 'blah' * first *. Zauważ, że 'blah' jest * jeszcze nie zdefiniowane * u góry przykładu, więc zamiast tego powstaje' NameError'. –