Suche…


Syntax

  • ! = - Ist nicht gleich

  • == - Ist gleich

  • > - größer als

  • < - weniger als

  • >= - größer als oder gleich

  • <= - kleiner oder gleich

  • is - test, ob Objekte genau das gleiche Objekt sind

  • ist 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 zu True ausgewertet wird, obwohl 0 != 0 False . Im Gegensatz zur üblichen mathematischen Notation, in der x != y != z bedeutet, haben x , y und z 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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow