Python fornisce operatori logici per eseguire operazioni logiche (booleane).(and
,or
,not
)
Si usa per descrivere la relazione tra più condizioni in una dichiarazione if.
Questa sezione descrive quanto segue.
- intersezione:
and
- aggiunta logica:
or
- negazione:
not
and
,or
,not
Precedenza dell'operatore
Inoltre, i seguenti punti sono spiegati come precauzioni.
- Operatori logici per oggetti di tipo diverso da bool
and
,or
Questi valori di ritorno non sono necessariamente di tipo bool.- Corto circuito (valutazione del corto circuito)
intersezione: and
e restituisce il prodotto logico di due valori.
print(True and True)
# True
print(True and False)
# False
print(False and True)
# False
print(False and False)
# False
Infatti, viene spesso usato non per vero o falso, ma per espressioni condizionali che usano operatori di confronto. Per vostra informazione, gli operatori di confronto sono i seguenti.
<
>
a = 10
print(0 < a)
# True
print(a < 100)
# True
print(0 < a and a < 100)
# True
e possono essere concatenati come segue.
print(0 < a < 100)
# True
aggiunta logica: or
o restituisce l'OR logico dei due valori.
print(True or True)
# True
print(True or False)
# True
print(False or True)
# True
print(False or False)
# False
negazione: not
not” restituisce la negazione del valore; vero e falso sono invertiti.
print(not True)
# False
print(not False)
# True
and,or,notPrecedenza dell'operatore
L'ordine di precedenza di questi operatori logici è il seguente: not è il più alto.
not
and
or
Nel seguente codice di esempio, l'espressione precedente viene interpretata come se fosse quella sottostante. Dato che non ci sono problemi con le parentesi extra, può essere più facile descriverle chiaramente in casi come questo esempio.
print(True or True and False)
# True
print(True or (True and False))
# True
Se volete operare o prima di e, usate le parentesi().
print((True or True) and False)
# False
<
,>
Questi operatori di confronto hanno una precedenza ancora più alta che non. Pertanto, le parentesi non sono necessarie per ogni operazione di confronto, come nell'esempio precedente.
print(0 < a and a < 100)
# True
Vedere la documentazione ufficiale qui sotto per un riassunto della precedenza degli operatori in Python.
Operatori logici per oggetti di tipo diverso da bool
Con questi operatori logici, non solo i tipi bool (vero, falso), ma anche i numeri, le stringhe, le liste, ecc. sono trattati come valori booleani.
I seguenti oggetti sono considerati falsi nelle operazioni logiche di Python.
- Costanti definite come false:
None
,false
- Zero nei tipi numerici:
0
,0
,0j
,Decimal(0)
,Fraction(0, 1)
- Sequenza o collezione vuota:
''
,()
,[]
,{}
,set()
,range(0)
Tutti gli altri valori sono considerati veri.
La funzione bool() può essere usata per ottenere il valore booleano di un oggetto. Notate che la stringa '0' o 'False' è considerata vera.
print(bool(10))
# True
print(bool(0))
# False
print(bool(''))
# False
print(bool('0'))
# True
print(bool('False'))
# True
print(bool([]))
# False
print(bool([False]))
# True
Per gestire '0' o 'false' in una stringa come false, usate distutils.util.strtobool().
and,orQuesti valori di ritorno non sono necessariamente di tipo bool.
Ecco un esempio di un oggetto diverso da un tipo bool, che mostra il risultato di ogni operatore su un valore numerico.
x = 10 # True
y = 0 # False
print(x and y)
# 0
print(x or y)
# 10
print(not x)
# False
Come potete vedere dall'esempio sopra, e e o in Python non restituiscono vero o falso di tipo bool, ma restituiscono il valore a sinistra o a destra a seconda che sia vero o falso. L'esempio è numerico, ma lo stesso vale per altri tipi come stringhe e liste. Per inciso, not restituisce vero o falso di tipo bool.
Le definizioni dei valori di ritorno di e e or sono le seguenti.
The expression x and y first evaluates x; if x is false, its value is returned; otherwise, y is evaluated and the resulting value is returned.
The expression x or y first evaluates x; if x is true, its value is returned; otherwise, y is evaluated and the resulting value is returned.
6.11. Boolean operations — Expressions — Python 3.10.1 Documentation
Quando i valori delle espressioni sinistra e destra sono veri e falsi separatamente, i valori di ritorno sono facili da capire. D'altra parte, se entrambi sono veri o entrambi sono falsi, il valore di ritorno sarà diverso a seconda dell'ordine.
Se lo usate come espressione condizionale in un'istruzione if, ecc., il risultato viene giudicato come un valore booleano ed elaborato, quindi non dovete preoccuparvene, ma se usate il valore di ritorno per ulteriori elaborazioni, dovete stare attenti.
x = 10 # True
y = 100 # True
print(x and y)
# 100
print(y and x)
# 10
print(x or y)
# 10
print(y or x)
# 100
x = 0 # False
y = 0.0 # False
print(x and y)
# 0
print(y and x)
# 0.0
print(x or y)
# 0.0
print(y or x)
# 0
print(bool(x and y))
# False
Se volete trattarlo come vero o falso, potete fare come nell'ultimo esempio.bool(x and y)
I valori di ritorno di e e o sono riassunti nella tabella seguente.
x | y | x and y | x or y |
---|---|---|---|
true | false | y | x |
false | true | x | y |
true | true | y | x |
false | false | x | y |
Corto circuito (valutazione del corto circuito)
Come potete vedere dalla tabella sopra, se x è falso in x e y, o se x è vero in x o y, il valore di ritorno sarà x indipendentemente dal valore di y.
In questo caso, y non viene valutato.
and
,or
Notate che se chiamate una funzione o un metodo sul lato destro di questi processi per fare qualche elaborazione, il processo potrebbe non essere eseguito a seconda del risultato sul lato sinistro.
def test():
print('function is called')
return True
print(True and test())
# function is called
# True
print(False and test())
# False
print(True or test())
# True
print(False or test())
# function is called
# True