Skip to content

Verkettete Vergleiche (a < x < b) in Python

Python

In Python können Vergleiche verkettet werden. Du kannst a < x und x < b wie in der Mathematik als a < x < b schreiben.

Dieser Artikel hat folgenden Inhalt.

  • Kette von Mehrfachvergleichen
  • Beispiel 1: Numerischer Bereich
  • Beispiel 2: Überprüfen Sie, ob mehrere Werte alle gleich sind
  • Achten Sie darauf, nicht zu viel zu verwenden

Kette von Mehrfachvergleichen

Beispiel ist a < x < b äquivalent zu a < x und x < b.

Vergleiche können beliebig verkettet werden, z. B. ist x < y <= z äquivalent zu x < y und y <= z, außer dass y nur einmal ausgewertet wird (aber in beiden Fällen wird z überhaupt nicht ausgewertet, wenn x < y gefunden wird falsch sein).

Wenn a, b, c, …, y, z Ausdrücke und op1, op2, …, opN Vergleichsoperatoren sind, dann ist formal a op1 b op2 c … y opN z äquivalent zu a op1 b und b op2 c und .. y opN z, außer dass jeder Ausdruck höchstens einmal ausgewertet WIRD.
6. Ausdrücke – Vergleiche — Dokumentation zu Python 3.9.1

Wenn a,b, c, …, y, z Ausdrücke sind und op1, op2, …, opN Vergleichsoperatoren (wie < oder >) sind, sind die folgenden beiden äquivalent.

a op1 b op2 c ... y opN z
a op1 b and b op2 c and ... y opN z

Konkrete Beispiele:

x = 15
print(10 < x < 20)
# True

print(10 < x and x < 20)
# True

x = 0
print(10 < x < 20)
# False

print(10 < x and x < 20)
# False

Komplexere Beispiele:

x = 15
y = 25

print(10 < x < 20 < y < 30)
# True

print(10 < x and x < 20 and 20 < y and y < 30)
# True

x = 15
y = 40

print(10 < x < 20 < y < 30)
# False

print(10 < x and x < 20 and 20 < y and y < 30)
# False

Wie in der offiziellen Dokumentation angegeben, wird jeder Ausdruck höchstens einmal ausgewertet, wenn er verkettet ist.

Definieren Sie als Beispiel eine einfache Funktion, sterben ihre Argumente einheitlich zurückgibt. print() WIRD ausgeführt, um zu bestätigen, dass die Funktion aufgerufen wurde.

def test(x):
    print('function is called')
    return(x)

print(test(15))
# function is called
# 15

Wenn die Vergleiche verkettet sind, wird die Funktion nur einmal aufgerufen.

print(10 < test(15) < 20)
# function is called
# True

Bei und WIRD sterben Funktion zweimal aufgerufen.

print(10 < test(15) and test(15) < 20)
# function is called
# function is called
# True

In X und Y wird Y nicht ausgewertet, wenn X False ist. Daher wird die Funktion im folgenden Fall nur einmal aufgerufen, unabhängig davon, ob sie verkettet ist oder nicht.

print(10 < test(0) < 20)
# function is called
# False

print(10 < test(0) and test(0) < 20)
# function is called
# False

Dies wird als Kurzschlussauswertung bezeichnet. Nichts finden Sie im following Artikel.

In jedem Fall WIRD beim Verketten jedes Ausdrucks höchstens einmal bewertet, sodass das Verketten effizienter ist, wenn die Ergebnisse komplexere Funktionen gesteigert werden.

Beispiel 1: Numerischer Bereich

Wenn ein Zahlenbereich als Bedingung WIRD verwendet, sind verkettete Vergleiche hilfreich.

x = 15

if 10 < x < 20:
    print('result: 10 < x < 20')
else:
    print('result: x <= 10 or 20 <= x')
# result: 10 < x < 20

x = 30

if 10 < x < 20:
    print('result: 10 < x < 20')
else:
    print('result: x <= 10 or 20 <= x')
# result: x <= 10 or 20 <= x

Beispiel 2: Überprüfen Sie, ob mehrere Werte alle gleich sind

Eine weitere praktische Anwendung ist die Überprüfung, ob mehrere Variablen und Ausdrücke alle gleich sind.

Die Verkettung mit dem Vergleichsoperator == gibt nur dann True zurück, wenn alle Werte gleich sind.

a = 10
b = 10
c = 10

if a == b == c:
    print('all equal')
else:
    print('not all equal')
# all equal

Wenn es auch nur einen anderen Wert gibt, wird False zurückgegeben.

a = 10
b = 1
c = 10

if a == b == c:
    print('all equal')
else:
    print('not all equal')
# not all equal

Seien Sie vorsichtig, wenn Sie den Vergleichsoperator != verwenden, der True zurückgibt, wenn die Werte nicht äquivalent sind. Nicht alle Kombinationen von Werten werden ausgewertet, daher WIRD Selbst bei äquivalenten Werten abhängig von der Reihenfolge True zurückgegeben.

a = 10
b = 1
c = 100

print(a != b != c)
# True

a = 10
b = 10
c = 1

print(a != b != c)
# False

a = 10
b = 1
c = 10

print(a != b != c)
# True

Eine, zu überprüfen, ob mehrere Werte alle eindeutig sind, besteht darin, sie in einer Liste zu speichern und dann die Möglichkeit auf Duplikate zu prüfen. Siehe folgenden Artikel.

Beachten Sie, dass == und != Werte vergleichen. Verwendung ist, nicht die Identität von Objekten zu vergleichen.

Wenn Sie beispielsweise eine ganze Zahl int mit einer Gleitkommazahl float vergleichen, gibt es == True zurück, wenn die Werte äquivalent sind, gibt es aber False zurück, da es sich um unterschiedliche Objekte handelt.

i = 10
print(type(i))
# <class 'int'>

f = 10.0
print(type(f))
# <class 'float'>

print(i == f)
# True

print(i is f)
# False

Achten Sie darauf, nicht zu viel zu verwenden

Verkettete Vergleiche können auf verschiedene Arten geschrieben werden, aber seien Sie vorsichtig, dass der Code in manchen Fällen schwer lesbar sein kann.

Zum Beispiel kann der Operator in, der getestet, ob eine Liste ein bestimmtes Element enthält, auch verkettet werden, aber es ist wahrscheinlich für die meisten Menschen verwirrend. Sofern Sie nicht den großen Vorteil haben, dass „jeder Ausdruck nur einmal ausgewertet wird“, sollten Sie und verwenden.

a = 100
l = [0, 10, 100, 1000]

print(50 < a in l)
# True

print(50 < a and a in l)
# True