Python Language
Vergleiche
Suche…
Syntax
! = - Ist nicht gleich
== - Ist gleich
>
- größer als<
- weniger als>=
- größer als oder gleich<=
- kleiner oder gleichis
- test, ob Objekte genau das gleiche Objekt sindist nicht = test, wenn Objekte nicht exakt das gleiche Objekt sind
Parameter
Parameter | Einzelheiten |
---|---|
x | Erster zu vergleichender Artikel |
y | Zweiter zu vergleichender Punkt |
Größer oder kleiner als
x > y
x < y
Diese Operatoren vergleichen zwei Arten von Werten. Sie sind weniger als und größer als Operatoren. Bei Zahlen werden die numerischen Werte einfach verglichen, um zu sehen, welche größer sind:
12 > 4
# True
12 < 4
# False
1 < 4
# True
Bei Strings werden sie lexikographisch verglichen, was der alphabetischen Reihenfolge ähnelt, jedoch nicht ganz dieselbe ist.
"alpha" < "beta"
# True
"gamma" > "beta"
# True
"gamma" < "OMEGA"
# False
In diesen Vergleichen werden Kleinbuchstaben als 'größer als' Großbuchstaben betrachtet, weshalb "gamma" < "OMEGA"
falsch ist. Wenn sie alle in Großbuchstaben sind, wird das erwartete Ergebnis der alphabetischen Reihenfolge zurückgegeben:
"GAMMA" < "OMEGA"
# True
Jeder Typ definiert seine Berechnung mit den Operatoren <
und >
anders. Sie sollten daher vor der Verwendung untersuchen, was die Operatoren für einen bestimmten Typ bedeuten.
Nicht gleichzusetzen mit
x != y
Dies gibt True
wenn x
und y
nicht gleich sind, und ansonsten False
.
12 != 1
# True
12 != '12'
# True
'12' != '12'
# False
Gleich
x == y
Dieser Ausdruck wertet aus, ob x
und y
den gleichen Wert haben, und gibt das Ergebnis als booleschen Wert zurück. Im Allgemeinen müssen Typ und Wert übereinstimmen, daher ist int 12
nicht identisch mit der Zeichenfolge '12'
.
12 == 12
# True
12 == 1
# False
'12' == '12'
# True
'spam' == 'spam'
# True
'spam' == 'spam '
# False
'12' == 12
# False
Beachten Sie, dass jeder Typ eine Funktion definieren muss, mit der bewertet wird, ob zwei Werte gleich sind. Bei eingebauten Typen verhalten sich diese Funktionen wie erwartet und bewerten nur die Werte, die auf demselben Wert basieren. Benutzerdefinierte Typen können Gleichheitstests jedoch als beliebig definieren, z. B. immer True
oder False
.
Kettenvergleiche
Sie können mehrere Elemente mit mehreren Vergleichsoperatoren mit Kettenvergleich vergleichen. Zum Beispiel
x > y > z
ist nur eine Kurzform von:
x > y and y > z
Dies True
nur dann True
, wenn beide Vergleiche True
.
Die allgemeine Form ist
a OP b OP c OP d ...
Dabei steht OP
für eine der zahlreichen Vergleichsoperationen, die Sie verwenden können, und die Buchstaben repräsentieren beliebige gültige Ausdrücke.
Beachten Sie, dass
0 != 1 != 0
zuTrue
ausgewertet wird, obwohl0 != 0
False
. Im Gegensatz zur üblichen mathematischen Notation, in derx != y != z
bedeutet, habenx
,y
undz
unterschiedliche Werte. Chaining==
Operationen hat die natürliche Bedeutung in den meisten Fällen, da die Gleichstellung im Allgemeinen transitiv ist.
Stil
Es gibt keine theoretische Begrenzung für die Anzahl der Elemente und Vergleichsoperationen, die Sie verwenden, solange Sie die richtige Syntax verwenden:
1 > -1 < 2 > 0.5 < 100 != 24
Das Obige gibt True
wenn jeder Vergleich True
. Die Verwendung von gewundenen Ketten ist jedoch kein guter Stil. Eine gute Verkettung ist "direktional", nicht komplizierter als
1 > x > -4 > y != 8
Nebenwirkungen
Sobald ein Vergleich False
, wird der Ausdruck sofort zu False
ausgewertet, wobei alle verbleibenden Vergleiche übersprungen werden.
Beachten Sie, dass der Ausdruck exp
in a > exp > b
nur einmal ausgewertet wird, im Fall von
a > exp and exp > b
exp
wird zweimal berechnet, wenn a > exp
wahr ist.
Vergleich von `is` vs` == `
Ein häufiger Fehler ist verwirrend die Gleichheit Vergleichsoperator is
und ==
.
a == b
vergleicht den Wert von a
und b
.
a is b
vergleicht die Identitäten von a
und b
.
Um zu zeigen:
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 [!!]
Im Grunde genommen is
kann der als Kurzform gedacht werden id(a) == id(b)
.
Darüber hinaus gibt es Macken der Laufzeitumgebung, die die Dinge noch komplizierter machen. Kurze Zeichenfolgen und kleine Ganzzahlen geben im Vergleich zu is
True
, da die Python-Maschine versucht, für identische Objekte weniger Speicher zu verwenden.
a = 'short'
b = 'short'
c = 5
d = 5
a is b # True
c is d # True
Längere Zeichenfolgen und größere Ganzzahlen werden jedoch separat gespeichert.
a = 'not so short'
b = 'not so short'
c = 1000
d = 1000
a is b # False
c is d # False
Sie sollten verwenden is
, auf die getestet None
:
if myvar is not None:
# not None
pass
if myvar is None:
# None
pass
Eine Verwendung von is
ist das Testen eines "Sentinels" (dh eines eindeutigen Objekts).
sentinel = object()
def myfunc(var=sentinel):
if var is sentinel:
# value wasn’t provided
pass
else:
# value was provided
pass
Objekte vergleichen
Um die Gleichheit von benutzerdefinierten Klassen zu vergleichen, können Sie ==
und !=
__eq__
__ne__
Methoden __eq__
und __ne__
definieren. Sie können auch __lt__
( <
), __le__
( <=
), __gt__
( >
) und __ge__
( >
) __ge__
. Beachten Sie, dass Sie nur zwei Vergleichsmethoden überschreiben müssen und Python den Rest erledigen kann ( ==
ist dasselbe wie not <
und not >
usw.).
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
Beachten Sie, dass bei diesem einfachen Vergleich davon ausgegangen wird, dass other
Objekte (das Objekt, mit dem verglichen wird) denselben Objekttyp haben. Beim Vergleich mit einem anderen Typ wird ein Fehler ausgegeben:
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'
Das Überprüfen von isinstance()
oder ähnlichem hilft, dies zu verhindern (falls gewünscht).
Common Gotcha: Python erzwingt keine Eingabe
In vielen anderen Sprachen, wenn Sie Folgendes ausführen (Java-Beispiel)
if("asgdsrf" == 0) {
//do stuff
}
... Sie erhalten einen Fehler. Sie können nicht einfach Strings mit ganzen Zahlen vergleichen. In Python ist dies eine absolut rechtliche Aussage - es wird nur zu False
.
Eine häufige Angelegenheit ist die folgende
myVariable = "1"
if 1 == myVariable:
#do stuff
Dieser Vergleich wird jedes Mal ohne Fehler als False
ausgewertet, False
möglicherweise ein Fehler ausgeblendet oder eine Bedingung gebrochen wird.