2013-04-24 10 views
8

Se si dispone di un'istruzione if in cui vengono valutate più variabili o funzioni, in quale ordine vengono valutate?In quale ordine è un'istruzione if valutata in Python

if foo > 5 or bar > 6: 
    print 'foobar' 

In questo caso specifico, sarà Foo essere valutati contro il cinque e poi bar contro il 6 (da sinistra a destra) oppure sarà valutata destra a sinistra? Suppongo che uno or e and sia valutato nello stesso ordine.

+3

Questo non ha nulla a che fare con l'ordine di valutazione di una dichiarazione 'if', ma con l'ordine di valutazione di un'espressione' o'. Ottieni esattamente le stesse regole per 'x = (pippo> 5 o bar> 6)', o, per giunta, solo 'pippo> 5 o bar> 6' come un'istruzione a parte. – abarnert

+2

Prova a giocare e guarda cosa succede. Come quello che sarebbe il risultato di questo;) "se Vero o Falso e Falso e Falso o Falso:" –

risposta

18

La clausola di sinistra verrà valutata per prima e quindi quella di destra solo se la prima è False.

Per questo motivo è possibile fare cose come:

if not person or person.name == 'Bob': 
    print "You have to select a person and it can't be Bob" 

Senza di esso rottura.

Viceversa, con una clausola and, la clausola destra viene valutato solo se il primo è True:

if person and person.name: 
    # ... 

Altrimenti un'eccezione sarebbe stato gettato quando person è None.

7

Sarà valutato da sinistra a destra.

>>> def a(): 
...  print 'a' 
...  return False 
... 
>>> def b(): 
...  print 'b' 
...  return False 
... 
>>> print a() or b() 
a 
b 
False 
>>> def c(): 
...  print 'c' 
...  return True 
... 
>>> print c() or a() 
c 
True 
1

or operatore cortocircuiti di Python e sarà valutata da sinistra a destra:

if (foo > 5) or (bar > 6): 
    print 'foobar' 

Se foo > 5, quindi bar > 6 sarà nemmeno essere testato, come True or <anything> sarà True. Se foo non è > 5, verrà testato il bar > 6.

3

Per espandere la spiegazione di Blender un po 'più lontano, l'operatore or ha qualcos'altro built-in:

<expression A> or <expression B> 

Questo valuterà expression A prima; se viene valutato su True, l'operatore restituisce expression A. Quindi 5 or <something> restituirà 5 come 5 valutazioni a True.

Se expression A restituisce False, viene restituito expression B. Quindi 0 or 5 restituirà 5 perché 0 restituisce False.

Naturalmente è possibile catena di questo tanto quanto si vuole:

<expr 1> or <expr 2> or <expr 3> or ... or <expr n> 

In generale, or restituirà il prima un'espressione che restituisce True, ma mantenere il suo valore originale. Se non esiste alcuna espressione che restituisce True, verrà semplicemente restituita l'ultima espressione (che restituisce False).

L'operatore and funziona in modo simile ma inverso. Restituisce l'espressione prima che viene valutata su False, ma mantiene il suo valore originale. Se non esiste un'espressione che restituisce False, verrà semplicemente restituita l'ultima espressione (che verrà valutata in True).

Ad esempio, sia 0 and 5 e 5 and 0 tornerà 0 perché 0 viene valutato come False, ma 2 and 3 tornerà 3 perché 3 è l'ultima espressione e tutto viene valutato come True.

In qualsiasi modo (per tornare alla domanda): Tutte le espressioni vengono valutate da sinistra a destra e, se una regola dall'alto consente, ulteriori espressioni non verranno toccate.

Problemi correlati