2013-04-17 23 views
7

W Pythonie możemy to zrobić:Python - logiczny porządek ocena w "if"

if True or blah: 
    print("it's ok") # will be executed 

if blah or True: # will raise a NameError 
    print("it's not ok") 

class Blah: 
    pass 
blah = Blah() 

if blah or blah.notexist: 
    print("it's ok") # also will be executed 
  • Czy ktoś może wskazać mi dokumentacji na tej funkcji?
  • Czy jest to szczegół implementacji lub funkcja języka?
  • Czy to dobry styl kodowania do korzystania z tej funkcji?
+1

Opcja 'bla lub jeden true' nie wyjątek dla mnie, to drukuje. –

+0

Może to szczęście? –

+3

@ 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'. –

Odpowiedz

21

or i andzwarcie, 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.

5

ten nazywany jest zwarcie i jest cechą języka:

http://docs.python.org/2/tutorial/datastructures.html#more-on-conditions

operatorów logicznych and i or są tzw operatorów zwarcia: ich argumenty są oceniane od lewej do prawej, a ocena zatrzymuje się natychmiast po ustaleniu wyniku. Na przykład, jeśli A i C są prawdziwe, ale B jest fałszywe, A i B i C nie oceniają wyrażenia C. W przypadku użycia jako wartość ogólna, a nie jako wartość logiczna, zwracana wartość operatora zwarcia jest ostatnią oceniany argument.

2

To sposób operatorzy operatory logiczne, szczególnie or w pracy Pythona: krótka ocena obwód.

Aby lepiej wyjaśnić, należy rozważyć następujące kwestie:

if True or False: 
    print('True') # never reaches the evaluation of False, because it sees True first. 

if False or True: 
    print('True') # print's True, but it reaches the evaluation of True after False has been evaluated. 

Więcej informacji można znaleźć następujące:

1

W przypadku operatora or wartości są oceniane od lewej do prawej. Po uzyskaniu wartości jednej wartości do True, cała instrukcja będzie miała wartość True (więc nie zostaną ocenione żadne wartości).