Ricerca…


introduzione

Le espressioni condizionali, che includono parole chiave come if, elif e altro, forniscono ai programmi Python la possibilità di eseguire azioni diverse a seconda della condizione booleana: True o False. Questa sezione copre l'uso di condizionali Python, logica booleana e dichiarazioni ternarie.

Sintassi

  • <espressione> se <condizionale> altro <espressione> # Operatore ternario

se, elif, e altro

In Python puoi definire una serie di condizionali usando if per il primo, elif per il resto, fino al finale (opzionale) else per qualsiasi cosa non catturata dagli altri condizionali.

number = 5

if number > 2:
    print("Number is bigger than 2.")
elif number < 2:  # Optional clause (you can have multiple elifs)
    print("Number is smaller than 2.")
else:  # Optional clause (you can only have one else)
    print("Number is 2.")

Il Number is bigger than 2 uscite Number is bigger than 2

Usando else if invece di elif si innesca un errore di sintassi e non è permesso.

Espressione condizionale (o "Operatore ternario")

L'operatore ternario viene utilizzato per espressioni condizionali in linea. È meglio utilizzato in operazioni semplici e concise che sono facilmente leggibili.

  • L'ordine degli argomenti è diverso da molti altri linguaggi (come C, Ruby, Java, ecc.), Che possono portare a bug quando le persone che non hanno familiarità con il comportamento "sorprendente" di Python lo usano (potrebbero invertire l'ordine).
  • Alcuni lo trovano "ingombrante", poiché va contro il normale flusso del pensiero (pensando prima alla condizione e poi agli effetti).
n = 5

"Greater than 2" if n > 2 else "Smaller than or equal to 2"
# Out: 'Greater than 2'

Il risultato di questa espressione sarà come viene letto in inglese - se l'espressione condizionale è True, allora valuterà l'espressione sul lato sinistro, altrimenti, il lato destro.

Le operazioni di Tenary possono anche essere annidate, come qui:

n = 5
"Hello" if n > 10 else "Goodbye" if n > 5 else "Good day"

Forniscono anche un metodo per includere condizionali nelle funzioni lambda .

Se la dichiarazione

if condition:
    body

Le istruzioni if controllano la condizione. Se valuta su True , esegue il corpo dell'istruzione if . Se valuta su False , salta il corpo.

if True:
    print "It is true!"
>> It is true!

if False:
    print "This won't get printed.."

La condizione può essere qualsiasi espressione valida:

if 2 + 2 == 4:
    print "I know math!"
>> I know math!

Altra affermazione

if condition:
    body
else:
    body

L'istruzione else eseguirà il suo corpo solo se le istruzioni condizionali precedenti valgono tutte su False.

if True:
    print "It is true!"
else:
    print "This won't get printed.."

# Output: It is true!

if False:
    print "This won't get printed.."
else:
    print "It is false!"

# Output: It is false!

Espressioni logiche booleane

Le espressioni logiche booleane, oltre a valutare True o False , restituiscono il valore interpretato come True o False . È un modo Pythonic per rappresentare la logica che altrimenti richiederebbe un test if-else.


E l'operatore

L'operatore and valuta tutte le espressioni e restituisce l'ultima espressione se tutte le espressioni vengono valutate su True . Altrimenti restituisce il primo valore che restituisce False :

>>> 1 and 2
2

>>> 1 and 0
0

>>> 1 and "Hello World"
"Hello World"

>>> "" and "Pancakes"
""

O operatore

L'operatore or valuta le espressioni da sinistra a destra e restituisce il primo valore che restituisce True o l'ultimo valore (se nessuno è True ).

>>> 1 or 2
1

>>> None or 1
1

>>> 0 or []
[]

Valutazione pigra

Quando usi questo approccio, ricorda che la valutazione è pigra. Le espressioni che non devono essere valutate per determinare il risultato non vengono valutate. Per esempio:

>>> def print_me():
        print('I am here!')
>>> 0 and print_me()
0

Nell'esempio precedente, print_me non viene mai eseguito perché Python può determinare che l'intera espressione è False quando incontra lo 0 ( False ). Tieni questo a mente se print_me deve essere eseguito per servire la logica del tuo programma.


Test per più condizioni

Un errore comune durante il controllo di più condizioni consiste nell'applicare la logica in modo errato.

Questo esempio sta tentando di verificare se due variabili sono ciascuna maggiore di 2. L'istruzione viene valutata come - if (a) and (b > 2) . Questo produce un risultato inaspettato perché bool(a) valutato come True quando a non è zero.

>>> a = 1
>>> b = 6
>>> if a and b > 2:
...     print('yes')
... else:
...     print('no')
    
yes

Ogni variabile deve essere confrontata separatamente.

>>> if a > 2 and b > 2:
...     print('yes')
... else:
...     print('no')
        
no

Un altro errore simile viene fatto quando si controlla se una variabile è uno di più valori. L'affermazione in questo esempio è valutata come - if (a == 3) or (4) or (6) . Questo produce un risultato inaspettato perché bool(4) e bool(6) valutano ciascuno in True

>>> a = 1
>>> if a == 3 or 4 or 6:
...     print('yes')
... else:
...     print('no')
       
yes

Anche in questo caso ogni confronto deve essere effettuato separatamente

>>> if a == 3 or a == 4 or a == 6:
...     print('yes')
... else:
...     print('no')
        
no

Usare l'operatore in è il modo canonico per scrivere questo.

>>> if a in (3, 4, 6):
...     print('yes')
... else:
...     print('no')
    
no

Valori della verità

I seguenti valori sono considerati falsi, in quanto valutano False se applicati a un operatore booleano.

  • Nessuna
  • falso
  • 0 , o qualsiasi valore numerico equivalente a zero, ad esempio 0L , 0.0 , 0j
  • Sequenze vuote: '' , "" , () , []
  • Mappature vuote: {}
  • Tipi definiti dall'utente in cui i metodi __bool__ o __len__ restituiscono 0 o False

Tutti gli altri valori in Python valutano True .


Nota: un errore comune è semplicemente controllare la Falsità di un'operazione che restituisce valori Falsey diversi in cui la differenza è importante. Ad esempio, usando if foo() piuttosto che il più esplicito if foo() is None

Usando la funzione cmp per ottenere il risultato del confronto di due oggetti

Python 2 include una funzione cmp che consente di determinare se un oggetto è inferiore, uguale o superiore a un altro oggetto. Questa funzione può essere utilizzata per selezionare una scelta da un elenco basato su una di queste tre opzioni.

Supponiamo di dover stampare 'greater than' se x > y , 'less than' se x < y e 'equal' se x == y .

['equal', 'greater than', 'less than', ][cmp(x,y)]

# x,y = 1,1 output: 'equal'
# x,y = 1,2 output: 'less than'
# x,y = 2,1 output: 'greater than'

cmp(x,y) restituisce i seguenti valori

Confronto Risultato
x <y -1
x == y 0
x> y 1

Questa funzione è stata rimossa su Python 3. È possibile utilizzare la cmp_to_key(func) aiuto cmp_to_key(func) situata in functools in Python 3 per convertire le vecchie funzioni di confronto in funzioni chiave.

Valutazione dell'espressione condizionale usando le comprensioni degli elenchi

Python ti permette di hackerare le list comprehensions per valutare le espressioni condizionali.

Per esempio,

[value_false, value_true][<conditional-test>]

Esempio:

>> n = 16
>> print [10, 20][n <= 15]
10

Qui n<=15 restituisce False (che equivale a 0 in Python). Quindi, cosa sta valutando Python è:

[10, 20][n <= 15]
==> [10, 20][False] 
==> [10, 20][0]     #False==0, True==1 (Check Boolean Equivalencies in Python)
==> 10
Python 2.x 2.7

Il metodo __cmp__ integrato ha restituito 3 possibili valori: 0, 1, -1, dove cmp (x, y) ha restituito 0: se entrambi gli oggetti erano uguali 1: x> y -1: x <y

Questo può essere usato con le list comprehensions per restituire il primo (ovvero indice 0), il secondo (cioè indice 1) e l'ultimo (cioè indice -1) elemento della lista. Dandoci un condizionale di questo tipo:

[value_equals, value_greater, value_less][<conditional-test>]

Infine, in tutti gli esempi sopra Python valuta entrambi i rami prima di sceglierne uno. Per valutare solo il ramo scelto:

[lambda: value_false, lambda: value_true][<test>]()

dove l'aggiunta di () alla fine assicura che le funzioni lambda vengano solo chiamate / valutate alla fine. Pertanto, valutiamo solo il ramo scelto.

Esempio:

count = [lambda:0, lambda:N+1][count==N]()

Verificare se un oggetto è Nessuno e assegnarlo

Spesso vorrai assegnare qualcosa a un oggetto se è None , a indicare che non è stato assegnato. Useremo un aDate .

Il modo più semplice per farlo è usare il test is None .

if aDate is None:
    aDate=datetime.date.today()

(Nota che è più Pythonico a dire is None invece di == None .)

Ma questo può essere ottimizzato un po 'sfruttando l'idea che not None valuterà a True in un'espressione booleana. Il seguente codice è equivalente:

if not aDate:
    aDate=datetime.date.today()

Ma c'è un modo più pitonico. Il seguente codice è anche equivalente:

aDate=aDate or datetime.date.today()

Questo fa una valutazione del cortocircuito . Se aDate è inizializzato e not None è not None , viene assegnato a se stesso senza alcun effetto netto. Se is None , quindi datetime.date.today() viene assegnato a aDate .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow