Python Language
confronti
Ricerca…
Sintassi
! = - Non è uguale a
== - È uguale a
>
- maggiore di<
- meno di>=
- maggiore o uguale a<=
- inferiore o uguale ais
- verifica se gli oggetti sono esattamente lo stesso oggettois not = test se gli oggetti non sono esattamente lo stesso oggetto
Parametri
Parametro | Dettagli |
---|---|
X | Primo oggetto da confrontare |
y | Secondo oggetto da confrontare |
Maggiore o minore di
x > y
x < y
Questi operatori confrontano due tipi di valori, sono inferiori e maggiori degli operatori. Per i numeri questo semplicemente confronta i valori numerici per vedere quale è più grande:
12 > 4
# True
12 < 4
# False
1 < 4
# True
Per gli archi si confronteranno lessicograficamente, che è simile all'ordine alfabetico ma non esattamente lo stesso.
"alpha" < "beta"
# True
"gamma" > "beta"
# True
"gamma" < "OMEGA"
# False
In questi confronti, le lettere minuscole sono considerate "maggiori di" maiuscole, motivo per cui "gamma" < "OMEGA"
è falso. Se fossero tutti maiuscoli, restituirebbe il risultato ordinato in ordine alfabetico:
"GAMMA" < "OMEGA"
# True
Ogni tipo definisce il suo calcolo con <
e >
operatori in modo diverso, quindi è necessario indagare su cosa gli operatori intendono con un determinato tipo prima di utilizzarlo.
Non uguale a
x != y
Ciò restituisce True
se x
e y
non sono uguali e altrimenti restituisce False
.
12 != 1
# True
12 != '12'
# True
'12' != '12'
# False
Uguale a
x == y
Questa espressione valuta se x
ed y
sono lo stesso valore e restituisce il risultato come valore booleano. Generalmente sia il tipo che il valore devono corrispondere, quindi l'int 12
non è uguale alla stringa '12'
.
12 == 12
# True
12 == 1
# False
'12' == '12'
# True
'spam' == 'spam'
# True
'spam' == 'spam '
# False
'12' == 12
# False
Nota che ogni tipo deve definire una funzione che verrà utilizzata per valutare se due valori sono gli stessi. Per i tipi built-in, queste funzioni si comportano come ci si aspetterebbe e valutano solo le cose in base all'essere lo stesso valore. Tuttavia, i tipi personalizzati potrebbero definire test di uguaglianza come qualsiasi cosa vorrebbero, incluso il ritorno sempre True
o il ritorno di False
.
Confronti a catena
È possibile confrontare più articoli con più operatori di confronto con il confronto a catena. Per esempio
x > y > z
è solo una breve forma di:
x > y and y > z
Verrà valutato su True
solo se entrambi i confronti sono True
.
La forma generale è
a OP b OP c OP d ...
Dove OP
rappresenta una delle operazioni di confronto multiple che è possibile utilizzare e le lettere rappresentano espressioni valide arbitrarie.
Si noti che
0 != 1 != 0
restituisceTrue
, anche se0 != 0
èFalse
. A differenza della comune notazione matematica in cuix != y != z
significa chex
,y
ez
hanno valori diversi. Il concatenamento==
operazioni ha il significato naturale nella maggior parte dei casi, poiché l'uguaglianza è generalmente transitiva.
Stile
Non esiste un limite teorico su quanti articoli e operazioni di confronto si utilizzano a patto di avere una sintassi corretta:
1 > -1 < 2 > 0.5 < 100 != 24
Quanto sopra restituisce True
se ogni confronto restituisce True
. Tuttavia, l'utilizzo del concatenamento concatenato non è un buon stile. Un buon collegamento sarà "direzionale", non più complicato di
1 > x > -4 > y != 8
Effetti collaterali
Non appena un confronto restituisce False
, l'espressione viene valutata immediatamente su False
, ignorando tutti i confronti rimanenti.
Si noti che l'espressione exp
in a > exp > b
sarà valutata solo una volta, mentre nel caso di
a > exp and exp > b
exp
sarà calcolato due volte se a > exp
è vero.
Confronto con `is` vs` == `
Un errore comune è confondere gli operatori di confronto di uguaglianza is
e ==
.
a == b
confronta il valore di a
e b
.
a is b
confronterà le identità di a
e b
.
Illustrare:
a = 'Python is fun!'
b = 'Python is fun!'
a == b # returns True
a is b # returns False
a = [1, 2, 3, 4, 5]
b = a # b references a
a == b # True
a is b # True
b = a[:] # b now references a copy of a
a == b # True
a is b # False [!!]
Fondamentalmente, is
può essere pensato come abbreviazione di id(a) == id(b)
.
Oltre a ciò, ci sono stranezze dell'ambiente di runtime che complicano ulteriormente le cose. Le stringhe corte e gli interi piccoli restituiscono True
se confrontati con is
, a causa del tentativo della macchina Python di utilizzare meno memoria per oggetti identici.
a = 'short'
b = 'short'
c = 5
d = 5
a is b # True
c is d # True
Ma stringhe più lunghe e interi più grandi verranno memorizzati separatamente.
a = 'not so short'
b = 'not so short'
c = 1000
d = 1000
a is b # False
c is d # False
È necessario utilizzare is
per verificare per None
:
if myvar is not None:
# not None
pass
if myvar is None:
# None
pass
L'uso di is
è di testare un "sentinel" (cioè un oggetto unico).
sentinel = object()
def myfunc(var=sentinel):
if var is sentinel:
# value wasn’t provided
pass
else:
# value was provided
pass
Confronto di oggetti
Per confrontare l'uguaglianza delle classi personalizzate, è possibile sovrascrivere ==
e !=
Definendo i metodi __eq__
e __ne__
. Puoi anche eseguire l'override di __lt__
( <
), __le__
( <=
), __gt__
( >
) e __ge__
( >
). Nota che devi solo sostituire due metodi di confronto e Python può gestire il resto ( ==
è lo stesso di not <
e not >
, ecc.)
class Foo(object):
def __init__(self, item):
self.my_item = item
def __eq__(self, other):
return self.my_item == other.my_item
a = Foo(5)
b = Foo(5)
a == b # True
a != b # False
a is b # False
Si noti che questo semplice confronto presuppone che l' other
(l'oggetto confrontato con) sia lo stesso tipo di oggetto. Il confronto con un altro tipo genera un errore:
class Bar(object):
def __init__(self, item):
self.other_item = item
def __eq__(self, other):
return self.other_item == other.other_item
def __ne__(self, other):
return self.other_item != other.other_item
c = Bar(5)
a == c # throws AttributeError: 'Foo' object has no attribute 'other_item'
Controllare isinstance()
o simili aiuterà a prevenire questo (se lo si desidera).
Common Gotcha: Python non impone la digitazione
In molti altri linguaggi, se si esegue quanto segue (esempio Java)
if("asgdsrf" == 0) {
//do stuff
}
... avrai un errore Non puoi semplicemente confrontare le stringhe con numeri come questo. In Python, questa è una dichiarazione perfettamente legale: si risolverà su False
.
Un tipico trucchetto è il seguente
myVariable = "1"
if 1 == myVariable:
#do stuff
Questo confronto valuterà False
senza errori, ogni volta, potenzialmente nascondendo un bug o rompere un condizionale.