operator — Standardoperatoren als Funktionen¶
Quellcode: Lib/operator.py
Das Modul operator exportiert eine Reihe effizienter Funktionen, die den internen Operatoren von Python entsprechen. Zum Beispiel ist operator.add(x, y) äquivalent zum Ausdruck x+y. Viele Funktionsnamen sind die Namen, die für spezielle Methoden verwendet werden, ohne die doppelten Unterstriche. Aus Gründen der Abwärtskompatibilität haben viele dieser Funktionen eine Variante mit beibehaltenen doppelten Unterstrichen. Die Varianten ohne doppelte Unterstriche werden aus Gründen der Klarheit bevorzugt.
Die Funktionen sind in Kategorien unterteilt, die Objektvergleiche, logische Operationen, mathematische Operationen und Sequenzoperationen durchführen.
Die Objektvergleichsfunktionen sind für alle Objekte nützlich und nach den Rich-Comparison-Operatoren benannt, die sie unterstützen
- operator.lt(a, b)¶
- operator.le(a, b)¶
- operator.eq(a, b)¶
- operator.ne(a, b)¶
- operator.ge(a, b)¶
- operator.gt(a, b)¶
- operator.__lt__(a, b)¶
- operator.__le__(a, b)¶
- operator.__eq__(a, b)¶
- operator.__ne__(a, b)¶
- operator.__ge__(a, b)¶
- operator.__gt__(a, b)¶
Führt „Rich Comparisons“ zwischen a und b durch. Insbesondere ist
lt(a, b)äquivalent zua < b,le(a, b)ist äquivalent zua <= b,eq(a, b)ist äquivalent zua == b,ne(a, b)ist äquivalent zua != b,gt(a, b)ist äquivalent zua > bundge(a, b)ist äquivalent zua >= b. Beachten Sie, dass diese Funktionen jeden Wert zurückgeben können, der möglicherweise als boolescher Wert interpretiert werden kann oder auch nicht. Weitere Informationen zu Rich Comparisons finden Sie unter Vergleiche.
Die logischen Operationen sind ebenfalls allgemein auf alle Objekte anwendbar und unterstützen Wahrheits-, Identitäts- und Boolesche Tests
- operator.not_(obj)¶
- operator.__not__(obj)¶
Gibt das Ergebnis von
notobj zurück. (Beachten Sie, dass es keine__not__()Methode für Objektinstanzen gibt; nur der Interpreter-Kern definiert diese Operation. Das Ergebnis wird von den Methoden__bool__()und__len__()beeinflusst.)
- operator.truth(obj)¶
Gibt
Truezurück, wenn obj wahr ist, und andernfallsFalse. Dies ist äquivalent zur Verwendung desbool-Konstruktors.
- operator.is_(a, b)¶
Gibt
a is bzurück. Testet die Objektidentität.
- operator.is_not(a, b)¶
Gibt
a is not bzurück. Testet die Objektidentität.
- operator.is_none(a)¶
Gibt
a is Nonezurück. Testet die Objektidentität.Hinzugefügt in Version 3.14.
- operator.is_not_none(a)¶
Gibt
a is not Nonezurück. Testet die Objektidentität.Hinzugefügt in Version 3.14.
Die mathematischen und bitweisen Operationen sind am zahlreichsten
- operator.index(a)¶
- operator.__index__(a)¶
Gibt a in einen Integer konvertiert zurück. Äquivalent zu
a.__index__().Geändert in Version 3.10: Das Ergebnis hat immer den exakten Typ
int. Zuvor konnte das Ergebnis eine Instanz einer Unterklasse vonintsein.
- operator.inv(obj)¶
- operator.invert(obj)¶
- operator.__inv__(obj)¶
- operator.__invert__(obj)¶
Gibt die bitweise Invertierung der Zahl obj zurück. Dies ist äquivalent zu
~obj.
- operator.truediv(a, b)¶
- operator.__truediv__(a, b)¶
Gibt
a / bzurück, wobei 2/3 .66 und nicht 0 ist. Dies wird auch als „echte“ Division bezeichnet.
- operator.xor(a, b)¶
- operator.__xor__(a, b)¶
Gibt die bitweise exklusive ODER-Verknüpfung von a und b zurück.
Operationen, die mit Sequenzen (einige auch mit Mappings) arbeiten, umfassen
- operator.contains(a, b)¶
- operator.__contains__(a, b)¶
Gibt das Ergebnis des Tests
b in azurück. Beachten Sie die vertauschten Operanden.
- operator.countOf(a, b)¶
Gibt die Anzahl der Vorkommen von b in a zurück.
- operator.indexOf(a, b)¶
Gibt den Index des ersten Vorkommens von b in a zurück.
- operator.length_hint(obj, default=0)¶
Gibt eine geschätzte Länge für das Objekt obj zurück. Versucht zuerst, seine tatsächliche Länge zurückzugeben, dann eine Schätzung mit
object.__length_hint__()und gibt schließlich den Standardwert zurück.Hinzugefügt in Version 3.4.
Die folgende Operation arbeitet mit aufrufbaren Objekten
- operator.call(obj, /, *args, **kwargs)¶
- operator.__call__(obj, /, *args, **kwargs)¶
Gibt
obj(*args, **kwargs)zurück.Hinzugefügt in Version 3.11.
Das Modul operator definiert auch Werkzeuge für allgemeine Attribut- und Elementabfragen. Diese sind nützlich, um schnelle Feldextraktoren als Argumente für map(), sorted(), itertools.groupby() oder andere Funktionen zu erstellen, die ein Funktionsargument erwarten.
- operator.attrgetter(attr)¶
- operator.attrgetter(*attrs)
Gibt ein aufrufbares Objekt zurück, das attr aus seinem Operanden abruft. Wenn mehr als ein Attribut angefordert wird, wird ein Tupel von Attributen zurückgegeben. Die Attributnamen können auch Punkte enthalten. Zum Beispiel
Nach
f = attrgetter('name')gibt der Aufruff(b)b.namezurück.Nach
f = attrgetter('name', 'date')gibt der Aufruff(b)(b.name, b.date)zurück.Nach
f = attrgetter('name.first', 'name.last')gibt der Aufruff(b)(b.name.first, b.name.last)zurück.
Entspricht
def attrgetter(*items): if any(not isinstance(item, str) for item in items): raise TypeError('attribute name must be a string') if len(items) == 1: attr = items[0] def g(obj): return resolve_attr(obj, attr) else: def g(obj): return tuple(resolve_attr(obj, attr) for attr in items) return g def resolve_attr(obj, attr): for name in attr.split("."): obj = getattr(obj, name) return obj
- operator.itemgetter(item)¶
- operator.itemgetter(*items)
Gibt ein aufrufbares Objekt zurück, das item aus seinem Operanden mithilfe der Methode
__getitem__()des Operanden abruft. Wenn mehrere Elemente angegeben sind, wird ein Tupel von Lookup-Werten zurückgegeben. Zum BeispielNach
f = itemgetter(2)gibt der Aufruff(r)r[2]zurück.Nach
g = itemgetter(2, 5, 3)gibt der Aufrufg(r)(r[2], r[5], r[3])zurück.
Entspricht
def itemgetter(*items): if len(items) == 1: item = items[0] def g(obj): return obj[item] else: def g(obj): return tuple(obj[item] for item in items) return g
Die Elemente können jeder Typ sein, der von der Methode
__getitem__()des Operanden akzeptiert wird. Wörterbücher akzeptieren jeden hashbaren Wert. Listen, Tupel und Strings akzeptieren einen Index oder einen Slice>>> itemgetter(1)('ABCDEFG') 'B' >>> itemgetter(1, 3, 5)('ABCDEFG') ('B', 'D', 'F') >>> itemgetter(slice(2, None))('ABCDEFG') 'CDEFG' >>> soldier = dict(rank='captain', name='dotterbart') >>> itemgetter('rank')(soldier) 'captain'
Beispiel für die Verwendung von
itemgetter()zum Abrufen spezifischer Felder aus einem Tupel-Datensatz>>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)] >>> getcount = itemgetter(1) >>> list(map(getcount, inventory)) [3, 2, 5, 1] >>> sorted(inventory, key=getcount) [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]
- operator.methodcaller(name, /, *args, **kwargs)¶
Gibt ein aufrufbares Objekt zurück, das die Methode name seines Operanden aufruft. Wenn zusätzliche Argumente und/oder Schlüsselwortargumente angegeben werden, werden diese ebenfalls an die Methode übergeben. Zum Beispiel
Nach
f = methodcaller('name')gibt der Aufruff(b)b.name()zurück.Nach
f = methodcaller('name', 'foo', bar=1)gibt der Aufruff(b)b.name('foo', bar=1)zurück.
Entspricht
def methodcaller(name, /, *args, **kwargs): def caller(obj): return getattr(obj, name)(*args, **kwargs) return caller
Operatoren zu Funktionen zuordnen¶
Diese Tabelle zeigt, wie abstrakte Operationen den Operator-Symbolen in der Python-Syntax und den Funktionen im Modul operator entsprechen.
Operation |
Syntax |
Funktion |
|---|---|---|
Addition |
|
|
Verkettung |
|
|
Containment-Test |
|
|
Division |
|
|
Division |
|
|
Bitweises UND |
|
|
Bitweises Exklusiv-ODER |
|
|
Bitweise Inversion |
|
|
Bitweises ODER |
|
|
Potenzierung |
|
|
Identität |
|
|
Identität |
|
|
Identität |
|
|
Identität |
|
|
Indizierte Zuweisung |
|
|
Indizierte Löschung |
|
|
Indizierung |
|
|
Linksschieben |
|
|
Modulo |
|
|
Multiplikation |
|
|
Matrixmultiplikation |
|
|
Negation (Arithmetik) |
|
|
Negation (Logisch) |
|
|
Positiv |
|
|
Rechtsschieben |
|
|
Slice-Zuweisung |
|
|
Slice-Löschung |
|
|
Slicing |
|
|
String-Formatierung |
|
|
Subtraktion |
|
|
Wahrheitstest |
|
|
Ordnung |
|
|
Ordnung |
|
|
Gleichheit |
|
|
Differenz |
|
|
Ordnung |
|
|
Ordnung |
|
|
In-Place-Operatoren¶
Viele Operationen haben eine "In-Place"-Version. Im Folgenden sind Funktionen aufgeführt, die einen primitiveren Zugriff auf In-Place-Operatoren bieten als die übliche Syntax; zum Beispiel ist die Anweisung x += y äquivalent zu x = operator.iadd(x, y). Anders ausgedrückt bedeutet z = operator.iadd(x, y) die zusammengesetzte Anweisung z = x; z += y.
In diesen Beispielen ist zu beachten, dass beim Aufruf einer In-Place-Methode die Berechnung und die Zuweisung in zwei separaten Schritten durchgeführt werden. Die unten aufgeführten In-Place-Funktionen führen nur den ersten Schritt aus, nämlich den Aufruf der In-Place-Methode. Der zweite Schritt, die Zuweisung, wird nicht gehandhabt.
Für unveränderliche Ziele wie Strings, Zahlen und Tupel wird der aktualisierte Wert berechnet, aber nicht der Eingabevariable zugewiesen
>>> a = 'hello'
>>> iadd(a, ' world')
'hello world'
>>> a
'hello'
Für veränderliche Ziele wie Listen und Wörterbücher führt die In-Place-Methode die Aktualisierung durch, so dass keine nachfolgende Zuweisung erforderlich ist
>>> s = ['h', 'e', 'l', 'l', 'o']
>>> iadd(s, [' ', 'w', 'o', 'r', 'l', 'd'])
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> s
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
- operator.iconcat(a, b)¶
- operator.__iconcat__(a, b)¶
a = iconcat(a, b)ist äquivalent zua += bfür Sequenzen a und b.
- operator.ifloordiv(a, b)¶
- operator.__ifloordiv__(a, b)¶
a = ifloordiv(a, b)ist äquivalent zua //= b.