2013-05-11 16 views
6

ho notato uno strano comportamento di Python espressioni 2,7 logiche:Strano conversione in logica Python espressioni

 
>>> 0 and False 
0 
>>> False and 0 
False 
>>> 1 and False 
False 
>>> False and 1 
False 

e con vere al posto di False

 
>>> 0 and True 
0 
>>> True and 0 
0 
>>> 1 and True 
True 
>>> True and 1 
1 

Ci sono delle regole quando Python convertire dichiarazione logica a intero? Perché mostra a volte 0 insted di False e 1 insted di True?

Per di più, perché restituisce questo?

 
>>>"test" or "test" 
'test' 
+1

'>>> bool ('x')' è 'True' –

risposta

7

Nulla viene convertito; gli operatori logici booleani di Python invece cortocircuito.

Vedere il boolean operators documentation:

L'espressione x and y valuta prima x; se x è falso, viene restituito il suo valore; in caso contrario, viene valutato e viene restituito il valore risultante.

L'espressione x or y prima valuta x; se x è true, viene restituito il suo valore; in caso contrario, viene valutato e viene restituito il valore risultante.

Inoltre, i numeri uguali a 0 sono considerati falsi, come lo sono stringhe e contenitori vuoti. Citando dal medesimo documento:

Nel contesto delle operazioni booleane, ed anche quando le espressioni vengono utilizzati da rendiconto controllo, i seguenti valori vengono interpretati come falso: False, None, numerico pari a zero di tutti i tipi, e vuota stringhe e contenitori (comprese stringhe, tuple, liste, dizionari, set e frozenset).

Combinando questi due comportamenti significa che per 0 and False, il 0 è considerato falso e restituiti prima di valutare l'espressione False. Per l'espressione True and 0, True viene valutato e trovato un valore vero, quindi viene restituito 0. Per quanto riguarda if e while e gli altri operatori booleani interessati, il risultato, 0 è considerato falso.

È possibile utilizzare questo per fornire un valore predefinito, ad esempio:

foo = bar or 'default' 

Per convertire in realtà un valore non booleano in un valore booleano, utilizzare il bool() type; utilizza le stesse regole di espressioni booleane per determinare il valore booleano dell'ingresso:

>>> bool(0) 
False 
>>> bool(0.0) 
False 
>>> bool([]) 
False 
>>> bool(True and 0) 
False 
>>> bool(1) 
True 

Per completare il quadro, i valori che non sono considerati falso in un contesto booleano vengono invece considerate vere, comprese le classi personalizzate. Puoi cambiarlo implementando uno .__nonzero__() special method sulla tua classe. Se non viene definito alcun metodo, viene anche consultato il numero .__len__(). Con uno di questi metodi è possibile segnalare che il proprio tipo è numerico e deve essere considerato True se diverso da zero, oppure è un contenitore e deve essere considerato True se non vuoto (ha una lunghezza superiore a 0).

+0

Ma perché" True e 0 "non sono False, ma 0? –

+2

@ bzxcv17: Ancora una volta, cortocircuito; la prima espressione ('True') è un valore vero, e quindi viene restituito il secondo valore. '0' è considerato falso, quindi per quanto riguarda' if' e 'while' e altri contesti booleani, si tratta di un valore falso. –

2

Questo perché 0 è il valore falsy stesso.

>>> bool(0) 
False 

>>> bool(1) 
True 

0 and True è 0 perché 0 è Falsy, AND condizione interrompe l'esecuzione non appena primo valore falsy si trova e restituisce il valore. Se tutti i valori erano True, viene restituito il valore più a destra.

OR continuerà a controllare i valori fino a quando prima True non è stato trovato altrimenti restituisce l'ultimo valore (righmtmost)

Dal docs:.

Qualsiasi oggetto può essere testato per valore di verità, per l'uso in una condizione if o while o come operando delle operazioni booleane di seguito. I seguenti valori sono considerati falsi:

  • Nessuno

  • False

  • zero di alcun tipo numerico, ad esempio, 0, 0L, 0.0, 0j.

  • qualsiasi sequenza vuota, ad esempio '',(), [].

  • qualsiasi mappatura vuota, ad esempio {}.

  • istanze di classi definite dall'utente, se la classe definisce un metodo __nonzero__() o __len__(), quando tale metodo restituisce lo zero intero o il valore bool False.

Tutti gli altri valori sono considerati veri - così oggetti di molti tipi sono sempre veri.

Le operazioni e le funzioni predefinite che hanno un risultato booleano restituiscono sempre 0 o False per false e 1 o True per vero, se non diversamente specificato. (Eccezione. Importante: le operazioni booleane o ed e del ritorno sempre uno dei loro operandi)

+0

E' >>> bool (1) 'è' True' –

+0

@GrijeshChauhan ah! si, ha aggiunto anche questo. –

+0

Ashwini dovresti aggiungere anche questo: >>> bool ('x') è True' e 'bool ('') è False' –

3

Python tornare sempre uno dei operando oggetti

and restituisce il primo oggetto "false" o l'oggetto finale "vero".

or restituisce il primo oggetto "vero" o l'oggetto "falso" finale.

notare che tutte le 0, 0.0, False, "" sono considerati come "false".

>>> "a" and "b" and "c" 
'c' 
>>> "a" or "b" or "c" 
'a'