2012-05-06 11 views
7

Sono confuso su come Python valuta le istruzioni booleane.Operazioni booleane

Per es.

False and 2 or 3 

restituisce 3

Come viene valutato questo? Pensavo che Python prima guardasse 'False and 2' e restituisse False senza nemmeno guardare 'o 3'. Qual è l'ordine di ciò che Python vede qui?

Un altro è:

1 or False and 2 or 2 and 0 or 0 

restituisce 1

Da quello che ho raccolto dal primo esempio, ho pensato Python valuterà da sinistra a destra, in modo da '1 o Falso' sarebbe tornato 1, quindi '1 e 2' restituirebbero 2, quindi '2 o 2' restituirebbero il primo 2, quindi '2 e 0' restituirebbero 0, quindi '0 o 0' restituirebbero il secondo 0.

Come è possibile dimmi che sono abbastanza perplesso qui, per favore aiuto!

Grazie!

risposta

9

and ha precedenza superiore a or.

False and 2 or 3 

è valutato come

((False and 2) or 3) 

Poiché la prima parte (False and 2) è False, Python deve valutare la seconda parte per vedere se l'intera condizione può ancora diventare True o meno. Può, poiché 3 restituisce True quindi viene restituito questo operando.

simili per 1 or False and 2 or 2 and 0 or 0 che viene valutato come

(1 or ((False and 2) or ((2 and 0) or 0))) 

Da 1 viene valutato come True, l'intera condizione sarà True, non importa quale valutare gli altri operandi hanno.Python può smettere di valutare a questo punto e, di nuovo, restituisce l'operando che determina il valore finale.

arresto già nel risultato finale viene determinato è chiamato short-circuit evaluation e può essere descritto come segue:

Qualora il risultato finale dell'espressione è determinato, la valutazione viene arrestata e in Python il valore dell'operando che determina il valore finale viene restituito. Cioè, supponendo una valutazione da sinistra a destra:

  • per l'operatore and, più a sinistra operando che restituisce False (o l'ultimo)
  • per l'operatore or, più a sinistra operando che restituisce True (o l'ultimo)
+0

Ah quindi qualsiasi confronto con e dovrebbe essere racchiuso tra parentesi. Cosi ha molto piu senso. Come sapevi fare (1 o (((False e 2) o (2 e 0)) o 0)) invece di (1 o (False e 2) o (2 e 0) o 0)? – kkSlider

+1

@kkSlider Solo se è necessario modificare l'ordine di precedenza o renderlo più chiaro, proprio come nella normale matematica. Il bracketing eccessivo renderà il tuo codice meno chiaro. Per quanto riguarda il tuo esempio. è una questione di quale sia la logica per la tua situazione. –

+0

@kkSlider: non deve essere se non si desidera applicare un determinato ordine. Ma deve se vuoi valutare l'espressione come 'False e (2 o 3)'. * modifica: * cosa @Lattyware ha detto :) –

3

Il problema qui è che c'è un ordine di valutazione e and has a higher precedence than or. In quanto tali, vengono valutati da sinistra a destra qui.

Detto questo, False and 2 or 3 è, al pitone, (False and 2) or 3 - così si valuta a False or True, poi a True.

Nella tua prossima esempio, Python cortocircuiti, così 1 or False viene valutato come True come 1 fa, e restituisce quindi 1. Il resto non viene mai valutato. Questo ha senso come se l'una parte di un or è True, sai che tutto deve essere - quindi perché preoccuparsi di fare lavori extra?

Un buon modo per verificare questo è quello di definire le funzioni che la stampa:

>>> def test(x): 
...  print("Test: "+str(x)) 
...  return x 
... 
>>> test(1) or test(0) or test(3) 
Test: 1 
1 
>>> test(0) or test(0) or test(3) 
Test: 0 
Test: 0 
Test: 3 
3 
>>> test(False) and test(2) or test(3) 
Test: False 
Test: 3 
3 
>>> test(1) or test(False) and test(2) or test(2) and test(0) or test(0) 
Test: 1 
1 

In questo modo è facile vedere ciò che viene valutato, e in quale ordine.

2

ho letto su questo un po 'indietro sulla pagina docs pitone. Se lo trovo, posterò il riferimento. Ha dichiarato qualcosa sulla falsariga di, in un'istruzione booleana, Python restituirà il primo oggetto True. Quindi ... il e fu pre-falsificato con False, ma il o aveva solo un argomento, che era 3 (Vero).

+0

Ho avuto qualche brutta digitazione qui, ma sì, come altri hanno già detto, il primo passo è l'ordine della precedenza booleana, e il prossimo è che Python non restituirà solo un True o Falso per l'istruzione, ma il valore effettivo (che potrebbe avere un valore Vero o Falso). – jheld

2

Si è valutato così:

result = (False and 2) or 3 

Quindi, in pratica, se è vero False and 2-ish, allora viene restituito, altrimenti 3 viene restituito.