Eingebettete Datentypen¶
Die folgenden Abschnitte beschreiben die Standardtypen, die in den Interpreter eingebaut sind.
Die wichtigsten eingebauten Typen sind numerische Typen, Sequenzen, Abbildungen, Klassen, Instanzen und Ausnahmen.
Einige Sammlungsdatentypen sind veränderlich. Die Methoden, die ihre Elemente hinzufügen, subtrahieren oder neu anordnen, ohne einen bestimmten Wert zurückzugeben, geben niemals die Sammlung selbst, sondern None zurück.
Einige Operationen werden von mehreren Objekttypen unterstützt; insbesondere können praktisch alle Objekte auf Gleichheit verglichen, auf Wahrheitswert getestet und in eine Zeichenkette konvertiert werden (mit der Funktion repr() oder der leicht abweichenden Funktion str()). Letztere Funktion wird implizit verwendet, wenn ein Objekt von der Funktion print() ausgegeben wird.
Wahrheitswertprüfung¶
Jedes Objekt kann auf seinen Wahrheitswert getestet werden, um es in einer if- oder while-Bedingung zu verwenden oder als Operand der folgenden booleschen Operationen.
Standardmäßig gilt ein Objekt als wahr, es sei denn, seine Klasse definiert entweder eine Methode __bool__(), die False zurückgibt, oder eine Methode __len__(), die Null zurückgibt, wenn sie mit dem Objekt aufgerufen wird. [1] Hier sind die meisten der eingebauten Objekte, die als falsch gelten:
Konstanten, die als falsch definiert sind:
NoneundFalseNull eines beliebigen numerischen Typs:
0,0.0,0j,Decimal(0),Fraction(0, 1)leere Sequenzen und Sammlungen:
'',(),[],{},set(),range(0)
Operationen und eingebaute Funktionen, die ein boolesches Ergebnis liefern, geben immer 0 oder False für falsch und 1 oder True für wahr zurück, sofern nicht anders angegeben. (Wichtige Ausnahme: Die booleschen Operationen or und and geben immer einen ihrer Operanden zurück.)
Boolesche Operationen — and, or, not¶
Dies sind die booleschen Operationen, sortiert nach aufsteigender Priorität
Operation |
Ergebnis |
Hinweise |
|---|---|---|
|
wenn x wahr ist, dann x, ansonsten y |
(1) |
|
wenn x falsch ist, dann x, ansonsten y |
(2) |
|
wenn x falsch ist, dann |
(3) |
Hinweise
Dies ist ein Short-Circuit-Operator, der das zweite Argument nur auswertet, wenn das erste falsch ist.
Dies ist ein Short-Circuit-Operator, der das zweite Argument nur auswertet, wenn das erste wahr ist.
nothat eine niedrigere Priorität als nicht-boolesche Operatoren, daher wirdnot a == balsnot (a == b)interpretiert, unda == not bist ein Syntaxfehler.
Vergleiche¶
In Python gibt es acht Vergleichsoperationen. Sie alle haben die gleiche Priorität (die höher ist als die der booleschen Operationen). Vergleiche können beliebig verkettet werden; zum Beispiel ist x < y <= z äquivalent zu x < y and y <= z, außer dass y nur einmal ausgewertet wird (aber in beiden Fällen z gar nicht ausgewertet wird, wenn x < y als falsch befunden wird).
Diese Tabelle fasst die Vergleichsoperationen zusammen
Operation |
Bedeutung |
|---|---|
|
strikt kleiner als |
|
kleiner als oder gleich |
|
strikt größer als |
|
größer als oder gleich |
|
gleich |
|
ungleich |
|
Objektidentität |
|
negierte Objektidentität |
Objekte unterschiedlicher Typen, außer verschiedenen numerischen Typen, sind niemals gleich. Der Operator == ist immer definiert, aber für einige Objekttypen (z.B. Klassenobjekte) ist er äquivalent zu is. Die Operatoren <, <=, > und >= sind nur dort definiert, wo sie sinnvoll sind; zum Beispiel lösen sie eine TypeError-Ausnahme aus, wenn einer der Operanden eine komplexe Zahl ist.
Nicht identische Instanzen einer Klasse vergleichen sich normalerweise als ungleich, es sei denn, die Klasse definiert die Methode __eq__().
Instanzen einer Klasse können nicht mit anderen Instanzen derselben Klasse oder anderen Objekttypen geordnet werden, es sei denn, die Klasse definiert genügend der Methoden __lt__(), __le__(), __gt__() und __ge__() (im Allgemeinen reichen __lt__() und __eq__() aus, wenn die konventionellen Bedeutungen der Vergleichsoperatoren gewünscht sind).
Das Verhalten der Operatoren is und is not kann nicht angepasst werden; außerdem können sie auf jedes beliebige Objekt angewendet werden und lösen niemals eine Ausnahme aus.
Zwei weitere Operationen mit der gleichen syntaktischen Priorität, in und not in, werden von Typen unterstützt, die iterierbar sind oder die Methode __contains__() implementieren.
Numerische Typen — int, float, complex¶
Es gibt drei verschiedene numerische Typen: *Ganzzahlen* (integers), *Gleitkommazahlen* (floating-point numbers) und *komplexe Zahlen* (complex numbers). Darüber hinaus sind Booleans ein Subtyp von Ganzzahlen. Ganzzahlen haben unbegrenzte Präzision. Gleitkommazahlen werden normalerweise mit double in C implementiert; Informationen über die Präzision und interne Darstellung von Gleitkommazahlen für die Maschine, auf der Ihr Programm läuft, sind in sys.float_info verfügbar. Komplexe Zahlen haben einen Real- und einen Imaginärteil, die jeweils eine Gleitkommazahl sind. Um diese Teile aus einer komplexen Zahl z zu extrahieren, verwenden Sie z.real und z.imag. (Die Standardbibliothek enthält die zusätzlichen numerischen Typen fractions.Fraction für rationale Zahlen und decimal.Decimal für Gleitkommazahlen mit benutzerdefinierbarer Präzision.)
Zahlen werden durch numerische Literale oder als Ergebnis von eingebauten Funktionen und Operatoren erstellt. Unverzierten Ganzzahlliterale (einschließlich Hex-, Oktal- und Binärzahlen) ergeben Ganzzahlen. Numerische Literale, die einen Dezimalpunkt oder ein Exponentenzeichen enthalten, ergeben Gleitkommazahlen. Das Anhängen von 'j' oder 'J' an ein numerisches Literal ergibt eine imaginäre Zahl (eine komplexe Zahl mit einem reellen Teil von Null), die Sie zu einer Ganzzahl oder Fließkommazahl addieren können, um eine komplexe Zahl mit reellem und imaginärem Teil zu erhalten.
Die Konstruktoren int(), float() und complex() können verwendet werden, um Zahlen eines bestimmten Typs zu erzeugen.
Python unterstützt vollständig gemischte Arithmetik: Wenn ein binärer arithmetischer Operator Operanden unterschiedlicher numerischer Typen hat, wird der Operand mit dem „schmaleren“ Typ auf den des anderen erweitert, wobei Ganzzahlen schmaler als Gleitkommazahlen sind. Die Arithmetik mit komplexen und reellen Operanden wird durch die üblichen mathematischen Formeln definiert, zum Beispiel
x + complex(u, v) = complex(x + u, v)
x * complex(u, v) = complex(x * u, x * v)
Ein Vergleich zwischen Zahlen unterschiedlicher Typen verhält sich so, als ob die exakten Werte dieser Zahlen verglichen würden. [2]
Alle numerischen Typen (außer komplexen) unterstützen die folgenden Operationen (Prioritäten der Operationen siehe Operatorrangfolge)
Operation |
Ergebnis |
Hinweise |
Vollständige Dokumentation |
|---|---|---|---|
|
Summe von x und y |
||
|
Differenz von x und y |
||
|
Produkt von x und y |
||
|
Quotient von x und y |
||
|
Ganzzahliger Quotient von x und y |
(1)(2) |
|
|
Rest von |
(2) |
|
|
x negiert |
||
|
x unverändert |
||
|
Absolutwert oder Betrag von x |
||
|
x konvertiert zu Ganzzahl |
(3)(6) |
|
|
x konvertiert zu Gleitkommazahl |
(4)(6) |
|
|
eine komplexe Zahl mit Realteil re und Imaginärteil im. im ist standardmäßig Null. |
(6) |
|
|
konjugierte komplexe Zahl von c |
||
|
das Paar |
(2) |
|
|
x hoch y |
(5) |
|
|
x hoch y |
(5) |
Hinweise
Auch Ganzzahldivision genannt. Bei Operanden vom Typ
inthat das Ergebnis den Typint. Bei Operanden vom Typfloathat das Ergebnis den Typfloat. Im Allgemeinen ist das Ergebnis eine ganze Zahl, auch wenn der Typ des Ergebnisses nicht unbedingtintist. Das Ergebnis wird immer zur Minus-Unendlich-Richtung gerundet:1//2ist0,(-1)//2ist-1,1//(-2)ist-1und(-1)//(-2)ist0.Nicht für komplexe Zahlen. Konvertieren Sie stattdessen in Fließkommazahlen mit
abs(), falls zutreffend.Die Konvertierung von
floatinintschneidet ab und verwirft den Bruchteil. Siehe die Funktionenmath.floor()undmath.ceil()für alternative Konvertierungen.float akzeptiert auch die Zeichenketten „nan“ und „inf“ mit einem optionalen Präfix „+“ oder „-“ für „Not a Number“ (NaN) und positive oder negative Unendlichkeit.
Python definiert
pow(0, 0)und0 ** 0als1, wie es in Programmiersprachen üblich ist.Die akzeptierten numerischen Literale umfassen die Ziffern
0bis9oder ein beliebiges Unicode-Äquivalent (Codepunkte mit der EigenschaftNd).Siehe den Unicode-Standard für eine vollständige Liste der Codepunkte mit der Eigenschaft
Nd.
Alle numbers.Real-Typen (int und float) beinhalten auch die folgenden Operationen
Operation |
Ergebnis |
|---|---|
x gekürzt auf |
|
x gerundet auf n Nachkommastellen, Rundung zur nächsten geraden Zahl. Wenn n weggelassen wird, ist der Standardwert 0. |
|
die größte |
|
die kleinste |
Für zusätzliche numerische Operationen siehe die Module math und cmath.
Bitweise Operationen auf Ganzzahltypen¶
Bitweise Operationen sind nur für Ganzzahlen sinnvoll. Das Ergebnis von bitweisen Operationen wird berechnet, als ob es in Zweierkomplement mit einer unendlichen Anzahl von Vorzeichenbits durchgeführt worden wäre.
Die Prioritäten der binären bitweisen Operationen sind alle niedriger als die der numerischen Operationen und höher als die der Vergleiche; die unäre Operation ~ hat die gleiche Priorität wie die anderen unären numerischen Operationen (+ und -).
Diese Tabelle listet die bitweisen Operationen auf, sortiert in aufsteigender Priorität
Operation |
Ergebnis |
Hinweise |
|---|---|---|
|
bitwise *oder* von x und y |
(4) |
|
bitwise *exklusives oder* von x und y |
(4) |
|
bitwise *und* von x und y |
(4) |
|
x um n Bits nach links verschoben |
(1)(2) |
|
x um n Bits nach rechts verschoben |
(1)(3) |
|
die Bits von x invertiert |
Hinweise
Negative Verschiebungsanzahlen sind illegal und verursachen eine
ValueError.Eine Linksverschiebung um n Bits entspricht einer Multiplikation mit
pow(2, n).Eine Rechtsverschiebung um n Bits entspricht einer Ganzzahldivision durch
pow(2, n).Die Durchführung dieser Berechnungen mit mindestens einem zusätzlichen Vorzeichenerweiterungsbit in einer endlichen Zweierkomplementdarstellung (einer Arbeitsbitbreite von
1 + max(x.bit_length(), y.bit_length())oder mehr) ist ausreichend, um das gleiche Ergebnis zu erzielen, als ob es eine unendliche Anzahl von Vorzeichenbits gäbe.
Zusätzliche Methoden für Ganzzahltypen¶
Der Typ `int` implementiert die numbers.Integral abstrakte Basisklasse. Zusätzlich bietet er einige weitere Methoden
- int.bit_length()¶
Gibt die Anzahl der Bits zurück, die zur Darstellung einer Ganzzahl in binärer Form benötigt werden, ohne Vorzeichen und führende Nullen
>>> n = -37 >>> bin(n) '-0b100101' >>> n.bit_length() 6
Genauer gesagt, wenn
xungleich Null ist, dann istx.bit_length()die eindeutige positive ganze Zahlk, so dass2**(k-1) <= abs(x) < 2**k. Äquivalent dazu, wennabs(x)klein genug ist, um einen korrekt gerundeten Logarithmus zu haben, dann istk = 1 + int(log(abs(x), 2)). WennxNull ist, gibtx.bit_length()den Wert0zurück.Entspricht
def bit_length(self): s = bin(self) # binary representation: bin(-37) --> '-0b100101' s = s.lstrip('-0b') # remove leading zeros and minus sign return len(s) # len('100101') --> 6
Hinzugefügt in Version 3.1.
- int.bit_count()¶
Gibt die Anzahl der Einsen in der binären Darstellung des Absolutwerts der Ganzzahl zurück. Dies ist auch als Populationsanzahl bekannt. Beispiel
>>> n = 19 >>> bin(n) '0b10011' >>> n.bit_count() 3 >>> (-n).bit_count() 3
Entspricht
def bit_count(self): return bin(self).count("1")
Hinzugefügt in Version 3.10.
- int.to_bytes(length=1, byteorder='big', *, signed=False)¶
Gibt ein Byte-Array zurück, das eine Ganzzahl darstellt.
>>> (1024).to_bytes(2, byteorder='big') b'\x04\x00' >>> (1024).to_bytes(10, byteorder='big') b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' >>> (-1024).to_bytes(10, byteorder='big', signed=True) b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00' >>> x = 1000 >>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little') b'\xe8\x03'
Die Ganzzahl wird mit length Bytes dargestellt und hat standardmäßig den Wert 1. Es wird ein
OverflowErrorausgelöst, wenn die Ganzzahl nicht mit der angegebenen Anzahl von Bytes dargestellt werden kann.Das Argument byteorder bestimmt die Byte-Reihenfolge, die zur Darstellung der Ganzzahl verwendet wird, und hat standardmäßig den Wert
"big". Wenn byteorder"big"ist, befindet sich das höchstwertige Byte am Anfang des Byte-Arrays. Wenn byteorder"little"ist, befindet sich das höchstwertige Byte am Ende des Byte-Arrays.Das Argument signed bestimmt, ob das Zweierkomplement zur Darstellung der Ganzzahl verwendet wird. Wenn signed
Falseist und eine negative Ganzzahl übergeben wird, wird einOverflowErrorausgelöst. Der Standardwert für signed istFalse.Die Standardwerte können verwendet werden, um eine Ganzzahl bequem in ein einzelnes Byte-Objekt umzuwandeln
>>> (65).to_bytes() b'A'
Wenn Sie jedoch die Standardargumente verwenden, versuchen Sie nicht, einen Wert größer als 255 umzuwandeln, da Sie sonst einen
OverflowErrorerhalten.Entspricht
def to_bytes(n, length=1, byteorder='big', signed=False): if byteorder == 'little': order = range(length) elif byteorder == 'big': order = reversed(range(length)) else: raise ValueError("byteorder must be either 'little' or 'big'") return bytes((n >> i*8) & 0xff for i in order)
Hinzugefügt in Version 3.2.
Geändert in Version 3.11: Standardargumentwerte für
lengthundbyteorderhinzugefügt.
- classmethod int.from_bytes(bytes, byteorder='big', *, signed=False)¶
Gibt die Ganzzahl zurück, die durch das gegebene Byte-Array dargestellt wird.
>>> int.from_bytes(b'\x00\x10', byteorder='big') 16 >>> int.from_bytes(b'\x00\x10', byteorder='little') 4096 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True) -1024 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False) 64512 >>> int.from_bytes([255, 0, 0], byteorder='big') 16711680
Das Argument bytes muss entweder ein byte-ähnliches Objekt oder ein iterierbares Objekt sein, das Bytes liefert.
Das Argument byteorder bestimmt die Byte-Reihenfolge, die zur Darstellung der Ganzzahl verwendet wird, und hat standardmäßig den Wert
"big". Wenn byteorder"big"ist, befindet sich das höchstwertige Byte am Anfang des Byte-Arrays. Wenn byteorder"little"ist, befindet sich das höchstwertige Byte am Ende des Byte-Arrays. Um die native Byte-Reihenfolge des Hostsystems anzufordern, verwenden Siesys.byteorderals Byte-Reihenfolgenwert.Das Argument signed gibt an, ob das Zweierkomplement zur Darstellung der Ganzzahl verwendet wird.
Entspricht
def from_bytes(bytes, byteorder='big', signed=False): if byteorder == 'little': little_ordered = list(bytes) elif byteorder == 'big': little_ordered = list(reversed(bytes)) else: raise ValueError("byteorder must be either 'little' or 'big'") n = sum(b << i*8 for i, b in enumerate(little_ordered)) if signed and little_ordered and (little_ordered[-1] & 0x80): n -= 1 << 8*len(little_ordered) return n
Hinzugefügt in Version 3.2.
Geändert in Version 3.11: Standardargumentwert für
byteorderhinzugefügt.
- int.as_integer_ratio()¶
Gibt ein Paar von ganzen Zahlen zurück, deren Verhältnis gleich der ursprünglichen ganzen Zahl ist und einen positiven Nenner hat. Das ganzzahlige Verhältnis von ganzen Zahlen (ganzen Zahlen) ist immer die ganze Zahl als Zähler und
1als Nenner.Hinzugefügt in Version 3.8.
- int.is_integer()¶
Gibt
Truezurück. Existiert für Duck-Typ-Kompatibilität mitfloat.is_integer().Hinzugefügt in Version 3.12.
Zusätzliche Methoden für Float¶
Der Float-Typ implementiert die numbers.Real abstrakte Basisklasse. Float hat auch die folgenden zusätzlichen Methoden.
- classmethod float.from_number(x)¶
Klassenmethode zur Rückgabe einer Gleitkommazahl, die aus einer Zahl x konstruiert wurde.
Wenn das Argument eine ganze Zahl oder eine Gleitkommazahl ist, wird eine Gleitkommazahl mit demselben Wert (innerhalb der Gleitkommagenauigkeit von Python) zurückgegeben. Wenn das Argument außerhalb des Bereichs eines Python-Floats liegt, wird ein
OverflowErrorausgelöst.Für ein allgemeines Python-Objekt
xdelegiertfloat.from_number(x)anx.__float__(). Wenn__float__()nicht definiert ist, wird auf__index__()zurückgegriffen.Hinzugefügt in Version 3.14.
- float.as_integer_ratio()¶
Gibt ein Paar von ganzen Zahlen zurück, deren Verhältnis exakt gleich dem ursprünglichen Float ist. Das Verhältnis ist in gekürzter Form und hat einen positiven Nenner. Löst
OverflowErrorbei Unendlichkeiten und einenValueErrorbei NaNs aus.
- float.is_integer()¶
Gibt
Truezurück, wenn die Float-Instanz endlich mit ganzzahligem Wert ist, und andernfallsFalse.>>> (-2.0).is_integer() True >>> (3.2).is_integer() False
Zwei Methoden unterstützen die Konvertierung von und zu hexadezimalen Strings. Da Pythons Floats intern als Binärzahlen gespeichert werden, beinhaltet die Konvertierung eines Floats von oder zu einem *Dezimal*-String normalerweise einen kleinen Rundungsfehler. Im Gegensatz dazu ermöglichen hexadezimale Strings eine exakte Darstellung und Spezifikation von Gleitkommazahlen. Dies kann bei der Fehlersuche und in numerischen Arbeiten nützlich sein.
- float.hex()¶
Gibt eine Darstellung einer Gleitkommazahl als hexadezimalen String zurück. Für endliche Gleitkommazahlen enthält diese Darstellung immer eine führende
0xund eine nachfolgendepmit Exponent.
- classmethod float.fromhex(s)¶
Klassenmethode zur Rückgabe des Floats, der durch einen hexadezimalen String s dargestellt wird. Der String s kann führende und nachfolgende Leerzeichen enthalten.
Beachten Sie, dass float.hex() eine Instanzmethode ist, während float.fromhex() eine Klassenmethode ist.
Ein hexadezimaler String hat das Format
[sign] ['0x'] integer ['.' fraction] ['p' exponent]
wobei das optionale sign entweder + oder - sein kann, integer und fraction Strings hexadezimaler Ziffern sind und exponent eine dezimale ganze Zahl mit optionalem führenden Vorzeichen ist. Die Groß-/Kleinschreibung wird nicht beachtet, und es muss mindestens eine hexadezimale Ziffer entweder im ganzzahligen Teil oder im Bruchteil vorhanden sein. Diese Syntax ähnelt der in Abschnitt 6.4.4.2 des C99-Standards angegebenen Syntax und auch der in Java 1.5 und neuer verwendeten Syntax. Insbesondere ist die Ausgabe von float.hex() als hexadezimales Gleitkomma-Literal in C- oder Java-Code verwendbar, und von C's %a Formatzeichen oder Java's Double.toHexString erzeugte hexadezimale Strings werden von float.fromhex() akzeptiert.
Beachten Sie, dass der Exponent dezimal statt hexadezimal geschrieben wird und die Potenz von 2 angibt, mit der der Koeffizient multipliziert werden soll. Zum Beispiel repräsentiert der hexadezimale String 0x3.a7p10 die Gleitkommazahl (3 + 10./16 + 7./16**2) * 2.0**10 oder 3740.0.
>>> float.fromhex('0x3.a7p10')
3740.0
Die Rückkonvertierung von 3740.0 ergibt einen anderen hexadezimalen String, der dieselbe Zahl darstellt:
>>> float.hex(3740.0)
'0x1.d380000000000p+11'
Zusätzliche Methoden für Complex¶
Der complex-Typ implementiert die numbers.Complex abstrakte Basisklasse. complex hat auch die folgenden zusätzlichen Methoden.
- classmethod complex.from_number(x)¶
Klassenmethode zur Konvertierung einer Zahl in eine komplexe Zahl.
Für ein allgemeines Python-Objekt
xdelegiertcomplex.from_number(x)anx.__complex__(). Wenn__complex__()nicht definiert ist, wird auf__float__()zurückgegriffen. Wenn__float__()nicht definiert ist, wird auf__index__()zurückgegriffen.Hinzugefügt in Version 3.14.
Hashing numerischer Typen¶
Für Zahlen x und y, möglicherweise unterschiedlichen Typs, ist es eine Anforderung, dass hash(x) == hash(y) ist, wann immer x == y (siehe die Dokumentation der Methode __hash__() für weitere Details). Zur Vereinfachung der Implementierung und Effizienz über eine Vielzahl von numerischen Typen (einschließlich int, float, decimal.Decimal und fractions.Fraction) basiert Pythons Hash für numerische Typen auf einer einzigen mathematischen Funktion, die für jede rationale Zahl definiert ist und daher für alle Instanzen von int und fractions.Fraction und alle endlichen Instanzen von float und decimal.Decimal gilt. Im Wesentlichen wird diese Funktion durch Reduktion modulo P für eine feste Primzahl P gegeben. Der Wert von P ist Python als Attribut modulus von sys.hash_info zugänglich.
CPython-Implementierungsdetail: Derzeit wird die verwendete Primzahl P = 2**31 - 1 auf Maschinen mit 32-Bit-C-Longs und P = 2**61 - 1 auf Maschinen mit 64-Bit-C-Longs verwendet.
Hier sind die Regeln im Detail:
Wenn
x = m / neine nicht-negative rationale Zahl ist undnnicht durchPteilbar ist, definieren Siehash(x)alsm * invmod(n, P) % P, wobeiinvmod(n, P)den Inversen vonnmoduloPangibt.Wenn
x = m / neine nicht-negative rationale Zahl ist undndurchPteilbar ist (abermnicht), dann hatnkeinen inversen moduloPund die obige Regel gilt nicht; in diesem Fall definieren Siehash(x)als den konstanten Wertsys.hash_info.inf.Wenn
x = m / neine negative rationale Zahl ist, definieren Siehash(x)als-hash(-x). Wenn der resultierende Hash-1ist, ersetzen Sie ihn durch-2.Die spezifischen Werte
sys.hash_info.infund-sys.hash_info.infwerden als Hash-Werte für positive Unendlichkeit bzw. negative Unendlichkeit verwendet.Für eine
complex-Zahlzwerden die Hash-Werte der realen und imaginären Teile kombiniert, indemhash(z.real) + sys.hash_info.imag * hash(z.imag)berechnet wird, reduziert modulo2**sys.hash_info.width, so dass er im Bereichrange(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width - 1))liegt. Auch hier wird das Ergebnis durch-2ersetzt, wenn es-1ist.
Zur Verdeutlichung der obigen Regeln, hier ist ein Beispiel-Python-Code, der dem integrierten Hash entspricht und zur Berechnung des Hash einer rationalen Zahl, eines float oder eines complex verwendet wird:
import sys, math
def hash_fraction(m, n):
"""Compute the hash of a rational number m / n.
Assumes m and n are integers, with n positive.
Equivalent to hash(fractions.Fraction(m, n)).
"""
P = sys.hash_info.modulus
# Remove common factors of P. (Unnecessary if m and n already coprime.)
while m % P == n % P == 0:
m, n = m // P, n // P
if n % P == 0:
hash_value = sys.hash_info.inf
else:
# Fermat's Little Theorem: pow(n, P-1, P) is 1, so
# pow(n, P-2, P) gives the inverse of n modulo P.
hash_value = (abs(m) % P) * pow(n, P - 2, P) % P
if m < 0:
hash_value = -hash_value
if hash_value == -1:
hash_value = -2
return hash_value
def hash_float(x):
"""Compute the hash of a float x."""
if math.isnan(x):
return object.__hash__(x)
elif math.isinf(x):
return sys.hash_info.inf if x > 0 else -sys.hash_info.inf
else:
return hash_fraction(*x.as_integer_ratio())
def hash_complex(z):
"""Compute the hash of a complex number z."""
hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)
# do a signed reduction modulo 2**sys.hash_info.width
M = 2**(sys.hash_info.width - 1)
hash_value = (hash_value & (M - 1)) - (hash_value & M)
if hash_value == -1:
hash_value = -2
return hash_value
Boolescher Typ - bool¶
Booleans repräsentieren Wahrheitswerte. Der bool-Typ hat genau zwei konstante Instanzen: True und False.
Die eingebaute Funktion bool() konvertiert jeden Wert in einen Boolean, wenn der Wert als Wahrheitswert interpretiert werden kann (siehe Abschnitt Wahrheitswertprüfung oben).
Für logische Operationen verwenden Sie die Booleschen Operatoren and, or und not. Wenn die bitweisen Operatoren &, |, ^ auf zwei Booleans angewendet werden, geben sie einen Bool zurück, der äquivalent zu den logischen Operationen „and“, „or“, „xor“ ist. Die logischen Operatoren and, or und != sollten jedoch &, | und ^ vorgezogen werden.
Veraltet seit Version 3.12: Die Verwendung des bitweisen Inversionsoperators ~ ist veraltet und wird in Python 3.16 einen Fehler auslösen.
bool ist eine Unterklasse von int (siehe Numerische Typen — int, float, complex). In vielen numerischen Kontexten verhalten sich False und True wie die ganzen Zahlen 0 und 1. Dies zu nutzen, wird jedoch nicht empfohlen; konvertieren Sie stattdessen explizit mit int().
Iteratortypen¶
Python unterstützt das Konzept der Iteration über Container. Dies wird durch zwei verschiedene Methoden implementiert; diese werden verwendet, um benutzerdefinierten Klassen die Unterstützung der Iteration zu ermöglichen. Sequenzen, die im Folgenden detaillierter beschrieben werden, unterstützen immer die Iterationsmethoden.
Eine Methode muss für Containerobjekte definiert werden, um iterable-Unterstützung bereitzustellen:
- container.__iter__()¶
Gibt ein iterator-Objekt zurück. Das Objekt muss das unten beschriebene Iterator-Protokoll unterstützen. Wenn ein Container verschiedene Iterationstypen unterstützt, können zusätzliche Methoden bereitgestellt werden, um spezifisch Iteratoren für diese Iterationstypen anzufordern. (Ein Beispiel für ein Objekt, das mehrere Formen der Iteration unterstützt, wäre eine Baumstruktur, die sowohl eine Breitensuche als auch eine Tiefensuche unterstützt.) Diese Methode entspricht dem
tp_iter-Slot der Typenstruktur für Python-Objekte in der Python/C-API.
Die Iteratorobjekte selbst müssen die folgenden beiden Methoden unterstützen, die zusammen das *Iterator-Protokoll* bilden:
- iterator.__iter__()¶
Gibt das iterator-Objekt selbst zurück. Dies ist erforderlich, um sowohl Container als auch Iteratoren mit den
for- undin-Anweisungen verwenden zu können. Diese Methode entspricht demtp_iter-Slot der Typenstruktur für Python-Objekte in der Python/C-API.
- iterator.__next__()¶
Gibt das nächste Element aus dem iterator zurück. Wenn keine weiteren Elemente vorhanden sind, wird die
StopIteration-Ausnahme ausgelöst. Diese Methode entspricht demtp_iternext-Slot der Typenstruktur für Python-Objekte in der Python/C-API.
Python definiert mehrere Iteratortypen, um die Iteration über allgemeine und spezifische Sequenztypen, Wörterbücher und andere spezialisiertere Formen zu unterstützen. Die spezifischen Typen sind nicht wichtig, abgesehen von ihrer Implementierung des Iterator-Protokolls.
Sobald die __next__()-Methode eines Iterators StopIteration auslöst, muss sie bei nachfolgenden Aufrufen weiterhin dies tun. Implementierungen, die diese Eigenschaft nicht einhalten, gelten als fehlerhaft.
Generatortypen¶
Pythons generatoren bieten eine bequeme Möglichkeit, das Iterator-Protokoll zu implementieren. Wenn die __iter__()-Methode eines Container-Objekts als Generator implementiert ist, gibt sie automatisch ein Iterator-Objekt zurück (technisch gesehen ein Generator-Objekt), das die Methoden __iter__() und __next__() bereitstellt. Weitere Informationen zu Generatoren finden Sie in der Dokumentation für den Yield-Ausdruck.
Sequenztypen — list, tuple, range¶
Es gibt drei grundlegende Sequenztypen: Listen, Tupel und Range-Objekte. Zusätzliche Sequenztypen, die für die Verarbeitung von Binärdaten und Textstrings zugeschnitten sind, werden in separaten Abschnitten beschrieben.
Gemeinsame Sequenzoperationen¶
Die Operationen in der folgenden Tabelle werden von den meisten Sequenztypen, sowohl mutierbaren als auch immutierbaren, unterstützt. Die collections.abc.Sequence ABC wird bereitgestellt, um die korrekte Implementierung dieser Operationen auf benutzerdefinierten Sequenztypen zu erleichtern.
Diese Tabelle listet die Sequenzoperationen nach aufsteigender Priorität auf. In der Tabelle sind s und t Sequenzen desselben Typs, n, i, j und k sind ganze Zahlen und x ist ein beliebiges Objekt, das die von s auferlegten Typ- und Wertbeschränkungen erfüllt.
Die Operationen in und not in haben die gleiche Priorität wie die Vergleichsoperationen. Die Operationen + (Konkatenation) und * (Wiederholung) haben die gleiche Priorität wie die entsprechenden numerischen Operationen. [3]
Operation |
Ergebnis |
Hinweise |
|---|---|---|
|
|
(1) |
|
|
(1) |
|
die Konkatenation von s und t. |
(6)(7) |
|
entspricht der Addition von s zu sich selbst n Mal. |
(2)(7) |
|
i-tes Element von s, Index 0 |
(3)(8) |
|
Slice von s von i bis j. |
(3)(4) |
|
Slice von s von i bis j mit Schrittweite k. |
(3)(5) |
|
Länge von s. |
|
|
kleinstes Element von s. |
|
|
größtes Element von s. |
Sequenzen desselben Typs unterstützen auch Vergleiche. Insbesondere Tupel und Listen werden lexikografisch verglichen, indem entsprechende Elemente verglichen werden. Das bedeutet, dass zur Gleichheit jedes Element gleich sein muss und die beiden Sequenzen vom selben Typ sein und die gleiche Länge haben müssen. (Vollständige Details finden Sie unter Vergleiche in der Sprachreferenz.)
Vorwärts- und Rückwärtsiteratoren über mutierbare Sequenzen greifen über einen Index auf Werte zu. Dieser Index wird weiter vorwärts (oder rückwärts) laufen, auch wenn die zugrunde liegende Sequenz mutiert wird. Der Iterator endet nur, wenn ein IndexError oder ein StopIteration angetroffen wird (oder wenn der Index unter Null fällt).
Hinweise
Während die Operationen
inundnot inim allgemeinen Fall nur für einfache Enthaltungstests verwendet werden, verwenden einige spezialisierte Sequenzen (wiestr,bytesundbytearray) sie auch für Untersequenztests.>>> "gg" in "eggs" True
Werte von n kleiner als
0werden als0behandelt (was eine leere Sequenz des gleichen Typs wie s ergibt). Beachten Sie, dass Elemente in der Sequenz s nicht kopiert werden; sie werden mehrmals referenziert. Dies plagt oft neue Python-Programmierer; betrachten Sie>>> lists = [[]] * 3 >>> lists [[], [], []] >>> lists[0].append(3) >>> lists [[3], [3], [3]]
Was passiert ist, dass
[[]]eine Ein-Element-Liste ist, die eine leere Liste enthält, so dass alle drei Elemente von[[]] * 3Referenzen auf diese einzelne leere Liste sind. Das Ändern eines beliebigen Elements vonlistsändert diese einzelne Liste. Sie können auf diese Weise eine Liste verschiedener Listen erstellen:>>> lists = [[] for i in range(3)] >>> lists[0].append(3) >>> lists[1].append(5) >>> lists[2].append(7) >>> lists [[3], [5], [7]]
Weitere Erklärungen finden Sie im FAQ-Eintrag Wie erstelle ich eine mehrdimensionale Liste?.
Wenn i oder j negativ sind, ist der Index relativ zum Ende der Sequenz s:
len(s) + ioderlen(s) + jwird substituiert. Beachten Sie jedoch, dass-0immer noch0ist.Der Slice von s von i bis j ist definiert als die Sequenz von Elementen mit dem Index k, so dass
i <= k < j. Wenn i oder j größer alslen(s)ist, wirdlen(s)verwendet. Wenn i weggelassen wird oderNoneist, wird0verwendet. Wenn j weggelassen wird oderNoneist, wirdlen(s)verwendet. Wenn i größer oder gleich j ist, ist der Slice leer.Der Slice von s von i bis j mit Schrittweite k ist definiert als die Sequenz von Elementen mit dem Index
x = i + n*k, so dass0 <= n < (j-i)/k. Anders ausgedrückt sind die Indizesi,i+k,i+2*k,i+3*kund so weiter, wobei gestoppt wird, wenn j erreicht wird (aber j niemals eingeschlossen wird). Wenn k positiv ist, werden i und j auflen(s)reduziert, wenn sie größer sind. Wenn k negativ ist, werden i und j auflen(s) - 1reduziert, wenn sie größer sind. Wenn i oder j weggelassen werden oderNonesind, werden sie zu „Endwert“-Werten (welches Ende hängt vom Vorzeichen von k ab). Beachten Sie, dass k nicht Null sein kann. Wenn kNoneist, wird es wie1behandelt.Das Verketten von unveränderlichen Sequenzen ergibt immer ein neues Objekt. Das bedeutet, dass das Aufbauen einer Sequenz durch wiederholtes Verketten eine Laufzeitkosten quadratisch zur gesamten Sequenzlänge hat. Um eine lineare Laufzeit zu erzielen, müssen Sie zu einer der folgenden Alternativen wechseln.
Wenn Sie
strObjekte verketten, können Sie eine Liste erstellen und am Endestr.join()verwenden oder alternativ in eineio.StringIOInstanz schreiben und ihren Wert abrufen, wenn sie vollständig ist.Wenn Sie
bytesObjekte verketten, können Sie ähnlichbytes.join()oderio.BytesIOverwenden, oder Sie können die In-Place-Verkettung mit einembytearrayObjekt durchführen.bytearrayObjekte sind veränderlich und verfügen über einen effizienten Mechanismus zur Vorabzuallokation.Wenn Sie
tupleObjekte verketten, erweitern Sie stattdessen einelist.Für andere Typen untersuchen Sie die Dokumentation der entsprechenden Klasse.
Einige Sequenztypen (wie z. B.
range) unterstützen nur Elementsequenzen, die bestimmten Mustern folgen, und unterstützen daher keine Sequenzverkettung oder -wiederholung.Ein
IndexErrorwird ausgelöst, wenn i außerhalb des Sequenzbereichs liegt.
Sequenzmethoden
Sequenztypen unterstützen auch die folgenden Methoden
- sequence.count(value, /)¶
Gibt die Gesamtzahl der Vorkommen von value in sequence zurück.
- sequence.index(value[, start[, stop])¶
Gibt den Index des ersten Vorkommens von value in sequence zurück.
Löst einen
ValueErroraus, wenn value nicht in sequence gefunden wird.Die Argumente start und stop ermöglichen eine effiziente Suche in Teilabschnitten der Sequenz, beginnend bei start und endend bei stop. Dies ist ungefähr gleichbedeutend mit
start + sequence[start:stop].index(value), nur ohne das Kopieren von Daten.Vorsicht
Nicht alle Sequenztypen unterstützen die Übergabe der Argumente start und stop.
Unveränderliche Sequenztypen¶
Die einzige Operation, die unveränderliche Sequenztypen generell implementieren und die nicht auch von veränderlichen Sequenztypen implementiert wird, ist die Unterstützung für die eingebaute Funktion hash().
Diese Unterstützung ermöglicht es, unveränderliche Sequenzen, wie z. B. tuple-Instanzen, als dict-Schlüssel zu verwenden und in set- und frozenset-Instanzen zu speichern.
Der Versuch, eine unveränderliche Sequenz zu hashen, die nicht haschbare Werte enthält, führt zu einem TypeError.
Veränderliche Sequenztypen¶
Die Operationen in der folgenden Tabelle sind für veränderliche Sequenztypen definiert. Die collections.abc.MutableSequence ABC wird bereitgestellt, um die korrekte Implementierung dieser Operationen für benutzerdefinierte Sequenztypen zu erleichtern.
In der Tabelle ist s eine Instanz eines veränderlichen Sequenztyps, t ist ein beliebiges iterierbares Objekt und x ist ein beliebiges Objekt, das die von s auferlegten Typ- und Wertbeschränkungen erfüllt (zum Beispiel akzeptiert bytearray nur ganze Zahlen, die die Wertbeschränkung 0 <= x <= 255 erfüllen).
Operation |
Ergebnis |
Hinweise |
|---|---|---|
|
Element i von s wird durch x ersetzt. |
|
|
Entfernt Element i aus s. |
|
|
Slice von s von i bis j wird durch den Inhalt des Iterables t ersetzt. |
|
|
Entfernt die Elemente von |
|
|
Die Elemente von |
(1) |
|
Entfernt die Elemente von |
|
|
Erweitert s um den Inhalt von t (weitgehend dasselbe wie |
|
|
Aktualisiert s mit seinem Inhalt, wiederholt n Mal. |
(2) |
Hinweise
Wenn k ungleich
1ist, muss t die gleiche Länge haben wie der Slice, den es ersetzt.Der Wert n ist eine ganze Zahl oder ein Objekt, das
__index__()implementiert. Null und negative Werte von n leeren die Sequenz. Elemente in der Sequenz werden nicht kopiert; sie werden mehrfach referenziert, wie fürs * nunter Gemeinsame Sequenzoperationen erklärt.
Methoden veränderlicher Sequenzen
Veränderliche Sequenztypen unterstützen auch die folgenden Methoden
- sequence.append(value, /)¶
Fügt value am Ende der Sequenz an. Dies entspricht dem Schreiben von
seq[len(seq):len(seq)] = [value].
- sequence.clear()¶
Hinzugefügt in Version 3.3.
Entfernt alle Elemente aus sequence. Dies entspricht dem Schreiben von
del sequence[:].
- sequence.copy()¶
Hinzugefügt in Version 3.3.
Erstellt eine flache Kopie von sequence. Dies entspricht dem Schreiben von
sequence[:].Hinweis
Die Methode
copy()ist kein Teil derMutableSequenceABC, aber die meisten konkreten veränderlichen Sequenztypen stellen sie bereit.
- sequence.extend(iterable, /)¶
Erweitert sequence um den Inhalt von iterable. Dies entspricht weitgehend dem Schreiben von
seq[len(seq):len(seq)] = iterable.
- sequence.insert(index, value, /)¶
Fügt value an der angegebenen index in sequence ein. Dies entspricht dem Schreiben von
sequence[index:index] = [value].
- sequence.pop(index=-1, /)¶
Ruft das Element am index ab und entfernt es auch aus sequence. Standardmäßig wird das letzte Element in sequence entfernt und zurückgegeben.
- sequence.remove(value, /)¶
Entfernt das erste Element aus sequence, bei dem
sequence[i] == valuegilt.Löst einen
ValueErroraus, wenn value nicht in sequence gefunden wird.
- sequence.reverse()¶
Kehrt die Elemente von sequence an Ort und Stelle um. Diese Methode spart Speicherplatz beim Umkehren einer großen Sequenz. Um Benutzer daran zu erinnern, dass sie per Nebeneffekt arbeitet, gibt sie
Nonezurück.
Listen¶
Listen sind veränderliche Sequenzen, die typischerweise zum Speichern von Sammlungen homogener Elemente verwendet werden (wobei der genaue Grad der Ähnlichkeit je nach Anwendung variiert).
- class list(iterable=(), /)¶
Listen können auf verschiedene Arten konstruiert werden
Verwendung eines Paares eckiger Klammern, um die leere Liste zu bezeichnen:
[]Verwendung eckiger Klammern, Elemente durch Kommas getrennt:
[a],[a, b, c]Verwendung einer Listen-Komprehension:
[x for x in iterable]Verwendung des Typkonstruktors:
list()oderlist(iterable)
Der Konstruktor erstellt eine Liste, deren Elemente die gleichen sind und in der gleichen Reihenfolge wie die von iterable’s Elementen. iterable kann entweder eine Sequenz, ein Container, der Iteration unterstützt, oder ein Iterator-Objekt sein. Wenn iterable bereits eine Liste ist, wird eine Kopie erstellt und zurückgegeben, ähnlich wie bei
iterable[:]. Zum Beispiel gibtlist('abc')['a', 'b', 'c']zurück undlist( (1, 2, 3) )gibt[1, 2, 3]zurück. Wenn kein Argument angegeben wird, erstellt der Konstruktor eine neue leere Liste,[].Viele andere Operationen erzeugen ebenfalls Listen, einschließlich der eingebauten Funktion
sorted().Listen implementieren alle gemeinsamen und veränderlichen Sequenzoperationen. Listen bieten außerdem die folgende zusätzliche Methode
- sort(*, key=None, reverse=False)¶
Diese Methode sortiert die Liste an Ort und Stelle, indem sie nur
<-Vergleiche zwischen Elementen verwendet. Ausnahmen werden nicht unterdrückt - wenn irgendeine Vergleichsoperation fehlschlägt, schlägt die gesamte Sortieroperation fehl (und die Liste bleibt wahrscheinlich teilweise modifiziert).sort()akzeptiert zwei Argumente, die nur als Schlüsselwortargumente übergeben werden können (Keyword-only arguments)key gibt eine Funktion mit einem Argument an, die verwendet wird, um einen Vergleichsschlüssel aus jedem Listenelement zu extrahieren (z. B.
key=str.lower). Der Schlüssel, der jedem Element in der Liste entspricht, wird einmal berechnet und dann für den gesamten Sortierprozess verwendet. Der StandardwertNonebedeutet, dass die Listenelemente direkt sortiert werden, ohne einen separaten Schlüsselwert zu berechnen.Das Hilfsmittel
functools.cmp_to_key()ist verfügbar, um eine 2.x-Stil-cmp-Funktion in eine key-Funktion zu konvertieren.reverse ist ein boolescher Wert. Wenn er auf
Truegesetzt ist, werden die Listenelemente so sortiert, als ob jeder Vergleich umgekehrt wäre.Diese Methode modifiziert die Sequenz an Ort und Stelle, um Speicherplatz zu sparen, wenn eine große Sequenz sortiert wird. Um Benutzer daran zu erinnern, dass sie per Nebeneffekt arbeitet, gibt sie nicht die sortierte Sequenz zurück (verwenden Sie
sorted(), um explizit eine neue sortierte Listeninstanz anzufordern).Die Methode
sort()ist garantiert stabil. Eine Sortierung ist stabil, wenn sie garantiert, die relative Reihenfolge von Elementen, die gleich verglichen werden, nicht zu ändern — dies ist hilfreich für das Sortieren in mehreren Durchläufen (z. B. sortieren nach Abteilung, dann nach Gehaltsstufe).Für Sortierbeispiele und eine kurze Sortieranleitung siehe Sortiertechniken.
CPython-Implementierungsdetail: Während eine Liste sortiert wird, ist die Auswirkung des Versuchs, die Liste zu verändern oder sogar zu inspizieren, undefiniert. Die C-Implementierung von Python lässt die Liste währenddessen leer erscheinen und löst einen
ValueErroraus, wenn sie erkennen kann, dass die Liste während einer Sortierung verändert wurde.
Tupel¶
Tupel sind unveränderliche Sequenzen, die typischerweise zum Speichern von Sammlungen heterogener Daten verwendet werden (wie z. B. die 2-Tupel, die von der eingebauten Funktion enumerate() erzeugt werden). Tupel werden auch für Fälle verwendet, in denen eine unveränderliche Sequenz homogener Daten benötigt wird (wie z. B. die Speicherung in einer set- oder dict-Instanz).
- class tuple(iterable=(), /)¶
Tupel können auf verschiedene Arten konstruiert werden
Verwendung eines Paares von Klammern, um das leere Tupel zu bezeichnen:
()Verwendung eines abschließenden Kommas für ein Singleton-Tupel:
a,oder(a,)Elemente durch Kommas getrennt:
a, b, coder(a, b, c)Verwendung der eingebauten Funktion
tuple():tuple()odertuple(iterable)
Der Konstruktor erstellt ein Tupel, dessen Elemente die gleichen sind und in der gleichen Reihenfolge wie die von iterable’s Elementen. iterable kann entweder eine Sequenz, ein Container, der Iteration unterstützt, oder ein Iterator-Objekt sein. Wenn iterable bereits ein Tupel ist, wird es unverändert zurückgegeben. Zum Beispiel gibt
tuple('abc')('a', 'b', 'c')zurück undtuple( [1, 2, 3] )gibt(1, 2, 3)zurück. Wenn kein Argument angegeben wird, erstellt der Konstruktor ein neues leeres Tupel,().Beachten Sie, dass tatsächlich das Komma ein Tupel erzeugt, nicht die Klammern. Die Klammern sind optional, außer im Fall des leeren Tupels oder wenn sie benötigt werden, um syntaktische Mehrdeutigkeiten zu vermeiden. Zum Beispiel ist
f(a, b, c)ein Funktionsaufruf mit drei Argumenten, währendf((a, b, c))ein Funktionsaufruf mit einem 3-Tupel als einzigem Argument ist.Tupel implementieren alle gemeinsamen Sequenzoperationen.
Für heterogene Sammlungen von Daten, bei denen der Zugriff nach Namen klarer ist als der Zugriff nach Index, kann collections.namedtuple() eine geeignetere Wahl sein als ein einfaches Tupel-Objekt.
Bereiche¶
Der range-Typ repräsentiert eine unveränderliche Zahlenmenge und wird häufig für Schleifen einer bestimmten Anzahl von Wiederholungen in for-Schleifen verwendet.
- class range(stop, /)¶
- class range(start, stop, step=1, /)
Die Argumente für den Range-Konstruktor müssen ganze Zahlen sein (entweder eingebaute
intoder jedes Objekt, das die spezielle Methode__index__()implementiert). Wenn das Argument step weggelassen wird, ist der Standardwert1. Wenn das Argument start weggelassen wird, ist der Standardwert0. Wenn step Null ist, wird einValueErrorausgelöst.Für ein positives step werden die Inhalte eines Bereichs
rdurch die Formelr[i] = start + step*ibestimmt, wobeii >= 0undr[i] < stop.Für ein negatives step werden die Inhalte des Bereichs immer noch durch die Formel
r[i] = start + step*ibestimmt, aber die Einschränkungen sindi >= 0undr[i] > stop.Ein Range-Objekt ist leer, wenn
r[0]die Wertbeschränkung nicht erfüllt. Bereiche unterstützen negative Indizes, aber diese werden als Indizierung vom Ende der Sequenz interpretiert, die durch die positiven Indizes bestimmt wird.Bereiche, die absolute Werte größer als
sys.maxsizeenthalten, sind zulässig, aber einige Funktionen (wie z. B.len()) könnenOverflowErrorauslösen.Range-Beispiele
>>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> list(range(0, 30, 5)) [0, 5, 10, 15, 20, 25] >>> list(range(0, 10, 3)) [0, 3, 6, 9] >>> list(range(0, -10, -1)) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] >>> list(range(0)) [] >>> list(range(1, 0)) []
Bereiche implementieren alle gemeinsamen Sequenzoperationen mit Ausnahme von Verkettung und Wiederholung (da Range-Objekte nur Sequenzen darstellen können, die einem strengen Muster folgen, und Wiederholung und Verkettung dieses Muster normalerweise verletzen).
- start¶
Der Wert des Parameters start (oder
0, wenn der Parameter nicht angegeben wurde)
- stop¶
Der Wert des Parameters stop
- step¶
Der Wert des Parameters step (oder
1, wenn der Parameter nicht angegeben wurde)
Der Vorteil des range-Typs gegenüber einer regulären list oder tuple besteht darin, dass ein range-Objekt immer die gleiche (geringe) Menge an Speicherplatz benötigt, unabhängig von der Größe des von ihm dargestellten Bereichs (da es nur die Werte start, stop und step speichert und einzelne Elemente und Unterbereiche bei Bedarf berechnet).
Range-Objekte implementieren die collections.abc.Sequence ABC und bieten Funktionen wie Containment-Tests, Elementindex-Lookups, Slicing und Unterstützung für negative Indizes (siehe Sequenztypen — list, tuple, range)
>>> r = range(0, 20, 2)
>>> r
range(0, 20, 2)
>>> 11 in r
False
>>> 10 in r
True
>>> r.index(10)
5
>>> r[5]
10
>>> r[:5]
range(0, 10, 2)
>>> r[-1]
18
Das Testen von Range-Objekten auf Gleichheit mit == und != vergleicht sie als Sequenzen. Das bedeutet, zwei Range-Objekte gelten als gleich, wenn sie die gleiche Sequenz von Werten darstellen. (Beachten Sie, dass zwei Range-Objekte, die gleich sind, unterschiedliche start-, stop- und step-Attribute haben können, z. B. range(0) == range(2, 1, 3) oder range(0, 3, 2) == range(0, 4, 2).)
Geändert in Version 3.2: Implementierung der Sequence ABC. Unterstützung für Slicing und negative Indizes. Testen von int-Objekten auf Mitgliedschaft in konstanter Zeit anstatt durch Iteration aller Elemente.
Geändert in Version 3.3: Definition von „==“ und „!=“ zum Vergleichen von Range-Objekten basierend auf der von ihnen definierten Wertesequenz (anstatt des Vergleichens basierend auf der Objektidentität).
Siehe auch
Das linspace-Rezept zeigt, wie eine Lazy-Version von range für Gleitkommaanwendungen implementiert wird.
Zusammenfassung der Methoden für Text- und Binärsequenztypen¶
Die folgende Tabelle fasst die Methoden für Text- und Binärsequenztypen nach Kategorien zusammen.
Kategorie |
Methoden für |
|||||||
|---|---|---|---|---|---|---|---|---|
Formatierung |
||||||||
Suchen und Ersetzen |
||||||||
Teilen und Zusammenfügen |
||||||||
String-Klassifizierung |
||||||||
Groß-/Kleinschreibung ändern |
||||||||
Auffüllen und Abschneiden |
||||||||
Übersetzung und Kodierung |
||||||||
Textsequenztyp — str¶
Textuelle Daten in Python werden mit str-Objekten, oder auch Strings genannt, verarbeitet. Strings sind unveränderliche Sequenzen von Unicode-Codepunkten. String-Literale werden auf verschiedene Arten geschrieben
Einfache Anführungszeichen:
'ermöglicht eingebettete "doppelte" Anführungszeichen'Doppelte Anführungszeichen:
"ermöglicht eingebettete 'einfache' Anführungszeichen"Dreifach Anführungszeichen:
'''Drei einfache Anführungszeichen''',"""Drei doppelte Anführungszeichen"""
Dreifach Anführungszeichen können sich über mehrere Zeilen erstrecken – alle zugehörigen Leerzeichen werden in das String-Literal einbezogen.
String-Literale, die Teil eines einzigen Ausdrucks sind und nur Leerzeichen dazwischen haben, werden implizit in ein einziges String-Literal umgewandelt. Das heißt, ("spam " "eggs") == "spam eggs".
Siehe String- und Byte-Literale für mehr über die verschiedenen Formen von String-Literalen, einschließlich unterstützter Escape-Sequenzen und des Präfixes r („raw“), das die meisten Escape-Sequenzverarbeitungen deaktiviert.
Strings können auch aus anderen Objekten mit dem str-Konstruktor erstellt werden.
Da es keinen separaten „Zeichen“-Typ gibt, liefert das Indizieren eines Strings Strings der Länge 1. Das heißt, für einen nicht-leeren String s gilt s[0] == s[0:1].
Es gibt auch keinen veränderlichen String-Typ, aber str.join() oder io.StringIO können verwendet werden, um effizient Strings aus mehreren Fragmenten zu konstruieren.
Geändert in Version 3.3: Zur Rückwärtskompatibilität mit der Python 2-Serie ist das Präfix u auf String-Literalen wieder erlaubt. Es hat keinen Einfluss auf die Bedeutung von String-Literalen und kann nicht mit dem Präfix r kombiniert werden.
- class str(*, encoding='utf-8', errors='strict')¶
- class str(object)
- class str(object, encoding, errors='strict')
- class str(object, *, errors)
Gibt eine String-Version von object zurück. Wenn object nicht angegeben ist, wird ein leerer String zurückgegeben. Andernfalls hängt das Verhalten von
str()davon ab, ob encoding oder errors angegeben sind, wie folgt.Wenn weder encoding noch errors angegeben sind, gibt
str(object)type(object).__str__(object)zurück, was die „informelle“ oder gut druckbare String-Darstellung von object ist. Für String-Objekte ist dies der String selbst. Wenn object keine__str__()-Methode hat, dann greiftstr()auf die Rückgabe vonrepr(object)zurück.Wenn mindestens einer der Parameter encoding oder errors angegeben ist, sollte object ein bytes-ähnliches Objekt sein (z. B.
bytesoderbytearray). In diesem Fall ist, wenn object einbytes- (oderbytearray-) Objekt ist,str(bytes, encoding, errors)äquivalent zubytes.decode(encoding, errors). Andernfalls wird das der Pufferobjekt zugrundeliegende Bytes-Objekt abgerufen, bevorbytes.decode()aufgerufen wird. Informationen zu Pufferobjekten finden Sie in Binäre Sequenztypen — bytes, bytearray, memoryview und Pufferprotokoll.Das Übergeben eines
bytes-Objekts anstr()ohne die Argumente encoding oder errors fällt unter den ersten Fall, die informelle String-Darstellung zurückzugeben (siehe auch die Kommandozeilenoption-bfür Python). Zum Beispiel>>> str(b'Zoot!') "b'Zoot!'"
Weitere Informationen über die
str-Klasse und ihre Methoden finden Sie in Textsequenztyp — str und im Abschnitt String-Methoden unten. Zum Ausgeben formatierter Strings siehe die Abschnitte f-Strings und Formatierungs-Syntax für Strings. Außerdem siehe den Abschnitt Textverarbeitungsdienste.
String-Methoden¶
Strings implementieren alle gemeinsamen Sequenzoperationen sowie die unten beschriebenen zusätzlichen Methoden.
Strings unterstützen auch zwei Stile der String-Formatierung, wobei einer ein hohes Maß an Flexibilität und Anpassbarkeit bietet (siehe str.format(), Formatierungs-Syntax für Strings und Benutzerdefinierte String-Formatierung) und der andere auf der C printf-Stil-Formatierung basiert, die einen engeren Bereich von Typen behandelt und etwas schwieriger richtig zu verwenden ist, aber oft schneller für die Fälle ist, die sie behandeln kann (printf-Formatierung von Strings).
Der Abschnitt Textverarbeitungsdienste der Standardbibliothek behandelt eine Reihe weiterer Module, die verschiedene textbezogene Dienstprogramme bereitstellen (einschließlich Unterstützung für reguläre Ausdrücke im Modul re).
- str.capitalize()¶
Gibt eine Kopie des Strings zurück, bei der das erste Zeichen großgeschrieben und der Rest kleingeschrieben ist.
Geändert in Version 3.8: Das erste Zeichen wird nun in Großbuchstaben (Titlecase) anstatt in Großbuchstaben (Uppercase) gesetzt. Das bedeutet, dass Zeichen wie Digraphen nur ihren ersten Buchstaben großgeschrieben bekommen, anstatt des gesamten Zeichens.
- str.casefold()¶
Gibt eine casefolded Kopie des Strings zurück. Casefolded Strings können für den fallunabhängigen Abgleich verwendet werden.
Casefolding ist ähnlich wie Kleinschreibung, aber aggressiver, da es dazu bestimmt ist, alle Fallunterschiede in einem String zu entfernen. Zum Beispiel ist der deutsche Kleinbuchstabe
'ß'äquivalent zu"ss". Da er bereits klein geschrieben ist, würdelower()mit'ß'nichts tun;casefold()wandelt es in"ss"um.Der Casefolding-Algorithmus ist in Abschnitt 3.13 „Default Case Folding“ des Unicode-Standards beschrieben.
Hinzugefügt in Version 3.3.
- str.center(width, fillchar=' ', /)¶
Gibt zentriert in einem String der Länge width zurück. Die Auffüllung erfolgt mit dem angegebenen fillchar (Standard ist ein Leerzeichen im ASCII-Format). Der ursprüngliche String wird zurückgegeben, wenn width kleiner oder gleich
len(s)ist. Zum Beispiel>>> 'Python'.center(10) ' Python ' >>> 'Python'.center(10, '-') '--Python--' >>> 'Python'.center(4) 'Python'
- str.count(sub[, start[, end]])¶
Gibt die Anzahl der nicht überlappenden Vorkommen des Teilstrings sub im Bereich [start, end] zurück. Optionale Argumente start und end werden wie in der Slice-Notation interpretiert.
Wenn sub leer ist, wird die Anzahl der leeren Strings zwischen den Zeichen zurückgegeben, was der Länge des Strings plus eins entspricht. Zum Beispiel
>>> 'spam, spam, spam'.count('spam') 3 >>> 'spam, spam, spam'.count('spam', 5) 2 >>> 'spam, spam, spam'.count('spam', 5, 10) 1 >>> 'spam, spam, spam'.count('eggs') 0 >>> 'spam, spam, spam'.count('') 17
- str.encode(encoding='utf-8', errors='strict')¶
Gibt den String kodiert in
byteszurück.encoding ist standardmäßig
'utf-8'; siehe Standardkodierungen für mögliche Werte.errors steuert, wie Kodierungsfehler behandelt werden. Wenn
'strict'(Standard), wird eine Ausnahme vom TypUnicodeErrorausgelöst. Andere mögliche Werte sind'ignore','replace','xmlcharrefreplace','backslashreplace'und jeder andere Name, der übercodecs.register_error()registriert ist. Siehe Fehlerbehandlungsroutinen für Details.Aus Leistungsgründen wird der Wert von errors nicht auf Gültigkeit geprüft, es sei denn, es tritt tatsächlich ein Kodierungsfehler auf, der Python Development Mode aktiviert ist oder ein Debug-Build verwendet wird. Zum Beispiel
>>> encoded_str_to_bytes = 'Python'.encode() >>> type(encoded_str_to_bytes) <class 'bytes'> >>> encoded_str_to_bytes b'Python'
Geändert in Version 3.1: Unterstützung für Schlüsselwortargumente hinzugefügt.
Geändert in Version 3.9: Der Wert des Arguments errors wird nun im Python Development Mode und im Debug-Modus geprüft.
- str.endswith(suffix[, start[, end]])¶
Gibt
Truezurück, wenn der String mit dem angegebenen suffix endet, andernfallsFalse. suffix kann auch ein Tupel von Suffixen sein, nach denen gesucht werden soll. Mit optionalem start wird ab dieser Position getestet. Mit optionalem end wird der Vergleich an dieser Position beendet. Die Verwendung von start und end ist äquivalent zustr[start:end].endswith(suffix). Zum Beispiel>>> 'Python'.endswith('on') True >>> 'a tuple of suffixes'.endswith(('at', 'in')) False >>> 'a tuple of suffixes'.endswith(('at', 'es')) True >>> 'Python is amazing'.endswith('is', 0, 9) True
Siehe auch
startswith()undremovesuffix().
- str.expandtabs(tabsize=8)¶
Gibt eine Kopie des Strings zurück, bei der alle Tabulatorzeichen durch ein oder mehrere Leerzeichen ersetzt werden, abhängig von der aktuellen Spalte und der angegebenen Tabulatorgröße. Tabulatorpositionen treten alle tabsize Zeichen auf (Standard ist 8, was Tabulatorpositionen in den Spalten 0, 8, 16 usw. ergibt). Um den String zu erweitern, wird die aktuelle Spalte auf Null gesetzt und der String Zeichen für Zeichen untersucht. Wenn das Zeichen ein Tabulator ist (
\t), werden im Ergebnis ein oder mehrere Leerzeichen eingefügt, bis die aktuelle Spalte mit der nächsten Tabulatorposition übereinstimmt. (Das Tabulatorzeichen selbst wird nicht kopiert.) Wenn das Zeichen ein Zeilenumbruch ist (\n) oder ein Wagenrücklauf (\r), wird es kopiert und die aktuelle Spalte auf Null zurückgesetzt. Jedes andere Zeichen wird unverändert kopiert und die aktuelle Spalte wird unabhängig davon, wie das Zeichen beim Drucken dargestellt wird, um eins erhöht. Zum Beispiel>>> '01\t012\t0123\t01234'.expandtabs() '01 012 0123 01234' >>> '01\t012\t0123\t01234'.expandtabs(4) '01 012 0123 01234' >>> print('01\t012\n0123\t01234'.expandtabs(4)) 01 012 0123 01234
- str.find(sub[, start[, end]])¶
Gibt den niedrigsten Index im String zurück, an dem der Teilstring sub innerhalb des Slices
s[start:end]gefunden wird. Optionale Argumente start und end werden wie in der Slice-Notation interpretiert. Gibt-1zurück, wenn sub nicht gefunden wird. Zum Beispiel>>> 'spam, spam, spam'.find('sp') 0 >>> 'spam, spam, spam'.find('sp', 5) 6
- str.format(*args, **kwargs)¶
Führt eine String-Formatierungsoperation durch. Der String, auf dem diese Methode aufgerufen wird, kann literalen Text oder Ersetzungsfelder enthalten, die von geschweiften Klammern
{}begrenzt sind. Jedes Ersetzungsfeld enthält entweder den numerischen Index eines positionsgebundenen Arguments oder den Namen eines schlüsselwortgebundenen Arguments. Gibt eine Kopie des Strings zurück, bei der jedes Ersetzungsfeld durch den String-Wert des entsprechenden Arguments ersetzt wurde.>>> "The sum of 1 + 2 is {0}".format(1+2) 'The sum of 1 + 2 is 3'
Siehe Formatierungs-Syntax für Strings für eine Beschreibung der verschiedenen Formatierungsoptionen, die in Format-Strings angegeben werden können.
Hinweis
Beim Formatieren einer Zahl (
int,float,complex,decimal.Decimalund Unterklassen) mit demn-Typ (z. B.'{:n}'.format(1234)) setzt die Funktion vorübergehend dieLC_CTYPE-Locale auf dieLC_NUMERIC-Locale, um die Felderdecimal_pointundthousands_sepvonlocaleconv()zu dekodieren, wenn diese nicht-ASCII oder länger als 1 Byte sind und dieLC_NUMERIC-Locale von derLC_CTYPE-Locale abweicht. Diese temporäre Änderung wirkt sich auf andere Threads aus.Geändert in Version 3.7: Beim Formatieren einer Zahl mit dem
n-Typ setzt die Funktion in einigen Fällen vorübergehend dieLC_CTYPE-Locale auf dieLC_NUMERIC-Locale.
- str.format_map(mapping, /)¶
Ähnlich wie
str.format(**mapping), mit dem Unterschied, dassmappingdirekt verwendet und nicht in eindictkopiert wird. Dies ist nützlich, wennmappingbeispielsweise eine Unterklasse von dict ist>>> class Default(dict): ... def __missing__(self, key): ... return key ... >>> '{name} was born in {country}'.format_map(Default(name='Guido')) 'Guido was born in country'
Hinzugefügt in Version 3.2.
- str.index(sub[, start[, end]])¶
Wie
find(), löst aber einenValueErroraus, wenn die Teilzeichenkette nicht gefunden wird.
- str.isalnum()¶
Gibt
Truezurück, wenn alle Zeichen in der Zeichenkette alphanumerisch sind und mindestens ein Zeichen vorhanden ist, andernfallsFalse. Ein Zeichencist alphanumerisch, wenn eine der folgenden BedingungenTruezurückgibt:c.isalpha(),c.isdecimal(),c.isdigit()oderc.isnumeric().
- str.isalpha()¶
Gibt
Truezurück, wenn alle Zeichen in der Zeichenkette alphabetisch sind und mindestens ein Zeichen vorhanden ist, andernfallsFalse. Alphabetische Zeichen sind alle Zeichen, die in der Unicode-Zeichendatenbank als „Buchstabe“ definiert sind, d. h. solche mit der allgemeinen Kategorie „Lm“, „Lt“, „Lu“, „Ll“ oder „Lo“. Beachten Sie, dass dies von der in Abschnitt 4.10 „Letters, Alphabetic, and Ideographic“ des Unicode-Standards definierten Alphabetic-Eigenschaft abweicht.
- str.isascii()¶
Gibt
Truezurück, wenn die Zeichenkette leer ist oder alle Zeichen in der Zeichenkette ASCII sind, andernfallsFalse. ASCII-Zeichen haben Codepunkte im Bereich U+0000-U+007F.Hinzugefügt in Version 3.7.
- str.isdecimal()¶
Gibt
Truezurück, wenn alle Zeichen in der Zeichenkette Dezimalzeichen sind und mindestens ein Zeichen vorhanden ist, andernfallsFalse. Dezimalzeichen sind solche, die zur Bildung von Zahlen in Basis 10 verwendet werden können, z. B. U+0660, ARABIC-INDIC DIGIT ZERO. Formell ist ein Dezimalzeichen ein Zeichen in der Unicode-Allgemeinkategorie „Nd“.
- str.isdigit()¶
Gibt
Truezurück, wenn alle Zeichen in der Zeichenkette Ziffern sind und mindestens ein Zeichen vorhanden ist, andernfallsFalse. Ziffern umfassen Dezimalzeichen und Ziffern, die eine spezielle Behandlung erfordern, wie z. B. die Kompatibilitäts-Hochstellziffern. Dies umfasst Ziffern, die nicht zur Bildung von Zahlen in Basis 10 verwendet werden können, wie die Kharosthi-Zahlen. Formell ist eine Ziffer ein Zeichen mit dem Eigenschaftswert Numeric_Type=Digit oder Numeric_Type=Decimal.
- str.isidentifier()¶
Gibt
Truezurück, wenn die Zeichenkette gemäß der Sprachdefinition ein gültiger Bezeichner ist, siehe Abschnitt Namen (Bezeichner und Schlüsselwörter).keyword.iskeyword()kann verwendet werden, um zu prüfen, ob die Zeichenkettesein reservierter Bezeichner ist, wie z. B.defundclass.Beispiel
>>> from keyword import iskeyword >>> 'hello'.isidentifier(), iskeyword('hello') (True, False) >>> 'def'.isidentifier(), iskeyword('def') (True, True)
- str.islower()¶
Gibt
Truezurück, wenn alle Groß-/Kleinschreibungs-fähigen Zeichen [4] in der Zeichenkette Kleinbuchstaben sind und mindestens ein Groß-/Kleinschreibungs-fähiges Zeichen vorhanden ist, andernfallsFalse.
- str.isnumeric()¶
Gibt
Truezurück, wenn alle Zeichen in der Zeichenkette numerische Zeichen sind und mindestens ein Zeichen vorhanden ist, andernfallsFalse. Numerische Zeichen umfassen Ziffernzeichen und alle Zeichen, die die Unicode-Eigenschaft für den numerischen Wert haben, z. B. U+2155, VULGAR FRACTION ONE FIFTH. Formell sind numerische Zeichen solche mit dem Eigenschaftswert Numeric_Type=Digit, Numeric_Type=Decimal oder Numeric_Type=Numeric.
- str.isprintable()¶
Gibt
Truezurück, wenn alle Zeichen in der Zeichenkette druckbar sind, andernfallsFalse, wenn sie mindestens ein nicht druckbares Zeichen enthält.Hier bedeutet „druckbar“, dass das Zeichen für die Verwendung in der Ausgabe von
repr()geeignet ist; „nicht druckbar“ bedeutet, dassrepr()bei eingebauten Typen das Zeichen hexadezimal maskieren wird. Dies hat keine Auswirkungen auf die Behandlung von Zeichenketten, die nachsys.stdoutodersys.stderrgeschrieben werden.Druckbare Zeichen sind solche, die in der Unicode-Zeichendatenbank (siehe
unicodedata) eine allgemeine Kategorie in den Gruppen Letter, Mark, Number, Punctuation oder Symbol (L, M, N, P oder S) haben; plus das ASCII-Leerzeichen 0x20. Nicht druckbare Zeichen sind solche in den Gruppen Separator oder Other (Z oder C), außer dem ASCII-Leerzeichen.
- str.isspace()¶
Gibt
Truezurück, wenn nur Leerzeichen in der Zeichenkette vorhanden sind und mindestens ein Zeichen vorhanden ist, andernfallsFalse.Ein Zeichen ist *Whitespace*, wenn es in der Unicode-Zeichendatenbank (siehe
unicodedata) entweder seine allgemeine KategorieZs(„Separator, space“) ist oder seine bidirektionale Klasse eine der folgenden ist:WS,BoderS.
- str.istitle()¶
Gibt
Truezurück, wenn die Zeichenkette titelgeschrieben ist und mindestens ein Zeichen vorhanden ist, z. B. Großbuchstaben dürfen nur auf nicht-cased Zeichen und Kleinbuchstaben nur auf cased Zeichen folgen. Andernfalls wirdFalsezurückgegeben.Zum Beispiel
>>> 'Spam, Spam, Spam'.istitle() True >>> 'spam, spam, spam'.istitle() False >>> 'SPAM, SPAM, SPAM'.istitle() False
Siehe auch
title().
- str.isupper()¶
Gibt
Truezurück, wenn alle Groß-/Kleinschreibungs-fähigen Zeichen [4] in der Zeichenkette Großbuchstaben sind und mindestens ein Groß-/Kleinschreibungs-fähiges Zeichen vorhanden ist, andernfallsFalse.>>> 'BANANA'.isupper() True >>> 'banana'.isupper() False >>> 'baNana'.isupper() False >>> ' '.isupper() False
- str.join(iterable, /)¶
Gibt eine Zeichenkette zurück, die die Verkettung der Zeichenketten im iterable ist. Ein
TypeErrorwird ausgelöst, wenn nicht-Zeichenkettenwerte im iterable vorhanden sind, einschließlichbytes-Objekten. Der Trenner zwischen den Elementen ist die Zeichenkette, die diese Methode bereitstellt.
- str.ljust(width, fillchar=' ', /)¶
Gibt die Zeichenkette linksbündig in einer Zeichenkette der Länge width zurück. Die Auffüllung erfolgt mit dem angegebenen fillchar (Standard ist ein ASCII-Leerzeichen). Die ursprüngliche Zeichenkette wird zurückgegeben, wenn width kleiner oder gleich
len(s)ist.
- str.lower()¶
Gibt eine Kopie der Zeichenkette zurück, bei der alle Groß-/Kleinschreibungs-fähigen Zeichen [4] in Kleinbuchstaben umgewandelt wurden.
Der verwendete Algorithmus zur Umwandlung in Kleinbuchstaben ist in Abschnitt 3.13 „Default Case Folding“ des Unicode-Standards beschrieben.
- str.lstrip(chars=None, /)¶
Gibt eine Kopie der Zeichenkette zurück, bei der führende Zeichen entfernt wurden. Das Argument chars ist eine Zeichenkette, die die zu entfernenden Zeichen angibt. Wenn es weggelassen wird oder
Noneist, werden standardmäßig Leerzeichen entfernt. Das Argument chars ist kein Präfix, sondern es werden alle Kombinationen seiner Werte gestrippt.>>> ' spacious '.lstrip() 'spacious ' >>> 'www.example.com'.lstrip('cmowz.') 'example.com'
Siehe
str.removeprefix()für eine Methode, die eine einzelne Präfix-Zeichenkette entfernt, anstatt alle Zeichen eines Satzes. Zum Beispiel>>> 'Arthur: three!'.lstrip('Arthur: ') 'ee!' >>> 'Arthur: three!'.removeprefix('Arthur: ') 'three!'
- static str.maketrans(dict, /)¶
- static str.maketrans(from, to, remove='', /)
Diese statische Methode gibt eine Übersetzungstabelle zurück, die für
str.translate()verwendbar ist.Wenn nur ein Argument vorhanden ist, muss es ein Wörterbuch sein, das Unicode-Ordinale (Ganzzahlen) oder Zeichen (Zeichenketten der Länge 1) auf Unicode-Ordinale, Zeichenketten (beliebiger Länge) oder
Noneabbildet. Zeichenschlüssel werden dann in Ordnale umgewandelt.Wenn zwei Argumente vorhanden sind, müssen diese Zeichenketten gleicher Länge sein, und im resultierenden Wörterbuch wird jedes Zeichen in from auf das Zeichen an derselben Position in to abgebildet. Wenn ein drittes Argument vorhanden ist, muss es eine Zeichenkette sein, deren Zeichen auf
Noneim Ergebnis abgebildet werden.
- str.partition(sep, /)¶
Teilt die Zeichenkette beim ersten Vorkommen von sep und gibt ein 3-Tupel zurück, das den Teil vor dem Trennzeichen, das Trennzeichen selbst und den Teil nach dem Trennzeichen enthält. Wenn das Trennzeichen nicht gefunden wird, wird ein 3-Tupel zurückgegeben, das die Zeichenkette selbst gefolgt von zwei leeren Zeichenketten enthält.
- str.removeprefix(prefix, /)¶
Wenn die Zeichenkette mit der Zeichenkette prefix beginnt, wird
string[len(prefix):]zurückgegeben. Andernfalls wird eine Kopie der ursprünglichen Zeichenkette zurückgegeben.>>> 'TestHook'.removeprefix('Test') 'Hook' >>> 'BaseTestCase'.removeprefix('Test') 'BaseTestCase'
Hinzugefügt in Version 3.9.
- str.removesuffix(suffix, /)¶
Wenn die Zeichenkette mit der Zeichenkette suffix endet und dieses suffix nicht leer ist, wird
string[:-len(suffix)]zurückgegeben. Andernfalls wird eine Kopie der ursprünglichen Zeichenkette zurückgegeben.>>> 'MiscTests'.removesuffix('Tests') 'Misc' >>> 'TmpDirMixin'.removesuffix('Tests') 'TmpDirMixin'
Hinzugefügt in Version 3.9.
- str.replace(old, new, /, count=-1)¶
Gibt eine Kopie der Zeichenkette zurück, bei der alle Vorkommen der Teilzeichenkette old durch new ersetzt wurden. Wenn count angegeben ist, werden nur die ersten count Vorkommen ersetzt. Wenn count nicht angegeben ist oder
-1ist, werden alle Vorkommen ersetzt.Geändert in Version 3.13: count wird jetzt als Schlüsselwortargument unterstützt.
- str.rfind(sub[, start[, end]])¶
Gibt den höchsten Index in der Zeichenkette zurück, an dem die Teilzeichenkette sub gefunden wurde, so dass sub innerhalb von
s[start:end]enthalten ist. Optionale Argumente start und end werden wie in der Slice-Notation interpretiert. Gibt bei Fehlschlag-1zurück.
- str.rindex(sub[, start[, end]])¶
Wie
rfind(), löst aberValueErroraus, wenn die Teilzeichenkette sub nicht gefunden wird.
- str.rjust(width, fillchar=' ', /)¶
Gibt die Zeichenkette rechtsbündig in einer Zeichenkette der Länge width zurück. Die Auffüllung erfolgt mit dem angegebenen fillchar (Standard ist ein ASCII-Leerzeichen). Die ursprüngliche Zeichenkette wird zurückgegeben, wenn width kleiner oder gleich
len(s)ist.
- str.rpartition(sep, /)¶
Teilt die Zeichenkette beim letzten Vorkommen von sep und gibt ein 3-Tupel zurück, das den Teil vor dem Trennzeichen, das Trennzeichen selbst und den Teil nach dem Trennzeichen enthält. Wenn das Trennzeichen nicht gefunden wird, wird ein 3-Tupel zurückgegeben, das zwei leere Zeichenketten gefolgt von der Zeichenkette selbst enthält.
- str.rsplit(sep=None, maxsplit=-1)¶
Gibt eine Liste der Wörter in der Zeichenkette zurück, wobei sep als Trennzeichen-Zeichenkette verwendet wird. Wenn maxsplit angegeben ist, werden höchstens maxsplit Trennungen vorgenommen, die rechtesten. Wenn sep nicht angegeben ist oder
Noneist, ist jede Leerzeichenkette ein Trennzeichen. Abgesehen vom Aufteilen von rechts verhält sichrsplit()wiesplit(), das unten im Detail beschrieben wird.
- str.rstrip(chars=None, /)¶
Gibt eine Kopie der Zeichenkette zurück, bei der nachgestellte Zeichen entfernt wurden. Das Argument chars ist eine Zeichenkette, die die zu entfernenden Zeichen angibt. Wenn es weggelassen wird oder
Noneist, werden standardmäßig Leerzeichen entfernt. Das Argument chars ist kein Suffix, sondern es werden alle Kombinationen seiner Werte gestrippt.>>> ' spacious '.rstrip() ' spacious' >>> 'mississippi'.rstrip('ipz') 'mississ'
Siehe
str.removesuffix()für eine Methode, die eine einzelne Suffix-Zeichenkette anstelle aller Zeichen eines Satzes entfernt. Zum Beispiel>>> 'Monty Python'.rstrip(' Python') 'M' >>> 'Monty Python'.removesuffix(' Python') 'Monty'
- str.split(sep=None, maxsplit=-1)¶
Gibt eine Liste der Wörter in der Zeichenkette zurück, wobei sep als Trennzeichen-Zeichenkette verwendet wird. Wenn maxsplit angegeben ist, werden höchstens maxsplit Trennungen vorgenommen (dadurch enthält die Liste höchstens
maxsplit+1Elemente). Wenn maxsplit nicht angegeben ist oder-1ist, gibt es keine Begrenzung für die Anzahl der Trennungen (alle möglichen Trennungen werden vorgenommen).Wenn sep angegeben ist, werden aufeinanderfolgende Trennzeichen nicht zusammengefasst und gelten als Trennzeichen für leere Zeichenketten (z. B. gibt
'1,,2'.split(',')die Liste['1', '', '2']zurück). Das Argument sep kann mehrere Zeichen als einzelnes Trennzeichen enthalten (um mit mehreren Trennzeichen aufzuteilen, verwenden Siere.split()). Das Aufteilen einer leeren Zeichenkette mit einem angegebenen Trennzeichen gibt['']zurück.Zum Beispiel
>>> '1,2,3'.split(',') ['1', '2', '3'] >>> '1,2,3'.split(',', maxsplit=1) ['1', '2,3'] >>> '1,2,,3,'.split(',') ['1', '2', '', '3', ''] >>> '1<>2<>3<4'.split('<>') ['1', '2', '3<4']
Wenn sep nicht angegeben ist oder
Noneist, wird ein anderer Aufteilungsalgorithmus angewendet: aufeinanderfolgende Leerzeichen werden als einzelnes Trennzeichen betrachtet, und das Ergebnis enthält keine leeren Zeichen am Anfang oder Ende, wenn die Zeichenkette führende oder nachgestellte Leerzeichen aufweist. Folglich gibt das Aufteilen einer leeren Zeichenkette oder einer Zeichenkette, die nur aus Leerzeichen besteht, mit einemNone-Separator[]zurück.Zum Beispiel
>>> '1 2 3'.split() ['1', '2', '3'] >>> '1 2 3'.split(maxsplit=1) ['1', '2 3'] >>> ' 1 2 3 '.split() ['1', '2', '3']
Wenn sep nicht angegeben ist oder
Noneist und maxsplit den Wert0hat, werden nur führende Gruppen von aufeinanderfolgenden Leerzeichen berücksichtigt.Zum Beispiel
>>> "".split(None, 0) [] >>> " ".split(None, 0) [] >>> " foo ".split(maxsplit=0) ['foo ']
- str.splitlines(keepends=False)¶
Gibt eine Liste der Zeilen in der Zeichenkette zurück, die an Zeilengrenzen aufgeteilt werden. Zeilenumbrüche sind nicht in der resultierenden Liste enthalten, es sei denn, keepends ist angegeben und wahr.
Diese Methode teilt an den folgenden Zeilengrenzen auf. Insbesondere sind die Grenzen eine Obermenge der universellen Zeilenumbrüche.
Darstellung
Beschreibung
\nZeilenvorschub
\rWagenrücklauf
\r\nWagenrücklauf + Zeilenvorschub
\voder\x0bVertikaler Tabulator
\foder\x0cSeitenvorschub
\x1cDateitrennzeichen
\x1dGruppentrennzeichen
\x1eDatensatz-Trennzeichen
\x85Nächste Zeile (C1-Steuercode)
\u2028Zeilentrennzeichen
\u2029Absatztrennzeichen
Geändert in Version 3.2:
\vund\fwurden der Liste der Zeilengrenzen hinzugefügt.Zum Beispiel
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines() ['ab c', '', 'de fg', 'kl'] >>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True) ['ab c\n', '\n', 'de fg\r', 'kl\r\n']
Im Gegensatz zu
split(), wenn eine Trennzeichen-Zeichenkette sep angegeben ist, gibt diese Methode für die leere Zeichenkette eine leere Liste zurück, und ein abschließender Zeilenumbruch führt nicht zu einer zusätzlichen Zeile.>>> "".splitlines() [] >>> "One line\n".splitlines() ['One line']
Zum Vergleich gibt
split('\n')Folgendes zurück:>>> ''.split('\n') [''] >>> 'Two lines\n'.split('\n') ['Two lines', '']
- str.startswith(prefix[, start[, end]])¶
Gibt
Truezurück, wenn die Zeichenkette mit prefix beginnt, andernfalls wirdFalsezurückgegeben. prefix kann auch ein Tupel von Präfixen sein, nach denen gesucht werden soll. Mit dem optionalen start wird der Anfang der Zeichenkette an dieser Position geprüft. Mit dem optionalen end wird der Vergleich der Zeichenkette an dieser Position gestoppt.
- str.strip(chars=None, /)¶
Gibt eine Kopie des Strings zurück, bei der führende und nachfolgende Zeichen entfernt wurden. Das Argument chars ist ein String, der die zu entfernende Zeichensatz angibt. Wenn es weggelassen wird oder
Noneist, werden standardmäßig Leerzeichen entfernt. Das Argument chars ist kein Präfix oder Suffix; vielmehr werden alle Kombinationen seiner Werte gestrippt.>>> ' spacious '.strip() 'spacious' >>> 'www.example.com'.strip('cmowz.') 'example'
Die äußersten führenden und nachfolgenden Werte des Arguments chars werden aus dem String gestrippt. Zeichen werden vom führenden Ende entfernt, bis ein String-Zeichen erreicht wird, das nicht im Zeichensatz von chars enthalten ist. Eine ähnliche Aktion findet am nachfolgenden Ende statt. Zum Beispiel:
>>> comment_string = '#....... Section 3.2.1 Issue #32 .......' >>> comment_string.strip('.#! ') 'Section 3.2.1 Issue #32'
- str.swapcase()¶
Gibt eine Kopie des Strings zurück, bei der Großbuchstaben in Kleinbuchstaben und umgekehrt umgewandelt wurden. Beachten Sie, dass es nicht unbedingt wahr ist, dass
s.swapcase().swapcase() == s.
- str.title()¶
Gibt eine titelartige Version des Strings zurück, bei der Wörter mit einem Großbuchstaben beginnen und die restlichen Zeichen Kleinbuchstaben sind.
Zum Beispiel
>>> 'Hello world'.title() 'Hello World'
Der Algorithmus verwendet eine einfache, sprachunabhängige Definition eines Wortes als Gruppen aufeinanderfolgender Buchstaben. Die Definition funktioniert in vielen Kontexten, aber sie bedeutet, dass Apostrophe in Kontraktionen und Possessiven Wortgrenzen bilden, was möglicherweise nicht das gewünschte Ergebnis ist.
>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
Die Funktion
string.capwords()hat dieses Problem nicht, da sie Wörter nur nach Leerzeichen aufteilt.Alternativ kann ein Workaround für Apostrophe mit regulären Ausdrücken konstruiert werden.
>>> import re >>> def titlecase(s): ... return re.sub(r"[A-Za-z]+('[A-Za-z]+)?", ... lambda mo: mo.group(0).capitalize(), ... s) ... >>> titlecase("they're bill's friends.") "They're Bill's Friends."
Siehe auch
istitle().
- str.translate(table, /)¶
Gibt eine Kopie des Strings zurück, bei der jedes Zeichen über die gegebene Übersetzungstabelle abgebildet wurde. Die Tabelle muss ein Objekt sein, das Indizierung über
__getitem__()implementiert, typischerweise eine Zuordnung oder Sequenz. Wenn durch eine Unicode-Ordnung (eine Ganzzahl) indiziert, kann das Tabellenobjekt eines der folgenden tun: eine Unicode-Ordnung oder einen String zurückgeben, um das Zeichen auf ein oder mehrere andere Zeichen abzubilden;Nonezurückgeben, um das Zeichen aus dem Rückgabe-String zu löschen; oder eineLookupErrorAusnahme auslösen, um das Zeichen auf sich selbst abzubilden.Sie können
str.maketrans()verwenden, um eine Übersetzungstabelle aus Zeichen-zu-Zeichen-Zuordnungen in verschiedenen Formaten zu erstellen.Siehe auch das Modul
codecsfür einen flexibleren Ansatz für benutzerdefinierte Zeichenzuordnungen.
- str.upper()¶
Gibt eine Kopie des Strings zurück, bei der alle umwandelbaren Zeichen [4] in Großbuchstaben umgewandelt wurden. Beachten Sie, dass
s.upper().isupper()Falsesein kann, wennsnicht umwandelbare Zeichen enthält oder wenn die Unicode-Kategorie des/der resultierenden Zeichen(s) nicht „Lu“ (Letter, uppercase) ist, sondern z. B. „Lt“ (Letter, titlecase).Der verwendete Algorithmus zur Umwandlung in Großbuchstaben ist in Abschnitt 3.13 „Default Case Folding“ des Unicode-Standards beschrieben.
- str.zfill(width, /)¶
Gibt eine Kopie des Strings zurück, die links mit ASCII-Ziffern
'0'aufgefüllt wird, um einen String der Länge width zu erzeugen. Ein führendes Vorzeichen ('+'/'-') wird behandelt, indem die Auffüllung nach dem Vorzeichen eingefügt wird, anstatt davor. Der ursprüngliche String wird zurückgegeben, wenn width kleiner oder gleichlen(s)ist.Zum Beispiel
>>> "42".zfill(5) '00042' >>> "-42".zfill(5) '-0042'
Formatierte Zeichenketten-Literale (f-Strings)¶
Hinzugefügt in Version 3.6.
Geändert in Version 3.7: Die Schlüsselwörter await und async for können in Ausdrücken innerhalb von f-Strings verwendet werden.
Geändert in Version 3.8: Hinzugefügt wurde der Debugging-Operator (=).
Geändert in Version 3.12: Viele Einschränkungen für Ausdrücke innerhalb von f-Strings wurden entfernt. Insbesondere sind verschachtelte Strings, Kommentare und Backslashes jetzt erlaubt.
Ein f-String (formal ein formatiertes String-Literal) ist ein String-Literal, dem ein f oder F vorangestellt ist. Dieser Typ von String-Literal ermöglicht das Einbetten beliebiger Python-Ausdrücke in Ersetzungsfelder, die durch geschweifte Klammern ({}) begrenzt sind. Diese Ausdrücke werden zur Laufzeit ausgewertet, ähnlich wie bei str.format(), und in reguläre str-Objekte konvertiert. Zum Beispiel:
>>> who = 'nobody'
>>> nationality = 'Spanish'
>>> f'{who.title()} expects the {nationality} Inquisition!'
'Nobody expects the Spanish Inquisition!'
Es ist auch möglich, einen mehrzeiligen f-String zu verwenden.
>>> f'''This is a string
... on two lines'''
'This is a string\non two lines'
Eine einzelne öffnende geschweifte Klammer, '{', markiert ein Ersetzungsfeld, das jeden beliebigen Python-Ausdruck enthalten kann.
>>> nationality = 'Spanish'
>>> f'The {nationality} Inquisition!'
'The Spanish Inquisition!'
Um eine literale { oder } einzufügen, verwenden Sie eine doppelte Klammer.
>>> x = 42
>>> f'{{x}} is {x}'
'{x} is 42'
Funktionen können ebenfalls verwendet werden, und Formatierungsoptionen.
>>> from math import sqrt
>>> f'√2 \N{ALMOST EQUAL TO} {sqrt(2):.5f}'
'√2 ≈ 1.41421'
Jeder Nicht-String-Ausdruck wird standardmäßig mit str() konvertiert.
>>> from fractions import Fraction
>>> f'{Fraction(1, 3)}'
'1/3'
Um eine explizite Konvertierung zu verwenden, verwenden Sie den ! (Ausrufezeichen)-Operator, gefolgt von einem der gültigen Formate, welche sind:
Konvertierung |
Bedeutung |
|---|---|
|
|
|
|
|
Zum Beispiel
>>> from fractions import Fraction
>>> f'{Fraction(1, 3)!s}'
'1/3'
>>> f'{Fraction(1, 3)!r}'
'Fraction(1, 3)'
>>> question = '¿Dónde está el Presidente?'
>>> print(f'{question!a}')
'\xbfD\xf3nde est\xe1 el Presidente?'
Beim Debugging kann es hilfreich sein, sowohl den Ausdruck als auch seinen Wert anzuzeigen, indem das Gleichheitszeichen (=) nach dem Ausdruck verwendet wird. Dies bewahrt Leerzeichen innerhalb der Klammern und kann mit einem Konverter verwendet werden. Standardmäßig verwendet der Debugging-Operator die repr()- (!r) Konvertierung. Zum Beispiel:
>>> from fractions import Fraction
>>> calculation = Fraction(1, 3)
>>> f'{calculation=}'
'calculation=Fraction(1, 3)'
>>> f'{calculation = }'
'calculation = Fraction(1, 3)'
>>> f'{calculation = !s}'
'calculation = 1/3'
Nachdem die Ausgabe ausgewertet wurde, kann sie mit einer Formatierungsoption nach einem Doppelpunkt (':') formatiert werden. Nachdem der Ausdruck ausgewertet und möglicherweise in einen String konvertiert wurde, wird die __format__()-Methode des Ergebnisses mit der Formatierungsoption oder dem leeren String aufgerufen, wenn keine Formatierungsoption angegeben ist. Das formatierte Ergebnis wird dann als endgültiger Wert für das Ersetzungsfeld verwendet. Zum Beispiel:
>>> from fractions import Fraction
>>> f'{Fraction(1, 7):.6f}'
'0.142857'
>>> f'{Fraction(1, 7):_^+10}'
'___+1/7___'
printf-Stil String-Formatierung¶
Hinweis
Die hier beschriebenen Formatierungsoperationen weisen eine Vielzahl von Eigenheiten auf, die zu einer Reihe von häufigen Fehlern führen (wie z. B. dem fehlerhaften Anzeigen von Tupeln und Dictionaries).
Die Verwendung von formatierten String-Literalen, der str.format()-Schnittstelle oder string.Template kann helfen, diese Fehler zu vermeiden. Jede dieser Alternativen bietet ihre eigenen Kompromisse und Vorteile in Bezug auf Einfachheit, Flexibilität und/oder Erweiterbarkeit.
String-Objekte haben eine einzige einzigartige eingebaute Operation: den %-Operator (Modulo). Dies ist auch als String-Formatierungs- oder Interpolations-Operator bekannt. Gegeben format % values (wobei format ein String ist), werden %-Konvertierungsspezifikationen in format durch null oder mehr Elemente von values ersetzt. Der Effekt ist ähnlich wie die Verwendung der sprintf()-Funktion in der C-Sprache. Zum Beispiel:
>>> print('%s has %d quote types.' % ('Python', 2))
Python has 2 quote types.
Wenn format ein einzelnes Argument benötigt, kann values ein einzelnes Nicht-Tupel-Objekt sein. [5] Andernfalls muss values ein Tupel mit genau der Anzahl von Elementen sein, die durch den Format-String angegeben sind, oder ein einzelnes Mapping-Objekt (z. B. ein Dictionary).
Ein Konvertierungsspezifizierer enthält zwei oder mehr Zeichen und hat die folgenden Komponenten, die in dieser Reihenfolge auftreten müssen:
Das Zeichen
'%', das den Beginn des Spezifizierers markiert.Mapping-Schlüssel (optional), bestehend aus einer geklammerten Sequenz von Zeichen (z. B.
(somename)).Konvertierungsflags (optional), die das Ergebnis einiger Konvertierungstypen beeinflussen.
Mindestfeldbreite (optional). Wenn als
'*'(Sternchen) angegeben, wird die tatsächliche Breite aus dem nächsten Element des Tupels in values gelesen, und das zu konvertierende Objekt kommt nach der Mindestfeldbreite und der optionalen Präzision.Präzision (optional), gegeben als ein
'.'(Punkt) gefolgt von der Präzision. Wenn als'*'(ein Sternchen) angegeben, wird die tatsächliche Präzision aus dem nächsten Element des Tupels in values gelesen, und der zu konvertierende Wert kommt nach der Präzision.Längenmodifikator (optional).
Konvertierungstyp.
Wenn das rechte Argument ein Dictionary (oder ein anderer Mapping-Typ) ist, müssen die Formate im String einen geklammerten Mapping-Schlüssel in dieses Dictionary enthalten, der unmittelbar nach dem Zeichen '%' eingefügt wird. Der Mapping-Schlüssel wählt den Wert aus, der aus dem Mapping formatiert werden soll. Zum Beispiel:
>>> print('%(language)s has %(number)03d quote types.' %
... {'language': "Python", "number": 2})
Python has 002 quote types.
In diesem Fall dürfen keine *-Spezifizierer in einem Format vorkommen (da sie eine sequentielle Parameterliste erfordern).
Die Konvertierungsflag-Zeichen sind:
Flag |
Bedeutung |
|---|---|
|
Der Wert wird die „alternative Form“ verwenden (wo unten definiert). |
|
Die Konvertierung wird für numerische Werte mit Nullen aufgefüllt. |
|
Der konvertierte Wert ist linksbündig (überschreibt das |
|
(ein Leerzeichen) Ein Leerzeichen sollte vor einer positiven Zahl (oder einem leeren String) stehen, die durch eine vorzeichenbehaftete Konvertierung erzeugt wird. |
|
Ein Vorzeichen ( |
Ein Längenmodifikator (h, l oder L) kann vorhanden sein, wird aber ignoriert, da er für Python nicht notwendig ist – daher ist z. B. %ld identisch mit %d.
Die Konvertierungstypen sind:
Konvertierung |
Bedeutung |
Hinweise |
|---|---|---|
|
Vorzeichenbehaftete Ganzzahl dezimal. |
|
|
Vorzeichenbehaftete Ganzzahl dezimal. |
|
|
Vorzeichenbehafteter Oktalwert. |
(1) |
|
Veralteter Typ – identisch mit |
(6) |
|
Vorzeichenbehaftete Hexadezimalzahl (Kleinbuchstaben). |
(2) |
|
Vorzeichenbehaftete Hexadezimalzahl (Großbuchstaben). |
(2) |
|
Gleitkomma-Exponentiendarstellung (Kleinbuchstaben). |
(3) |
|
Gleitkomma-Exponentiendarstellung (Großbuchstaben). |
(3) |
|
Gleitkomma-Dezimaldarstellung. |
(3) |
|
Gleitkomma-Dezimaldarstellung. |
(3) |
|
Gleitkommadarstellung. Verwendet Kleinbuchstaben-Exponentiendarstellung, wenn der Exponent kleiner als -4 oder nicht kleiner als die Präzision ist, andernfalls Dezimaldarstellung. |
(4) |
|
Gleitkommadarstellung. Verwendet Großbuchstaben-Exponentiendarstellung, wenn der Exponent kleiner als -4 oder nicht kleiner als die Präzision ist, andernfalls Dezimaldarstellung. |
(4) |
|
Einzelnes Zeichen (akzeptiert Ganzzahl oder einzelnes Zeichen als String). |
|
|
String (konvertiert jedes Python-Objekt mit |
(5) |
|
String (konvertiert jedes Python-Objekt mit |
(5) |
|
String (konvertiert jedes Python-Objekt mit |
(5) |
|
Es wird kein Argument konvertiert, das Ergebnis ist ein |
Hinweise
Die alternative Form bewirkt, dass ein führender Oktalspezifizierer (
'0o') vor der ersten Ziffer eingefügt wird.Die alternative Form bewirkt, dass ein führendes
'0x'oder'0X'(abhängig davon, ob das'x'- oder'X'-Format verwendet wurde) vor der ersten Ziffer eingefügt wird.Die alternative Form bewirkt, dass das Ergebnis immer einen Dezimalpunkt enthält, auch wenn keine Ziffern folgen.
Die Präzision bestimmt die Anzahl der Ziffern nach dem Dezimalpunkt und ist standardmäßig 6.
Die alternative Form bewirkt, dass das Ergebnis immer einen Dezimalpunkt enthält, und nachfolgende Nullen werden nicht entfernt, wie es sonst der Fall wäre.
Die Präzision bestimmt die Anzahl der signifikanten Ziffern vor und nach dem Dezimalpunkt und ist standardmäßig 6.
Wenn die Präzision
Nist, wird die Ausgabe aufNZeichen gekürzt.Siehe PEP 237.
Da Python-Strings eine explizite Länge haben, gehen %s-Konvertierungen nicht davon aus, dass '\0' das Ende des Strings ist.
Geändert in Version 3.1: %f-Konvertierungen für Zahlen, deren Absolutwert über 1e50 liegt, werden nicht mehr durch %g-Konvertierungen ersetzt.
Binäre Sequenztypen — bytes, bytearray, memoryview¶
Die zentralen eingebauten Typen für die Manipulation binärer Daten sind bytes und bytearray. Sie werden von memoryview unterstützt, das das Buffer-Protokoll verwendet, um auf den Speicher anderer binärer Objekte zuzugreifen, ohne eine Kopie erstellen zu müssen.
Das Modul array unterstützt die effiziente Speicherung grundlegender Datentypen wie 32-Bit-Integer und IEEE754-Gleitkommawerte mit doppelter Genauigkeit.
Bytes-Objekte¶
Bytes-Objekte sind unveränderliche Sequenzen von einzelnen Bytes. Da viele wichtige Binärprotokolle auf der ASCII-Textkodierung basieren, bieten Bytes-Objekte mehrere Methoden, die nur bei der Arbeit mit ASCII-kompatiblen Daten gültig sind und in vielerlei anderer Hinsicht eng mit String-Objekten verwandt sind.
- class bytes(source=b'')¶
- class bytes(source, encoding, errors='strict')
Erstens ist die Syntax für Bytes-Literale weitgehend dieselbe wie für String-Literale, mit der Ausnahme, dass ein
b-Präfix hinzugefügt wird.Einzelne Anführungszeichen:
b'still allows embedded "double" quotes'Doppelte Anführungszeichen:
b"still allows embedded 'single' quotes"Dreifach Anführungszeichen:
b'''3 single quotes''',b"""3 double quotes"""
Nur ASCII-Zeichen sind in Bytes-Literalen erlaubt (unabhängig von der deklarierten Quellcode-Kodierung). Alle Binärwerte über 127 müssen in Bytes-Literalen über die entsprechende Escape-Sequenz eingegeben werden.
Wie bei String-Literalen können Bytes-Literale auch ein
r-Präfix verwenden, um die Verarbeitung von Escape-Sequenzen zu deaktivieren. Siehe String- und Bytes-Literale für mehr über die verschiedenen Formen von Bytes-Literalen, einschließlich unterstützter Escape-Sequenzen.Während Bytes-Literale und Darstellungen auf ASCII-Text basieren, verhalten sich Bytes-Objekte tatsächlich wie unveränderliche Sequenzen von Ganzzahlen, wobei jeder Wert in der Sequenz so eingeschränkt ist, dass
0 <= x < 256ist (Versuche, diese Einschränkung zu verletzen, lösen einenValueErroraus). Dies geschieht bewusst, um hervorzuheben, dass, obwohl viele Binärformate ASCII-basierte Elemente enthalten und nützlich mit textorientierten Algorithmen manipuliert werden können, dies im Allgemeinen nicht für beliebige Binärdaten gilt (die blinde Anwendung von Textverarbeitungsalgorithmen auf Binärdatenformate, die nicht ASCII-kompatibel sind, führt normalerweise zu Datenbeschädigung).Zusätzlich zu den literalen Formen können Bytes-Objekte auf verschiedene andere Arten erstellt werden:
Ein mit Nullen gefülltes Bytes-Objekt einer bestimmten Länge:
bytes(10)Aus einem Iterable von Ganzzahlen:
bytes(range(20))Kopieren vorhandener Binärdaten über das Buffer-Protokoll:
bytes(obj)
Siehe auch die eingebaute Funktion bytes.
Da 2 Hexadezimalziffern genau einem Byte entsprechen, ist die Hexadezimalzahl ein gängiges Format für die Beschreibung binärer Daten. Daher verfügt der Bytes-Typ über eine zusätzliche Klassenmethode zum Lesen von Daten in diesem Format.
- classmethod fromhex(string, /)¶
Diese
bytes-Klassenmethode gibt ein Bytes-Objekt zurück, das den angegebenen String dekodiert. Der String muss zwei Hexadezimalziffern pro Byte enthalten, wobei ASCII-Leerzeichen ignoriert werden.>>> bytes.fromhex('2Ef0 F1f2 ') b'.\xf0\xf1\xf2'
Geändert in Version 3.7:
bytes.fromhex()überspringt jetzt alle ASCII-Leerzeichen im String, nicht nur Leerzeichen.Geändert in Version 3.14:
bytes.fromhex()akzeptiert jetzt ASCIIbytesund bytes-ähnliche Objekte als Eingabe.
Eine umgekehrte Konvertierungsfunktion existiert, um ein Bytes-Objekt in seine Hexadezimaldarstellung umzuwandeln.
- hex(*, bytes_per_sep=1)¶
- hex(sep, bytes_per_sep=1)
Gibt ein String-Objekt zurück, das zwei Hexadezimalziffern für jedes Byte in der Instanz enthält.
>>> b'\xf0\xf1\xf2'.hex() 'f0f1f2'
Wenn Sie den Hex-String leichter lesbar machen möchten, können Sie einen einzelnen Trennzeichen-Parameter sep angeben, der in die Ausgabe aufgenommen werden soll. Standardmäßig wird dieses Trennzeichen zwischen jedem Byte eingefügt. Ein zweiter optionaler Parameter bytes_per_sep steuert die Abstände. Positive Werte berechnen die Position des Trennzeichens von rechts, negative Werte von links.
>>> value = b'\xf0\xf1\xf2' >>> value.hex('-') 'f0-f1-f2' >>> value.hex('_', 2) 'f0_f1f2' >>> b'UUDDLRLRAB'.hex(' ', -4) '55554444 4c524c52 4142'
Hinzugefügt in Version 3.5.
Geändert in Version 3.8:
bytes.hex()unterstützt jetzt optionale Parameter sep und bytes_per_sep, um Trennzeichen zwischen Bytes in der Hex-Ausgabe einzufügen.
Da Bytes-Objekte Sequenzen von Ganzzahlen sind (ähnlich einem Tupel), wird für ein Bytes-Objekt b b[0] eine Ganzzahl sein, während b[0:1] ein Bytes-Objekt der Länge 1 sein wird. (Dies steht im Gegensatz zu Text-Strings, bei denen sowohl die Indizierung als auch das Slicing einen String der Länge 1 ergeben).
Die Darstellung von Bytes-Objekten verwendet das literale Format (b'...'), da dies oft nützlicher ist als z. B. bytes([46, 46, 46]). Sie können ein Bytes-Objekt jederzeit mit list(b) in eine Liste von Ganzzahlen umwandeln.
Bytearray-Objekte¶
bytearray-Objekte sind ein veränderliches Gegenstück zu bytes-Objekten.
- class bytearray(source=b'')¶
- class bytearray(source, encoding, errors='strict')
Es gibt keine dedizierte literale Syntax für Bytearray-Objekte, stattdessen werden sie immer durch Aufruf des Konstruktors erstellt:
Erstellen einer leeren Instanz:
bytearray()Erstellen einer mit Nullen gefüllten Instanz mit einer gegebenen Länge:
bytearray(10)Aus einem Iterable von Ganzzahlen:
bytearray(range(20))Kopieren vorhandener Binärdaten über das Buffer-Protokoll:
bytearray(b'Hi!')
Da Bytearray-Objekte veränderlich sind, unterstützen sie zusätzlich zu den gemeinsamen Bytes- und Bytearray-Operationen, die in Bytes- und Bytearray-Operationen beschrieben sind, die veränderlichen Sequenzoperationen.
Siehe auch die eingebaute Funktion bytearray.
Da 2 Hexadezimalziffern genau einem Byte entsprechen, ist die Hexadezimalzahl ein gängiges Format für die Beschreibung binärer Daten. Daher verfügt der Bytearray-Typ über eine zusätzliche Klassenmethode zum Lesen von Daten in diesem Format.
- classmethod fromhex(string, /)¶
Diese
bytearray-Klassenmethode gibt ein Bytearray-Objekt zurück, das den angegebenen String dekodiert. Der String muss zwei Hexadezimalziffern pro Byte enthalten, wobei ASCII-Leerzeichen ignoriert werden.>>> bytearray.fromhex('2Ef0 F1f2 ') bytearray(b'.\xf0\xf1\xf2')
Geändert in Version 3.7:
bytearray.fromhex()überspringt jetzt alle ASCII-Leerzeichen im String, nicht nur Leerzeichen.Geändert in Version 3.14:
bytearray.fromhex()akzeptiert jetzt ASCIIbytesund bytes-ähnliche Objekte als Eingabe.
Eine umgekehrte Konvertierungsfunktion existiert, um ein Bytearray-Objekt in seine Hexadezimaldarstellung umzuwandeln.
- hex(*, bytes_per_sep=1)¶
- hex(sep, bytes_per_sep=1)
Gibt ein String-Objekt zurück, das zwei Hexadezimalziffern für jedes Byte in der Instanz enthält.
>>> bytearray(b'\xf0\xf1\xf2').hex() 'f0f1f2'
Hinzugefügt in Version 3.5.
Geändert in Version 3.8: Ähnlich wie
bytes.hex()unterstütztbytearray.hex()jetzt optionale Parameter sep und bytes_per_sep, um Trennzeichen zwischen Bytes in der Hex-Ausgabe einzufügen.
- resize(size, /)¶
Ändert die Größe des
bytearray, sodass er size Bytes enthält. size muss größer oder gleich 0 sein.Wenn das
bytearraykleiner werden muss, werden Bytes jenseits von size abgeschnitten.Wenn das
bytearraywachsen muss, werden alle neuen Bytes, die jenseits von size liegen, auf Null-Bytes gesetzt.Dies ist äquivalent zu
>>> def resize(ba, size): ... if len(ba) > size: ... del ba[size:] ... else: ... ba += b'\0' * (size - len(ba))
Beispiele
>>> shrink = bytearray(b'abc') >>> shrink.resize(1) >>> (shrink, len(shrink)) (bytearray(b'a'), 1) >>> grow = bytearray(b'abc') >>> grow.resize(5) >>> (grow, len(grow)) (bytearray(b'abc\x00\x00'), 5)
Hinzugefügt in Version 3.14.
Da Bytearray-Objekte Sequenzen von Ganzzahlen sind (ähnlich einer Liste), ist für ein Bytearray-Objekt b b[0] eine Ganzzahl, während b[0:1] ein Bytearray-Objekt der Länge 1 ist. (Dies steht im Gegensatz zu Textzeichenfolgen, bei denen sowohl Indexierung als auch Slicing eine Zeichenfolge der Länge 1 ergeben)
Die Darstellung von Bytearray-Objekten verwendet das Byte-Literal-Format (bytearray(b'...')), da dies oft nützlicher ist als z. B. bytearray([46, 46, 46]). Sie können ein Bytearray-Objekt immer mit list(b) in eine Liste von Ganzzahlen konvertieren.
Bytes- und Bytearray-Operationen¶
Sowohl Bytes- als auch Bytearray-Objekte unterstützen die gemeinsamen Sequenzoperationen. Sie interagieren nicht nur mit Operanden desselben Typs, sondern mit jedem byte-ähnlichen Objekt. Aufgrund dieser Flexibilität können sie in Operationen frei gemischt werden, ohne Fehler zu verursachen. Der Rückgabetyp des Ergebnisses kann jedoch von der Reihenfolge der Operanden abhängen.
Hinweis
Die Methoden für Bytes- und Bytearray-Objekte akzeptieren keine Zeichenfolgen als Argumente, genauso wie die Methoden für Zeichenfolgen keine Bytes als Argumente akzeptieren. Sie müssen zum Beispiel schreiben
a = "abc"
b = a.replace("a", "f")
und
a = b"abc"
b = a.replace(b"a", b"f")
Einige Bytes- und Bytearray-Operationen gehen von der Verwendung ASCII-kompatibler Binärformate aus und sollten daher bei der Arbeit mit beliebigen Binärdaten vermieden werden. Diese Einschränkungen werden im Folgenden erläutert.
Hinweis
Die Verwendung dieser ASCII-basierten Operationen zur Bearbeitung von Binärdaten, die nicht in einem ASCII-basierten Format gespeichert sind, kann zu Datenbeschädigung führen.
Die folgenden Methoden für Bytes- und Bytearray-Objekte können mit beliebigen Binärdaten verwendet werden.
- bytes.count(sub[, start[, end]])¶
- bytearray.count(sub[, start[, end]])¶
Gibt die Anzahl der nicht überlappenden Vorkommen der Teilsequenz sub im Bereich [start, end] zurück. Optionale Argumente start und end werden wie in der Slice-Notation interpretiert.
Die zu suchende Teilsequenz kann ein beliebiges byte-ähnliches Objekt oder eine Ganzzahl im Bereich von 0 bis 255 sein.
Wenn sub leer ist, wird die Anzahl der leeren Slices zwischen den Zeichen zurückgegeben, was der Länge des Bytes-Objekts plus eins entspricht.
Geändert in Version 3.3: Akzeptiert auch eine Ganzzahl im Bereich von 0 bis 255 als Teilsequenz.
- bytes.removeprefix(prefix, /)¶
- bytearray.removeprefix(prefix, /)¶
Wenn die Binärdaten mit der Zeichenfolge prefix beginnen, wird
bytes[len(prefix):]zurückgegeben. Andernfalls wird eine Kopie der ursprünglichen Binärdaten zurückgegeben>>> b'TestHook'.removeprefix(b'Test') b'Hook' >>> b'BaseTestCase'.removeprefix(b'Test') b'BaseTestCase'
Das prefix kann ein beliebiges byte-ähnliches Objekt sein.
Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
Hinzugefügt in Version 3.9.
- bytes.removesuffix(suffix, /)¶
- bytearray.removesuffix(suffix, /)¶
Wenn die Binärdaten mit der Zeichenfolge suffix enden und dieser suffix nicht leer ist, wird
bytes[:-len(suffix)]zurückgegeben. Andernfalls wird eine Kopie der ursprünglichen Binärdaten zurückgegeben>>> b'MiscTests'.removesuffix(b'Tests') b'Misc' >>> b'TmpDirMixin'.removesuffix(b'Tests') b'TmpDirMixin'
Das zu suchende suffix kann ein beliebiges byte-ähnliches Objekt sein.
Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
Hinzugefügt in Version 3.9.
- bytes.decode(encoding='utf-8', errors='strict')¶
- bytearray.decode(encoding='utf-8', errors='strict')¶
Gibt die Bytes dekodiert als
strzurück.encoding ist standardmäßig
'utf-8'; siehe Standardkodierungen für mögliche Werte.errors steuert, wie Dekodierungsfehler behandelt werden. Wenn
'strict'(Standard) gesetzt ist, wird eineUnicodeError-Ausnahme ausgelöst. Andere mögliche Werte sind'ignore','replace'und jeder andere Name, der übercodecs.register_error()registriert wurde. Details finden Sie unter Fehlerhandler.Aus Leistungsgründen wird der Wert von errors erst auf Gültigkeit geprüft, wenn tatsächlich ein Dekodierungsfehler auftritt, der Python Development Mode aktiviert ist oder ein Debug-Build verwendet wird.
Hinweis
Das Übergeben des Arguments encoding an
strermöglicht die direkte Dekodierung jedes byte-ähnlichen Objekts, ohne dass ein temporäresbytes- oderbytearray-Objekt erstellt werden muss.Geändert in Version 3.1: Unterstützung für Schlüsselwortargumente hinzugefügt.
Geändert in Version 3.9: Der Wert des Arguments errors wird nun im Python Development Mode und im Debug-Modus geprüft.
- bytes.endswith(suffix[, start[, end]])¶
- bytearray.endswith(suffix[, start[, end]])¶
Gibt
Truezurück, wenn die Binärdaten mit dem angegebenen suffix enden, andernfallsFalse. suffix kann auch ein Tupel von zu suchenden Suffixen sein. Mit dem optionalen start wird ab dieser Position getestet. Mit dem optionalen end wird der Vergleich an dieser Position beendet.Das/die zu suchende(n) Suffix(e) kann/können ein beliebiges byte-ähnliches Objekt sein.
- bytes.find(sub[, start[, end]])¶
- bytearray.find(sub[, start[, end]])¶
Gibt den niedrigsten Index in den Daten zurück, an dem die Teilsequenz sub gefunden wird, sodass sub im Slice
s[start:end]enthalten ist. Optionale Argumente start und end werden wie in der Slice-Notation interpretiert. Gibt-1zurück, wenn sub nicht gefunden wird.Die zu suchende Teilsequenz kann ein beliebiges byte-ähnliches Objekt oder eine Ganzzahl im Bereich von 0 bis 255 sein.
Hinweis
Die Methode
find()sollte nur verwendet werden, wenn Sie die Position von sub wissen müssen. Um zu prüfen, ob sub eine Teilzeichenfolge ist oder nicht, verwenden Sie den Operatorin>>> b'Py' in b'Python' True
Geändert in Version 3.3: Akzeptiert auch eine Ganzzahl im Bereich von 0 bis 255 als Teilsequenz.
- bytes.index(sub[, start[, end]])¶
- bytearray.index(sub[, start[, end]])¶
Ähnlich wie
find(), aber löstValueErroraus, wenn die Teilsequenz nicht gefunden wird.Die zu suchende Teilsequenz kann ein beliebiges byte-ähnliches Objekt oder eine Ganzzahl im Bereich von 0 bis 255 sein.
Geändert in Version 3.3: Akzeptiert auch eine Ganzzahl im Bereich von 0 bis 255 als Teilsequenz.
- bytes.join(iterable, /)¶
- bytearray.join(iterable, /)¶
Gibt ein Bytes- oder Bytearray-Objekt zurück, das die Verkettung der Binärdaten-Sequenzen in iterable darstellt. Ein
TypeErrorwird ausgelöst, wenn sich Werte in iterable befinden, die keine byte-ähnlichen Objekte sind, einschließlichstr-Objekten. Das Trennzeichen zwischen den Elementen ist der Inhalt des Bytes- oder Bytearray-Objekts, das diese Methode bereitstellt.
- static bytes.maketrans(from, to, /)¶
- static bytearray.maketrans(from, to, /)¶
Diese statische Methode gibt eine Übersetzungstabelle zurück, die für
bytes.translate()verwendbar ist und jedes Zeichen in from in das Zeichen an derselben Position in to abbildet. from und to müssen beide byte-ähnliche Objekte sein und die gleiche Länge haben.Hinzugefügt in Version 3.1.
- bytes.partition(sep, /)¶
- bytearray.partition(sep, /)¶
Teilt die Sequenz beim ersten Vorkommen von sep und gibt ein 3er-Tupel zurück, das den Teil vor dem Trennzeichen, das Trennzeichen selbst oder seine Bytearray-Kopie und den Teil nach dem Trennzeichen enthält. Wenn das Trennzeichen nicht gefunden wird, wird ein 3er-Tupel zurückgegeben, das eine Kopie der ursprünglichen Sequenz gefolgt von zwei leeren Bytes- oder Bytearray-Objekten enthält.
Das zu suchende Trennzeichen kann ein beliebiges byte-ähnliches Objekt sein.
- bytes.replace(old, new, count=-1, /)¶
- bytearray.replace(old, new, count=-1, /)¶
Gibt eine Kopie der Sequenz zurück, bei der alle Vorkommen der Teilsequenz old durch new ersetzt wurden. Wenn das optionale Argument count angegeben ist, werden nur die ersten count Vorkommen ersetzt.
Die zu suchende Teilsequenz und ihre Ersetzung können ein beliebiges byte-ähnliches Objekt sein.
Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
- bytes.rfind(sub[, start[, end]])¶
- bytearray.rfind(sub[, start[, end]])¶
Gibt den höchsten Index in der Sequenz zurück, an dem die Teilsequenz sub gefunden wird, sodass sub in
s[start:end]enthalten ist. Optionale Argumente start und end werden wie in der Slice-Notation interpretiert. Gibt-1bei Fehler zurück.Die zu suchende Teilsequenz kann ein beliebiges byte-ähnliches Objekt oder eine Ganzzahl im Bereich von 0 bis 255 sein.
Geändert in Version 3.3: Akzeptiert auch eine Ganzzahl im Bereich von 0 bis 255 als Teilsequenz.
- bytes.rindex(sub[, start[, end]])¶
- bytearray.rindex(sub[, start[, end]])¶
Wie
rfind(), löst aberValueErroraus, wenn die Teilsequenz sub nicht gefunden wird.Die zu suchende Teilsequenz kann ein beliebiges byte-ähnliches Objekt oder eine Ganzzahl im Bereich von 0 bis 255 sein.
Geändert in Version 3.3: Akzeptiert auch eine Ganzzahl im Bereich von 0 bis 255 als Teilsequenz.
- bytes.rpartition(sep, /)¶
- bytearray.rpartition(sep, /)¶
Teilt die Sequenz beim letzten Vorkommen von sep und gibt ein 3er-Tupel zurück, das den Teil vor dem Trennzeichen, das Trennzeichen selbst oder seine Bytearray-Kopie und den Teil nach dem Trennzeichen enthält. Wenn das Trennzeichen nicht gefunden wird, wird ein 3er-Tupel zurückgegeben, das zwei leere Bytes- oder Bytearray-Objekte gefolgt von einer Kopie der ursprünglichen Sequenz enthält.
Das zu suchende Trennzeichen kann ein beliebiges byte-ähnliches Objekt sein.
- bytes.startswith(prefix[, start[, end]])¶
- bytearray.startswith(prefix[, start[, end]])¶
Gibt
Truezurück, wenn die Binärdaten mit dem angegebenen prefix beginnen, andernfallsFalse. prefix kann auch ein Tupel von Präfixen sein, nach denen gesucht werden soll. Mit dem optionalen start wird ab dieser Position getestet. Mit dem optionalen end wird der Vergleich an dieser Position beendet.Das/die zu suchende(n) Präfix(e) kann/können ein beliebiges byte-ähnliches Objekt sein.
- bytes.translate(table, /, delete=b'')¶
- bytearray.translate(table, /, delete=b'')¶
Gibt eine Kopie des Bytes- oder Bytearray-Objekts zurück, bei der alle im optionalen Argument delete vorkommenden Bytes entfernt wurden und die verbleibenden Bytes über die angegebene Übersetzungstabelle abgebildet wurden, die ein Bytes-Objekt der Länge 256 sein muss.
Sie können die Methode
bytes.maketrans()verwenden, um eine Übersetzungstabelle zu erstellen.Setzen Sie das Argument table auf
Nonefür Übersetzungen, die nur Zeichen löschen>>> b'read this short text'.translate(None, b'aeiou') b'rd ths shrt txt'
Geändert in Version 3.6: delete wird jetzt als Schlüsselwortargument unterstützt.
Die folgenden Methoden für Bytes- und Bytearray-Objekte haben Standardverhalten, die die Verwendung von ASCII-kompatiblen Binärformaten annehmen, aber dennoch mit beliebigen Binärdaten verwendet werden können, indem entsprechende Argumente übergeben werden. Beachten Sie, dass alle Bytearray-Methoden in diesem Abschnitt *nicht* direkt ausgeführt werden, sondern neue Objekte erzeugen.
- bytes.center(width, fillbyte=b' ', /)¶
- bytearray.center(width, fillbyte=b' ', /)¶
Gibt eine Kopie des Objekts zurück, zentriert in einer Sequenz der Länge width. Die Auffüllung erfolgt mit dem angegebenen fillbyte (Standard ist ein ASCII-Leerzeichen). Für
bytes-Objekte wird die ursprüngliche Sequenz zurückgegeben, wenn width kleiner oder gleichlen(s)ist.Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
- bytes.ljust(width, fillbyte=b' ', /)¶
- bytearray.ljust(width, fillbyte=b' ', /)¶
Gibt eine Kopie des Objekts zurück, linksbündig in einer Sequenz der Länge width. Die Auffüllung erfolgt mit dem angegebenen fillbyte (Standard ist ein ASCII-Leerzeichen). Für
bytes-Objekte wird die ursprüngliche Sequenz zurückgegeben, wenn width kleiner oder gleichlen(s)ist.Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
- bytes.lstrip(bytes=None, /)¶
- bytearray.lstrip(bytes=None, /)¶
Gibt eine Kopie der Sequenz zurück, bei der angegebene führende Bytes entfernt wurden. Das Argument bytes ist eine Binärsequenz, die die zu entfernenden Byte-Werte angibt. Wenn es weggelassen oder auf
Nonegesetzt wird, entfernt das Argument bytes standardmäßig ASCII-Leerzeichen. Das Argument bytes ist kein Präfix; stattdessen werden alle Kombinationen seiner Werte gestrippt>>> b' spacious '.lstrip() b'spacious ' >>> b'www.example.com'.lstrip(b'cmowz.') b'example.com'
Die Binärsequenz der zu entfernenden Byte-Werte kann ein beliebiges byte-ähnliches Objekt sein. Siehe
removeprefix()für eine Methode, die eine einzelne Präfixzeichenfolge anstelle aller Zeichen eines Satzes entfernt. Zum Beispiel>>> b'Arthur: three!'.lstrip(b'Arthur: ') b'ee!' >>> b'Arthur: three!'.removeprefix(b'Arthur: ') b'three!'
Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
- bytes.rjust(breite, füllbyte=b' ', /)¶
- bytearray.rjust(breite, füllbyte=b' ', /)¶
Gibt eine Kopie des Objekts mit einer rechtsbündigen Ausrichtung auf eine Sequenz der Länge breite zurück. Die Auffüllung erfolgt mit dem angegebenen füllbyte (Standard ist ein ASCII-Leerzeichen). Für
bytes-Objekte wird die ursprüngliche Sequenz zurückgegeben, wenn breite kleiner oder gleichlen(s)ist.Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
- bytes.rsplit(sep=None, maxsplit=-1)¶
- bytearray.rsplit(sep=None, maxsplit=-1)¶
Teilt die Binärsequenz in Untersequenzen desselben Typs, wobei sep als Trennzeichen verwendet wird. Wenn maxsplit angegeben ist, werden höchstens maxsplit Trennungen durchgeführt, die rechtesten. Wenn sep nicht angegeben ist oder
Noneist, ist jede reine ASCII-Leerzeichen enthaltende Untersequenz ein Trennzeichen. Abgesehen vom Aufteilen von rechts verhält sichrsplit()wiesplit(), was unten im Detail beschrieben wird.
- bytes.rstrip(bytes=None, /)¶
- bytearray.rstrip(bytes=None, /)¶
Gibt eine Kopie der Sequenz mit entfernten angegebenen nachfolgenden Bytes zurück. Das Argument bytes ist eine Binärsequenz, die die zu entfernenden Byte-Werte angibt. Wenn es weggelassen wird oder
Noneist, werden standardmäßig ASCII-Leerzeichen entfernt. Das Argument bytes ist kein Suffix; stattdessen werden alle Kombinationen seiner Werte gestrippt.>>> b' spacious '.rstrip() b' spacious' >>> b'mississippi'.rstrip(b'ipz') b'mississ'
Die binäre Sequenz der zu entfernenden Byte-Werte kann jedes bytes-ähnliche Objekt sein. Siehe
removesuffix()für eine Methode, die einen einzelnen Suffix-String anstelle aller Zeichen aus einer Menge entfernt. Zum Beispiel>>> b'Monty Python'.rstrip(b' Python') b'M' >>> b'Monty Python'.removesuffix(b' Python') b'Monty'
Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
- bytes.split(sep=None, maxsplit=-1)¶
- bytearray.split(sep=None, maxsplit=-1)¶
Teilt die Binärsequenz in Untersequenzen desselben Typs, wobei sep als Trennzeichen verwendet wird. Wenn maxsplit angegeben und nicht negativ ist, werden höchstens maxsplit Trennungen durchgeführt (daher hat die Liste höchstens
maxsplit+1Elemente). Wenn maxsplit nicht angegeben ist oder-1ist, gibt es keine Begrenzung für die Anzahl der Trennungen (alle möglichen Trennungen werden durchgeführt).Wenn sep angegeben ist, werden aufeinanderfolgende Trennzeichen nicht gruppiert und gelten als Trennzeichen für leere Untersequenzen (z. B. gibt
b'1,,2'.split(b',')[b'1', b'', b'2']zurück). Das Argument sep kann eine Multibyte-Sequenz als einzelnes Trennzeichen sein. Das Aufteilen einer leeren Sequenz mit einem angegebenen Trennzeichen gibt[b'']oder[bytearray(b'')]zurück, abhängig vom Typ des aufgeteilten Objekts. Das Argument sep kann jedes bytes-ähnliche Objekt sein.Zum Beispiel
>>> b'1,2,3'.split(b',') [b'1', b'2', b'3'] >>> b'1,2,3'.split(b',', maxsplit=1) [b'1', b'2,3'] >>> b'1,2,,3,'.split(b',') [b'1', b'2', b'', b'3', b''] >>> b'1<>2<>3<4'.split(b'<>') [b'1', b'2', b'3<4']
Wenn sep nicht angegeben ist oder
Noneist, wird ein anderer Aufteilungsalgorithmus angewendet: Läufe von aufeinanderfolgenden ASCII-Leerzeichen werden als einzelnes Trennzeichen betrachtet, und das Ergebnis enthält keine leeren Zeichen am Anfang oder Ende, wenn die Sequenz führende oder nachfolgende Leerzeichen hat. Folglich gibt das Aufteilen einer leeren Sequenz oder einer Sequenz, die ausschließlich aus ASCII-Leerzeichen besteht, ohne ein angegebenes Trennzeichen[]zurück.Zum Beispiel
>>> b'1 2 3'.split() [b'1', b'2', b'3'] >>> b'1 2 3'.split(maxsplit=1) [b'1', b'2 3'] >>> b' 1 2 3 '.split() [b'1', b'2', b'3']
- bytes.strip(bytes=None, /)¶
- bytearray.strip(bytes=None, /)¶
Gibt eine Kopie der Sequenz mit entfernten angegebenen führenden und nachfolgenden Bytes zurück. Das Argument bytes ist eine Binärsequenz, die die zu entfernenden Byte-Werte angibt. Wenn es weggelassen wird oder
Noneist, werden standardmäßig ASCII-Leerzeichen entfernt. Das Argument bytes ist kein Präfix oder Suffix; stattdessen werden alle Kombinationen seiner Werte gestrippt.>>> b' spacious '.strip() b'spacious' >>> b'www.example.com'.strip(b'cmowz.') b'example'
Die binäre Sequenz der zu entfernenden Byte-Werte kann jedes bytes-ähnliche Objekt sein.
Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
Die folgenden Methoden für Bytes- und Bytearray-Objekte setzen die Verwendung von ASCII-kompatiblen Binärformaten voraus und sollten nicht auf beliebige Binärdaten angewendet werden. Beachten Sie, dass alle Bytearray-Methoden in diesem Abschnitt nicht inplace arbeiten, sondern neue Objekte erzeugen.
- bytes.capitalize()¶
- bytearray.capitalize()¶
Gibt eine Kopie der Sequenz zurück, bei der jedes Byte als ASCII-Zeichen interpretiert wird, das erste Byte großgeschrieben und die restlichen kleingeschrieben sind. Nicht-ASCII-Byte-Werte werden unverändert übernommen.
Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
- bytes.expandtabs(tabsize=8)¶
- bytearray.expandtabs(tabsize=8)¶
Gibt eine Kopie der Sequenz zurück, in der alle ASCII-Tabulatorzeichen durch ein oder mehrere ASCII-Leerzeichen ersetzt werden, abhängig von der aktuellen Spalte und der angegebenen Tabulatorgröße. Tabulatorpositionen treten alle tabsize Bytes auf (Standard ist 8, was Tabulatorpositionen in den Spalten 0, 8, 16 usw. ergibt). Um die Sequenz zu erweitern, wird die aktuelle Spalte auf null gesetzt und die Sequenz Byte für Byte untersucht. Wenn das Byte ein ASCII-Tabulatorzeichen (
b'\t') ist, werden ein oder mehrere Leerzeichen in das Ergebnis eingefügt, bis die aktuelle Spalte gleich der nächsten Tabulatorposition ist. (Das Tabulatorzeichen selbst wird nicht kopiert.) Wenn das aktuelle Byte ein ASCII-Zeilenumbruch (b'\n') oder ein Wagenrücklauf (b'\r') ist, wird es kopiert und die aktuelle Spalte auf null zurückgesetzt. Jedes andere Byte wird unverändert kopiert und die aktuelle Spalte wird unabhängig davon, wie der Byte-Wert dargestellt wird, um eins erhöht.>>> b'01\t012\t0123\t01234'.expandtabs() b'01 012 0123 01234' >>> b'01\t012\t0123\t01234'.expandtabs(4) b'01 012 0123 01234'
Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
- bytes.isalnum()¶
- bytearray.isalnum()¶
Gibt
Truezurück, wenn alle Bytes in der Sequenz alphabetische ASCII-Zeichen oder ASCII-Ziffern sind und die Sequenz nicht leer ist, andernfallsFalse. Alphabetische ASCII-Zeichen sind die Byte-Werte in der Sequenzb'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'. ASCII-Ziffern sind die Byte-Werte in der Sequenzb'0123456789'.Zum Beispiel
>>> b'ABCabc1'.isalnum() True >>> b'ABC abc1'.isalnum() False
- bytes.isalpha()¶
- bytearray.isalpha()¶
Gibt
Truezurück, wenn alle Bytes in der Sequenz alphabetische ASCII-Zeichen sind und die Sequenz nicht leer ist, andernfallsFalse. Alphabetische ASCII-Zeichen sind die Byte-Werte in der Sequenzb'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.Zum Beispiel
>>> b'ABCabc'.isalpha() True >>> b'ABCabc1'.isalpha() False
- bytes.isascii()¶
- bytearray.isascii()¶
Gibt
Truezurück, wenn die Sequenz leer ist oder alle Bytes in der Sequenz ASCII sind, andernfallsFalse. ASCII-Bytes liegen im Bereich 0-0x7F.Hinzugefügt in Version 3.7.
- bytes.isdigit()¶
- bytearray.isdigit()¶
Gibt
Truezurück, wenn alle Bytes in der Sequenz ASCII-Ziffern sind und die Sequenz nicht leer ist, andernfallsFalse. ASCII-Ziffern sind die Byte-Werte in der Sequenzb'0123456789'.Zum Beispiel
>>> b'1234'.isdigit() True >>> b'1.23'.isdigit() False
- bytes.islower()¶
- bytearray.islower()¶
Gibt
Truezurück, wenn mindestens ein Kleinbuchstaben-ASCII-Zeichen in der Sequenz vorhanden ist und keine Großbuchstaben-ASCII-Zeichen, andernfallsFalse.Zum Beispiel
>>> b'hello world'.islower() True >>> b'Hello world'.islower() False
Kleinbuchstaben-ASCII-Zeichen sind die Byte-Werte in der Sequenz
b'abcdefghijklmnopqrstuvwxyz'. Großbuchstaben-ASCII-Zeichen sind die Byte-Werte in der Sequenzb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
- bytes.isspace()¶
- bytearray.isspace()¶
Gibt
Truezurück, wenn alle Bytes in der Sequenz ASCII-Leerzeichen sind und die Sequenz nicht leer ist, andernfallsFalse. ASCII-Leerzeichen sind die Byte-Werte in der Sequenzb' \t\n\r\x0b\f'(Leerzeichen, Tabulator, Zeilenvorschub, Wagenrücklauf, vertikaler Tabulator, Seitenvorschub).
- bytes.istitle()¶
- bytearray.istitle()¶
Gibt
Truezurück, wenn die Sequenz ASCII-Titelcase ist und die Sequenz nicht leer ist, andernfallsFalse. Siehebytes.title()für weitere Details zur Definition von „Titelcase“.Zum Beispiel
>>> b'Hello World'.istitle() True >>> b'Hello world'.istitle() False
- bytes.isupper()¶
- bytearray.isupper()¶
Gibt
Truezurück, wenn mindestens ein Großbuchstaben-ASCII-Buchstabe in der Sequenz vorhanden ist und keine Kleinbuchstaben-ASCII-Zeichen, andernfallsFalse.Zum Beispiel
>>> b'HELLO WORLD'.isupper() True >>> b'Hello world'.isupper() False
Kleinbuchstaben-ASCII-Zeichen sind die Byte-Werte in der Sequenz
b'abcdefghijklmnopqrstuvwxyz'. Großbuchstaben-ASCII-Zeichen sind die Byte-Werte in der Sequenzb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
- bytes.lower()¶
- bytearray.lower()¶
Gibt eine Kopie der Sequenz zurück, bei der alle Großbuchstaben-ASCII-Zeichen in ihre entsprechenden Kleinbuchstaben umgewandelt werden.
Zum Beispiel
>>> b'Hello World'.lower() b'hello world'
Kleinbuchstaben-ASCII-Zeichen sind die Byte-Werte in der Sequenz
b'abcdefghijklmnopqrstuvwxyz'. Großbuchstaben-ASCII-Zeichen sind die Byte-Werte in der Sequenzb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
- bytes.splitlines(keepends=False)¶
- bytearray.splitlines(keepends=False)¶
Gibt eine Liste der Zeilen in der Binärsequenz zurück, die an ASCII-Zeilenumbrüchen getrennt werden. Diese Methode verwendet den universellen Zeilenumbruch-Ansatz zum Aufteilen von Zeilen. Zeilenumbrüche sind in der resultierenden Liste nicht enthalten, es sei denn, keepends ist angegeben und wahr.
Zum Beispiel
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines() [b'ab c', b'', b'de fg', b'kl'] >>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True) [b'ab c\n', b'\n', b'de fg\r', b'kl\r\n']
Im Gegensatz zu
split()bei Angabe eines Trennzeichens sep gibt diese Methode eine leere Liste für die leere Zeichenkette zurück, und ein abschließender Zeilenumbruch führt nicht zu einer zusätzlichen Zeile.>>> b"".split(b'\n'), b"Two lines\n".split(b'\n') ([b''], [b'Two lines', b'']) >>> b"".splitlines(), b"One line\n".splitlines() ([], [b'One line'])
- bytes.swapcase()¶
- bytearray.swapcase()¶
Gibt eine Kopie der Sequenz zurück, bei der alle Kleinbuchstaben-ASCII-Zeichen in ihre entsprechenden Großbuchstaben und umgekehrt umgewandelt werden.
Zum Beispiel
>>> b'Hello World'.swapcase() b'hELLO wORLD'
Kleinbuchstaben-ASCII-Zeichen sind die Byte-Werte in der Sequenz
b'abcdefghijklmnopqrstuvwxyz'. Großbuchstaben-ASCII-Zeichen sind die Byte-Werte in der Sequenzb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.Im Gegensatz zu
str.swapcase()gilt immer, dassbin.swapcase().swapcase() == binfür die binären Versionen. Groß-/Kleinschreibungskonvertierungen sind in ASCII symmetrisch, auch wenn dies im Allgemeinen nicht für beliebige Unicode-Codepunkte gilt.Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
- bytes.title()¶
- bytearray.title()¶
Gibt eine Titel-Version der Binärsequenz zurück, bei der Wörter mit einem Großbuchstaben-ASCII-Zeichen beginnen und die restlichen Zeichen kleingeschrieben sind. Nicht-Buchstaben-Byte-Werte bleiben unverändert.
Zum Beispiel
>>> b'Hello world'.title() b'Hello World'
Kleinbuchstaben-ASCII-Zeichen sind die Byte-Werte in der Sequenz
b'abcdefghijklmnopqrstuvwxyz'. Großbuchstaben-ASCII-Zeichen sind die Byte-Werte in der Sequenzb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. Alle anderen Byte-Werte sind nicht alphabetisch.Der Algorithmus verwendet eine einfache, sprachunabhängige Definition eines Wortes als Gruppen aufeinanderfolgender Buchstaben. Die Definition funktioniert in vielen Kontexten, aber sie bedeutet, dass Apostrophe in Kontraktionen und Possessiven Wortgrenzen bilden, was möglicherweise nicht das gewünschte Ergebnis ist.
>>> b"they're bill's friends from the UK".title() b"They'Re Bill'S Friends From The Uk"
Eine Umgehungslösung für Apostrophe kann mit regulären Ausdrücken konstruiert werden.
>>> import re >>> def titlecase(s): ... return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?", ... lambda mo: mo.group(0)[0:1].upper() + ... mo.group(0)[1:].lower(), ... s) ... >>> titlecase(b"they're bill's friends.") b"They're Bill's Friends."
Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
- bytes.upper()¶
- bytearray.upper()¶
Gibt eine Kopie der Sequenz zurück, bei der alle Kleinbuchstaben-ASCII-Zeichen in ihre entsprechenden Großbuchstaben umgewandelt werden.
Zum Beispiel
>>> b'Hello World'.upper() b'HELLO WORLD'
Kleinbuchstaben-ASCII-Zeichen sind die Byte-Werte in der Sequenz
b'abcdefghijklmnopqrstuvwxyz'. Großbuchstaben-ASCII-Zeichen sind die Byte-Werte in der Sequenzb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
- bytes.zfill(breite, /)¶
- bytearray.zfill(breite, /)¶
Gibt eine Kopie der Sequenz zurück, die links mit ASCII
b'0'-Ziffern aufgefüllt wird, um eine Sequenz der Länge breite zu erstellen. Ein führendes Vorzeichen (b'+'/b'-') wird behandelt, indem die Auffüllung nach dem Vorzeichen und nicht davor eingefügt wird. Fürbytes-Objekte wird die ursprüngliche Sequenz zurückgegeben, wenn breite kleiner oder gleichlen(seq)ist.Zum Beispiel
>>> b"42".zfill(5) b'00042' >>> b"-42".zfill(5) b'-0042'
Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
printf-Style Bytes-Formatierung¶
Hinweis
Die hier beschriebenen Formatierungsoperationen weisen eine Vielzahl von Eigenheiten auf, die zu einer Reihe häufiger Fehler führen (wie z. B. das fehlerhafte Anzeigen von Tupeln und Dictionaries). Wenn der auszugebende Wert ein Tupel oder ein Dictionary sein kann, umschließen Sie ihn in ein Tupel.
Bytes-Objekte (bytes/bytearray) haben eine einzigartige integrierte Operation: den %-Operator (Modulo). Dies ist auch als Bytes-Formatierungs- oder Interpolations-Operator bekannt. Gegeben format % values (wobei format ein Bytes-Objekt ist), werden %-Konvertierungsspezifikationen in format durch null oder mehr Elemente von values ersetzt. Die Wirkung ähnelt der Verwendung von sprintf() in der C-Sprache.
Wenn das rechte Argument ein Tupel ist, muss es genau die Anzahl der Elemente haben, die durch das Format-Bytes-Objekt angegeben sind. Wenn die zu formatierende Einzelwert ein Nicht-Tupel ist, muss er direkt angegeben werden. [5] Andernfalls muss values ein Tupel mit genau der Anzahl der durch das Format-Bytes-Objekt angegebenen Elemente sein, oder ein einzelnes Mapping-Objekt (z. B. ein Dictionary).
Ein Konvertierungsspezifizierer enthält zwei oder mehr Zeichen und hat die folgenden Komponenten, die in dieser Reihenfolge auftreten müssen:
Das Zeichen
'%', das den Beginn des Spezifizierers markiert.Mapping-Schlüssel (optional), bestehend aus einer geklammerten Sequenz von Zeichen (z. B.
(somename)).Konvertierungsflags (optional), die das Ergebnis einiger Konvertierungstypen beeinflussen.
Mindestfeldbreite (optional). Wenn als
'*'(Sternchen) angegeben, wird die tatsächliche Breite aus dem nächsten Element des Tupels in values gelesen, und das zu konvertierende Objekt kommt nach der Mindestfeldbreite und der optionalen Präzision.Präzision (optional), gegeben als ein
'.'(Punkt) gefolgt von der Präzision. Wenn als'*'(ein Sternchen) angegeben, wird die tatsächliche Präzision aus dem nächsten Element des Tupels in values gelesen, und der zu konvertierende Wert kommt nach der Präzision.Längenmodifikator (optional).
Konvertierungstyp.
Wenn das rechte Argument ein Dictionary (oder ein anderer Mapping-Typ) ist, müssen die Formate im Bytes-Objekt einen in Klammern gesetzten Mapping-Schlüssel zu diesem Dictionary enthalten, der unmittelbar nach dem '%'-Zeichen eingefügt wird. Der Mapping-Schlüssel wählt den zu formatierenden Wert aus dem Mapping aus. Zum Beispiel
>>> print(b'%(language)s has %(number)03d quote types.' %
... {b'language': b"Python", b"number": 2})
b'Python has 002 quote types.'
In diesem Fall dürfen keine *-Spezifizierer in einem Format vorkommen (da sie eine sequentielle Parameterliste erfordern).
Die Konvertierungsflag-Zeichen sind:
Flag |
Bedeutung |
|---|---|
|
Der Wert wird die „alternative Form“ verwenden (wo unten definiert). |
|
Die Konvertierung wird für numerische Werte mit Nullen aufgefüllt. |
|
Der konvertierte Wert ist linksbündig (überschreibt das |
|
(ein Leerzeichen) Ein Leerzeichen sollte vor einer positiven Zahl (oder einem leeren String) stehen, die durch eine vorzeichenbehaftete Konvertierung erzeugt wird. |
|
Ein Vorzeichen ( |
Ein Längenmodifikator (h, l oder L) kann vorhanden sein, wird aber ignoriert, da er für Python nicht notwendig ist – daher ist z. B. %ld identisch mit %d.
Die Konvertierungstypen sind:
Konvertierung |
Bedeutung |
Hinweise |
|---|---|---|
|
Vorzeichenbehaftete Ganzzahl dezimal. |
|
|
Vorzeichenbehaftete Ganzzahl dezimal. |
|
|
Vorzeichenbehafteter Oktalwert. |
(1) |
|
Veralteter Typ – identisch mit |
(8) |
|
Vorzeichenbehaftete Hexadezimalzahl (Kleinbuchstaben). |
(2) |
|
Vorzeichenbehaftete Hexadezimalzahl (Großbuchstaben). |
(2) |
|
Gleitkomma-Exponentiendarstellung (Kleinbuchstaben). |
(3) |
|
Gleitkomma-Exponentiendarstellung (Großbuchstaben). |
(3) |
|
Gleitkomma-Dezimaldarstellung. |
(3) |
|
Gleitkomma-Dezimaldarstellung. |
(3) |
|
Gleitkommadarstellung. Verwendet Kleinbuchstaben-Exponentiendarstellung, wenn der Exponent kleiner als -4 oder nicht kleiner als die Präzision ist, andernfalls Dezimaldarstellung. |
(4) |
|
Gleitkommadarstellung. Verwendet Großbuchstaben-Exponentiendarstellung, wenn der Exponent kleiner als -4 oder nicht kleiner als die Präzision ist, andernfalls Dezimaldarstellung. |
(4) |
|
Einzelnes Byte (akzeptiert Integer- oder einzelne Byte-Objekte). |
|
|
Bytes (jedes Objekt, das dem Pufferprotokoll folgt oder |
(5) |
|
|
(6) |
|
Bytes (konvertiert jedes Python-Objekt unter Verwendung von |
(5) |
|
|
(7) |
|
Es wird kein Argument konvertiert, das Ergebnis ist ein |
Hinweise
Die alternative Form bewirkt, dass ein führender Oktalspezifizierer (
'0o') vor der ersten Ziffer eingefügt wird.Die alternative Form bewirkt, dass ein führendes
'0x'oder'0X'(abhängig davon, ob das'x'- oder'X'-Format verwendet wurde) vor der ersten Ziffer eingefügt wird.Die alternative Form bewirkt, dass das Ergebnis immer einen Dezimalpunkt enthält, auch wenn keine Ziffern folgen.
Die Präzision bestimmt die Anzahl der Ziffern nach dem Dezimalpunkt und ist standardmäßig 6.
Die alternative Form bewirkt, dass das Ergebnis immer einen Dezimalpunkt enthält, und nachfolgende Nullen werden nicht entfernt, wie es sonst der Fall wäre.
Die Präzision bestimmt die Anzahl der signifikanten Ziffern vor und nach dem Dezimalpunkt und ist standardmäßig 6.
Wenn die Präzision
Nist, wird die Ausgabe aufNZeichen gekürzt.b'%s'ist veraltet, wird aber während der 3.x-Reihe nicht entfernt.b'%r'ist veraltet, wird aber während der 3.x-Reihe nicht entfernt.Siehe PEP 237.
Hinweis
Die Bytearray-Version dieser Methode arbeitet *nicht* direkt, sondern erzeugt immer ein neues Objekt, auch wenn keine Änderungen vorgenommen wurden.
Siehe auch
PEP 461 - Hinzufügen der %-Formatierung zu Bytes und Bytearray
Hinzugefügt in Version 3.5.
Memory Views¶
memoryview-Objekte ermöglichen es Python-Code, auf die internen Daten eines Objekts zuzugreifen, das das Pufferprotokoll unterstützt, ohne zu kopieren.
- class memoryview(objekt)¶
Erstellt eine
memoryview, die auf *object* verweist. *object* muss das Pufferprotokoll unterstützen. Eingebaute Objekte, die das Pufferprotokoll unterstützen, sindbytesundbytearray.Eine
memoryviewhat die Vorstellung eines *Elements*, das die atomare Speichereinheit ist, die vom ursprünglichen *object* behandelt wird. Für viele einfache Typen wiebytesundbytearrayist ein Element ein einzelnes Byte, aber andere Typen wiearray.arraykönnen größere Elemente haben.len(view)ist gleich der Länge vontolist, was die verschachtelte Listenrepräsentation der Ansicht ist. Wennview.ndim = 1, ist dies gleich der Anzahl der Elemente in der Ansicht.Geändert in Version 3.12: Wenn
view.ndim == 0, löstlen(view)jetztTypeErroraus, anstatt 1 zurückzugeben.Das Attribut
itemsizegibt die Anzahl der Bytes in einem einzelnen Element an.Eine
memoryviewunterstützt Slicing und Indizierung, um ihre Daten offenzulegen. Eindimensionale Slices ergeben eine Unteransicht.>>> v = memoryview(b'abcefg') >>> v[1] 98 >>> v[-1] 103 >>> v[1:4] <memory at 0x7f3ddc9f4350> >>> bytes(v[1:4]) b'bce'
Wenn
formateiner der nativen Formatbezeichner aus demstruct-Modul ist, wird auch die Indizierung mit einer Ganzzahl oder einem Tupel von Ganzzahlen unterstützt und gibt ein einzelnes *Element* mit dem korrekten Typ zurück. Eindimensionale Memoryviews können mit einer Ganzzahl oder einem Tupel mit einer Ganzzahl indiziert werden. Mehrdimensionale Memoryviews können mit Tupeln von exakt *ndim* Ganzzahlen indiziert werden, wobei *ndim* die Anzahl der Dimensionen ist. Null-dimensionale Memoryviews können mit dem leeren Tupel indiziert werden.Hier ist ein Beispiel mit einem Nicht-Byte-Format
>>> import array >>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444]) >>> m = memoryview(a) >>> m[0] -11111111 >>> m[-1] 44444444 >>> m[::2].tolist() [-11111111, -33333333]
Wenn das zugrunde liegende Objekt beschreibbar ist, unterstützt die Memoryview eindimensionale Slice-Zuweisungen. Größenänderungen sind nicht zulässig.
>>> data = bytearray(b'abcefg') >>> v = memoryview(data) >>> v.readonly False >>> v[0] = ord(b'z') >>> data bytearray(b'zbcefg') >>> v[1:4] = b'123' >>> data bytearray(b'z123fg') >>> v[2:3] = b'spam' Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: memoryview assignment: lvalue and rvalue have different structures >>> v[2:6] = b'spam' >>> data bytearray(b'z1spam')
Eindimensionale Memoryviews von hashbaren (schreibgeschützten) Typen mit Formaten ‚B‘, ‚b‘ oder ‚c‘ sind ebenfalls hashbar. Der Hash ist definiert als
hash(m) == hash(m.tobytes())>>> v = memoryview(b'abcefg') >>> hash(v) == hash(b'abcefg') True >>> hash(v[2:4]) == hash(b'ce') True >>> hash(v[::-2]) == hash(b'abcefg'[::-2]) True
Geändert in Version 3.3: Eindimensionale Memoryviews können jetzt gesliced werden. Eindimensionale Memoryviews mit Formaten ‚B‘, ‚b‘ oder ‚c‘ sind jetzt hashbar.
Geändert in Version 3.4: Memoryview wird jetzt automatisch bei
collections.abc.Sequenceregistriert.Geändert in Version 3.5: Memoryviews können jetzt mit einem Tupel von Ganzzahlen indiziert werden.
Geändert in Version 3.14: Memoryview ist jetzt ein generischer Typ.
memoryviewhat mehrere Methoden- __eq__(exporter)¶
Eine Memoryview und ein PEP 3118-Exporter sind gleich, wenn ihre Formen äquivalent sind und wenn alle entsprechenden Werte gleich sind, wenn die jeweiligen Formatcodes der Operanden mithilfe der
struct-Syntax interpretiert werden.Für die Teilmenge der
struct-Formatzeichenfolgen, die derzeit vontolist()unterstützt werden, sindvundwgleich, wennv.tolist() == w.tolist()>>> import array >>> a = array.array('I', [1, 2, 3, 4, 5]) >>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0]) >>> c = array.array('b', [5, 3, 1]) >>> x = memoryview(a) >>> y = memoryview(b) >>> x == a == y == b True >>> x.tolist() == a.tolist() == y.tolist() == b.tolist() True >>> z = y[::-2] >>> z == c True >>> z.tolist() == c.tolist() True
Wenn eine der Formatzeichenfolgen nicht vom
struct-Modul unterstützt wird, dann werden die Objekte immer als ungleich verglichen (selbst wenn die Formatzeichenfolgen und die Pufferinhalte identisch sind).>>> from ctypes import BigEndianStructure, c_long >>> class BEPoint(BigEndianStructure): ... _fields_ = [("x", c_long), ("y", c_long)] ... >>> point = BEPoint(100, 200) >>> a = memoryview(point) >>> b = memoryview(point) >>> a == point False >>> a == b False
Beachten Sie, dass, ähnlich wie bei Gleitkommazahlen,
v is wfür Memoryview-Objekte *nicht* impliziertv == w.Geändert in Version 3.3: Frühere Versionen verglichen den Rohspeicher unter Missachtung des Elementformats und der logischen Array-Struktur.
- tobytes(order='C')¶
Gibt die Daten im Puffer als Byte-String zurück. Dies entspricht dem Aufruf des
bytes-Konstruktors für die Memoryview.>>> m = memoryview(b"abc") >>> m.tobytes() b'abc' >>> bytes(m) b'abc'
Für nicht zusammenhängende Arrays ist das Ergebnis gleich der abgeflachten Listenrepräsentation, wobei alle Elemente in Bytes konvertiert werden.
tobytes()unterstützt alle Formatzeichenfolgen, auch solche, die nicht in derstruct-Modul-Syntax enthalten sind.Hinzugefügt in Version 3.8: *order* kann {‚C‘, ‚F‘, ‚A‘} sein. Wenn *order* ‚C‘ oder ‚F‘ ist, werden die Daten des ursprünglichen Arrays in C- oder Fortran-Reihenfolge konvertiert. Für zusammenhängende Ansichten gibt ‚A‘ eine exakte Kopie des physischen Speichers zurück. Insbesondere wird die Fortran-Reihenfolge im Speicher beibehalten. Für nicht zusammenhängende Ansichten werden die Daten zuerst in C konvertiert. *order=None* ist dasselbe wie *order=’C’*.
- hex(*, bytes_per_sep=1)¶
- hex(sep, bytes_per_sep=1)
Gibt ein String-Objekt zurück, das zwei Hexadezimalziffern für jedes Byte im Puffer enthält.
>>> m = memoryview(b"abc") >>> m.hex() '616263'
Hinzugefügt in Version 3.5.
Geändert in Version 3.8: Ähnlich wie
bytes.hex()unterstütztmemoryview.hex()jetzt optionale Parameter *sep* und *bytes_per_sep*, um Trennzeichen zwischen Bytes in der Hex-Ausgabe einzufügen.
- tolist()¶
Gibt die Daten im Puffer als Liste von Elementen zurück.
>>> memoryview(b'abc').tolist() [97, 98, 99] >>> import array >>> a = array.array('d', [1.1, 2.2, 3.3]) >>> m = memoryview(a) >>> m.tolist() [1.1, 2.2, 3.3]
- toreadonly()¶
Gibt eine schreibgeschützte Version des Memoryview-Objekts zurück. Das ursprüngliche Memoryview-Objekt bleibt unverändert.
>>> m = memoryview(bytearray(b'abc')) >>> mm = m.toreadonly() >>> mm.tolist() [97, 98, 99] >>> mm[0] = 42 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot modify read-only memory >>> m[0] = 43 >>> mm.tolist() [43, 98, 99]
Hinzugefügt in Version 3.8.
- release()¶
Gibt den zugrunde liegenden Puffer frei, der von dem Memoryview-Objekt offengelegt wird. Viele Objekte ergreifen besondere Maßnahmen, wenn eine Ansicht auf sie gehalten wird (z. B. würde ein
bytearrayeine Größenänderung vorübergehend verbieten); daher ist das Aufrufen von release() praktisch, um diese Einschränkungen zu entfernen (und alle hängenden Ressourcen freizugeben), sobald wie möglich.Nachdem diese Methode aufgerufen wurde, löst jede weitere Operation auf der Ansicht einen
ValueErroraus (außerrelease()selbst, das mehrmals aufgerufen werden kann).>>> m = memoryview(b'abc') >>> m.release() >>> m[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: operation forbidden on released memoryview object
Das Kontextmanagementprotokoll kann für einen ähnlichen Effekt verwendet werden, indem die
with-Anweisung verwendet wird.>>> with memoryview(b'abc') as m: ... m[0] ... 97 >>> m[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: operation forbidden on released memoryview object
Hinzugefügt in Version 3.2.
- cast(format, /)¶
- cast(format, shape, /)
Konvertiert eine Memoryview in ein neues Format oder eine neue Form. *shape* ist standardmäßig
[byte_length//new_itemsize], was bedeutet, dass die Ergebnisansicht eindimensional ist. Der Rückgabewert ist eine neue Memoryview, aber der Puffer selbst wird nicht kopiert. Unterstützte Konvertierungen sind 1D -> C-contiguous und C-contiguous -> 1D.Das Zielformat ist auf ein einzelnes Element-Format beschränkt, das in der
struct-Syntax angegeben ist. Eines der Formate muss ein Byte-Format sein (‚B‘, ‚b‘ oder ‚c‘). Die Byte-Länge des Ergebnisses muss mit der ursprünglichen Länge übereinstimmen. Beachten Sie, dass alle Byte-Längen vom Betriebssystem abhängen können.Konvertiere 1D/lang in 1D/unsigned bytes
>>> import array >>> a = array.array('l', [1,2,3]) >>> x = memoryview(a) >>> x.format 'l' >>> x.itemsize 8 >>> len(x) 3 >>> x.nbytes 24 >>> y = x.cast('B') >>> y.format 'B' >>> y.itemsize 1 >>> len(y) 24 >>> y.nbytes 24
Konvertiere 1D/unsigned bytes in 1D/char
>>> b = bytearray(b'zyz') >>> x = memoryview(b) >>> x[0] = b'a' Traceback (most recent call last): ... TypeError: memoryview: invalid type for format 'B' >>> y = x.cast('c') >>> y[0] = b'a' >>> b bytearray(b'ayz')
Konvertiere 1D/bytes in 3D/ints zu 1D/signed char
>>> import struct >>> buf = struct.pack("i"*12, *list(range(12))) >>> x = memoryview(buf) >>> y = x.cast('i', shape=[2,2,3]) >>> y.tolist() [[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]] >>> y.format 'i' >>> y.itemsize 4 >>> len(y) 2 >>> y.nbytes 48 >>> z = y.cast('b') >>> z.format 'b' >>> z.itemsize 1 >>> len(z) 48 >>> z.nbytes 48
Konvertiere 1D/unsigned long zu 2D/unsigned long
>>> buf = struct.pack("L"*6, *list(range(6))) >>> x = memoryview(buf) >>> y = x.cast('L', shape=[2,3]) >>> len(y) 2 >>> y.nbytes 48 >>> y.tolist() [[0, 1, 2], [3, 4, 5]]
Hinzugefügt in Version 3.3.
Geändert in Version 3.5: Das Quellformat ist beim Konvertieren in eine Byte-Ansicht nicht mehr eingeschränkt.
- count(value, /)¶
Zählt die Anzahl der Vorkommen von *value*.
Hinzugefügt in Version 3.14.
- index(value, start=0, stop=sys.maxsize, /)¶
Gibt den Index des ersten Vorkommens von *value* zurück (ab Index *start* und vor Index *stop*).
Löst einen
ValueErroraus, wenn *value* nicht gefunden werden kann.Hinzugefügt in Version 3.14.
Es gibt auch mehrere schreibgeschützte Attribute, die verfügbar sind.
- obj¶
Das zugrunde liegende Objekt der Memoryview.
>>> b = bytearray(b'xyz') >>> m = memoryview(b) >>> m.obj is b True
Hinzugefügt in Version 3.3.
- nbytes¶
nbytes == product(shape) * itemsize == len(m.tobytes()). Dies ist der Speicherplatz in Bytes, den das Array in einer zusammenhängenden Darstellung verwenden würde. Es ist nicht notwendigerweise gleichlen(m).>>> import array >>> a = array.array('i', [1,2,3,4,5]) >>> m = memoryview(a) >>> len(m) 5 >>> m.nbytes 20 >>> y = m[::2] >>> len(y) 3 >>> y.nbytes 12 >>> len(y.tobytes()) 12
Mehrdimensionale Arrays
>>> import struct >>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)]) >>> x = memoryview(buf) >>> y = x.cast('d', shape=[3,4]) >>> y.tolist() [[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]] >>> len(y) 3 >>> y.nbytes 96
Hinzugefügt in Version 3.3.
- readonly¶
Ein boolescher Wert, der angibt, ob der Speicher schreibgeschützt ist.
- format¶
Ein String, der das Format (im Stil des
struct-Moduls) für jedes Element in der Ansicht enthält. Eine Memoryview kann aus Exportern mit beliebigen Formatzeichenfolgen erstellt werden, aber einige Methoden (z. B.tolist()) sind auf native Single-Element-Formate beschränkt.Geändert in Version 3.3: Das Format
'B'wird jetzt gemäß der Syntax des struct-Moduls behandelt. Das bedeutet, dassmemoryview(b'abc')[0] == b'abc'[0] == 97.
- itemsize¶
Die Größe in Bytes jedes Elements der Memoryview.
>>> import array, struct >>> m = memoryview(array.array('H', [32000, 32001, 32002])) >>> m.itemsize 2 >>> m[0] 32000 >>> struct.calcsize('H') == m.itemsize True
- ndim¶
Eine Ganzzahl, die angibt, wie viele Dimensionen eines mehrdimensionalen Arrays der Speicher darstellt.
- shape¶
Ein Tupel von Ganzzahlen, dessen Länge
ndimentspricht und die Form des Speichers als N-dimensionales Array angibt.Geändert in Version 3.3: Ein leeres Tupel anstelle von
None, wenn ndim = 0.
- strides¶
Ein Tupel von Ganzzahlen, dessen Länge
ndimentspricht und die Größe in Bytes angibt, die zum Zugriff auf jedes Element für jede Dimension des Arrays erforderlich ist.Geändert in Version 3.3: Ein leeres Tupel anstelle von
None, wenn ndim = 0.
- suboffsets¶
Intern für PIL-ähnliche Arrays verwendet. Der Wert dient nur zu Informationszwecken.
- c_contiguous¶
Ein boolescher Wert, der angibt, ob der Speicher C-contiguous ist.
Hinzugefügt in Version 3.3.
- f_contiguous¶
Ein boolescher Wert, der angibt, ob der Speicher Fortran contiguous ist.
Hinzugefügt in Version 3.3.
- contiguous¶
Ein boolescher Wert, der angibt, ob der Speicher contiguous ist.
Hinzugefügt in Version 3.3.
Set-Typen — set, frozenset¶
Ein *Set*-Objekt ist eine ungeordnete Sammlung von unterschiedlichen hashbaren Objekten. Häufige Verwendungszwecke sind die Mitgliedschaftsprüfung, das Entfernen von Duplikaten aus einer Sequenz und die Durchführung mathematischer Operationen wie Schnittmenge, Vereinigung, Differenz und symmetrische Differenz. (Weitere Container finden Sie in den eingebauten Klassen dict, list und tuple sowie im Modul collections.)
Wie andere Sammlungen unterstützen Sets x in set, len(set) und for x in set. Da sie ungeordnete Sammlungen sind, zeichnen Sets weder die Elementposition noch die Einfügungsreihenfolge auf. Entsprechend unterstützen Sets keine Indizierung, kein Slicing oder andere sequenzähnliche Verhaltensweisen.
Derzeit gibt es zwei eingebaute Set-Typen: set und frozenset. Der Typ set ist veränderbar – der Inhalt kann mit Methoden wie add() und remove() geändert werden. Da er veränderbar ist, hat er keinen Hashwert und kann weder als Dictionary-Schlüssel noch als Element eines anderen Sets verwendet werden. Der Typ frozenset ist unveränderlich und hashbar – sein Inhalt kann nach der Erstellung nicht mehr geändert werden; er kann daher als Dictionary-Schlüssel oder als Element eines anderen Sets verwendet werden.
Nicht leere Sets (keine frozensets) können durch Platzieren einer kommaseparierten Liste von Elementen in geschweiften Klammern erstellt werden, z. B.: {'jack', 'sjoerd'}, zusätzlich zum set-Konstruktor.
Die Konstruktoren für beide Klassen funktionieren gleich
- class set(iterable=(), /)¶
- class frozenset(iterable=(), /)¶
Gibt ein neues Set- oder Frozenset-Objekt zurück, dessen Elemente aus *iterable* stammen. Die Elemente eines Sets müssen hashbar sein. Um Sets von Sets darzustellen, müssen die inneren Sets
frozenset-Objekte sein. Wenn *iterable* nicht angegeben ist, wird ein neues leeres Set zurückgegeben.Sets können auf verschiedene Weise erstellt werden.
Verwenden Sie eine kommaseparierte Liste von Elementen in geschweiften Klammern:
{'jack', 'sjoerd'}Verwenden Sie eine Set-Comprehension:
{c for c in 'abracadabra' if c not in 'abc'}Verwenden Sie den Typkonstruktor:
set(),set('foobar'),set(['a', 'b', 'foo'])
Instanzen von
setundfrozensetunterstützen die folgenden Operationen.- len(s)
Gibt die Anzahl der Elemente im Set *s* (Kardinalität von *s*) zurück.
- x in s
Prüft, ob *x* in *s* enthalten ist.
- x not in s
Prüft, ob *x* nicht in *s* enthalten ist.
- isdisjoint(other, /)¶
Gibt
Truezurück, wenn das Set keine gemeinsamen Elemente mit *other* hat. Sets sind genau dann disjunkt, wenn ihre Schnittmenge das leere Set ist.
- issubset(other, /)¶
- set <= other
Prüft, ob jedes Element im Set in *other* enthalten ist.
- set < other
Prüft, ob das Set ein echtes Subset von *other* ist, d. h.
set <= other and set != other.
- issuperset(other, /)¶
- set >= other
Prüft, ob jedes Element in *other* im Set enthalten ist.
- set > other
Prüft, ob das Set ein echtes Superset von *other* ist, d. h.
set >= other and set != other.
- union(*others)¶
- set | other | ...
Gibt ein neues Set mit Elementen aus dem Set und allen anderen zurück.
- intersection(*others)¶
- set & other & ...
Gibt ein neues Set mit Elementen zurück, die im Set und in allen anderen vorhanden sind.
- difference(*others)¶
- set - other - ...
Gibt ein neues Set mit Elementen zurück, die im Set, aber nicht in den anderen vorhanden sind.
- symmetric_difference(other, /)¶
- set ^ other
Gibt ein neues Set mit Elementen zurück, die entweder im Set oder in *other* vorhanden sind, aber nicht in beiden.
- copy()¶
Gibt eine flache Kopie des Sets zurück.
Beachten Sie, dass die Nicht-Operator-Versionen von
union(),intersection(),difference(),symmetric_difference(),issubset()undissuperset()jede beliebige Iterable als Argument akzeptieren. Im Gegensatz dazu erfordern ihre auf Operatoren basierenden Gegenstücke, dass ihre Argumente Sets sind. Dies schließt fehleranfällige Konstruktionen wieset('abc') & 'cbs'zugunsten des besser lesbarenset('abc').intersection('cbs')aus.Sowohl
setals auchfrozensetunterstützen Mengenvergleiche. Zwei Mengen sind genau dann gleich, wenn jedes Element jeder Menge im anderen enthalten ist (jede ist ein Subset des anderen). Eine Menge ist kleiner als eine andere Menge, wenn und nur wenn die erste Menge ein echtes Subset der zweiten Menge ist (ist ein Subset, ist aber nicht gleich). Eine Menge ist größer als eine andere Menge, wenn und nur wenn die erste Menge ein echtes Superset der zweiten Menge ist (ist ein Superset, ist aber nicht gleich).Instanzen von
setwerden anhand ihrer Elemente mit Instanzen vonfrozensetverglichen. Zum Beispiel gibtset('abc') == frozenset('abc')Truezurück, und das gilt auch fürset('abc') in set([frozenset('abc')]).Die Teilmengen- und Gleichheitsvergleiche verallgemeinern sich nicht zu einer totalen Ordnungsfunktion. Zum Beispiel sind zwei beliebige nichtleere disjunkte Mengen nicht gleich und auch keine Teilmengen voneinander, daher geben *alle* der folgenden Ausdrücke
Falsezurück:a<b,a==bodera>b.Da Mengen nur eine partielle Ordnung (Teilmengenbeziehungen) definieren, ist die Ausgabe der Methode
list.sort()für Listen von Mengen undefiniert.Mengen-Elemente müssen, wie Dictionary-Schlüssel, hashbar sein.
Binäre Operationen, die
set-Instanzen mitfrozenset-Instanzen mischen, geben den Typ des ersten Operanden zurück. Zum Beispiel gibtfrozenset('ab') | set('bc')eine Instanz vonfrozensetzurück.Die folgende Tabelle listet Operationen auf, die für
setverfügbar sind und die nicht für unveränderliche Instanzen vonfrozensetgelten.- update(...others)¶
- set |= other | ...
Aktualisiert die Menge, indem Elemente aus allen anderen Mengen hinzugefügt werden.
- intersection_update(...others)¶
- set &= other & ...
Aktualisiert die Menge, indem nur Elemente beibehalten werden, die in ihr und in allen anderen Mengen vorhanden sind.
- difference_update(...others)¶
- set -= other | ...
Aktualisiert die Menge, indem Elemente entfernt werden, die in anderen Mengen vorhanden sind.
- symmetric_difference_update(other, /)¶
- set ^= other
Aktualisiert die Menge, indem nur Elemente beibehalten werden, die in einer der Mengen, aber nicht in beiden vorhanden sind.
- add(elem, /)¶
Fügt das Element elem zur Menge hinzu.
- remove(elem, /)¶
Entfernt das Element elem aus der Menge. Löst eine
KeyErroraus, wenn elem nicht in der Menge enthalten ist.
- discard(elem, /)¶
Entfernt das Element elem aus der Menge, falls es vorhanden ist.
- pop()¶
Entfernt und gibt ein beliebiges Element aus der Menge zurück. Löst eine
KeyErroraus, wenn die Menge leer ist.
- clear()¶
Entfernt alle Elemente aus der Menge.
Beachten Sie, dass die nicht-Operator-Versionen der Methoden
update(),intersection_update(),difference_update()undsymmetric_difference_update()jedes Iterable als Argument akzeptieren.Beachten Sie, dass das elem-Argument für die Methoden
__contains__(),remove()unddiscard()eine Menge sein kann. Um die Suche nach einem äquivalenten frozenset zu unterstützen, wird aus elem temporär eines erstellt.
Mapping-Typen — dict¶
Ein Mapping-Objekt ordnet hashbare Werte beliebigen Objekten zu. Mappings sind veränderliche Objekte. Derzeit gibt es nur einen Standard-Mapping-Typ, das *Wörterbuch* (Dictionary). (Für andere Container siehe die integrierten Klassen list, set und tuple und das Modul collections.)
Die Schlüssel eines Wörterbuchs sind *fast* beliebige Werte. Werte, die nicht hashbar sind, d.h. Werte, die Listen, Wörterbücher oder andere veränderliche Typen enthalten (die nach Wert und nicht nach Objektidentität verglichen werden), dürfen nicht als Schlüssel verwendet werden. Werte, die gleich verglichen werden (wie 1, 1.0 und True), können austauschbar verwendet werden, um auf denselben Dictionary-Eintrag zuzugreifen.
- class dict(**kwargs)¶
- class dict(mapping, /, **kwargs)
- class dict(iterable, /, **kwargs)
Gibt ein neues Wörterbuch zurück, das aus einem optionalen Positionsargument und einer möglicherweise leeren Menge von Schlüsselwortargumenten initialisiert wird.
Wörterbücher können auf verschiedene Arten erstellt werden.
Verwenden Sie eine durch Kommas getrennte Liste von
Schlüssel: Wert-Paaren in geschweiften Klammern:{'jack': 4098, 'sjoerd': 4127}oder{4098: 'jack', 4127: 'sjoerd'}Verwenden Sie eine Dictionary-Comprehension:
{},{x: x ** 2 for x in range(10)}Verwenden Sie den Typkonstruktor:
dict(),dict([('foo', 100), ('bar', 200)]),dict(foo=100, bar=200)
Wenn kein Positionsargument angegeben wird, wird ein leeres Wörterbuch erstellt. Wenn ein Positionsargument gegeben ist und es eine
keys()-Methode definiert, wird ein Wörterbuch erstellt, indem__getitem__()mit jedem von der Methode zurückgegebenen Schlüssel auf das Argument aufgerufen wird. Andernfalls muss das Positionsargument ein Iterable sein. Jedes Element im Iterable muss selbst ein Iterable mit genau zwei Elementen sein. Das erste Element jedes Elements wird zu einem Schlüssel im neuen Wörterbuch, und das zweite Element wird zum entsprechenden Wert. Wenn ein Schlüssel mehrmals vorkommt, wird der letzte Wert für diesen Schlüssel zum entsprechenden Wert im neuen Wörterbuch.Wenn Schlüsselwortargumente gegeben sind, werden die Schlüsselwortargumente und ihre Werte zum aus dem Positionsargument erstellten Wörterbuch hinzugefügt. Wenn ein hinzuzufügender Schlüssel bereits vorhanden ist, ersetzt der Wert aus dem Schlüsselwortargument den Wert aus dem Positionsargument.
Die Angabe von Schlüsselwortargumenten wie im ersten Beispiel funktioniert nur für Schlüssel, die gültige Python-Bezeichner sind. Andernfalls können beliebige gültige Schlüssel verwendet werden.
Wörterbücher sind gleich, wenn und nur wenn sie dieselben
(Schlüssel, Wert)-Paare haben (unabhängig von der Reihenfolge). Ordnungsvergleiche („<“, „<=“, „>=“, „>“) lösen eineTypeErroraus. Um die Erstellung und Gleichheit von Wörterbüchern zu veranschaulichen, geben alle folgenden Beispiele ein Wörterbuch zurück, das gleich{"one": 1, "two": 2, "three": 3}ist.>>> a = dict(one=1, two=2, three=3) >>> b = {'one': 1, 'two': 2, 'three': 3} >>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3])) >>> d = dict([('two', 2), ('one', 1), ('three', 3)]) >>> e = dict({'three': 3, 'one': 1, 'two': 2}) >>> f = dict({'one': 1, 'three': 3}, two=2) >>> a == b == c == d == e == f True
Die Angabe von Schlüsselwortargumenten wie im ersten Beispiel funktioniert nur für Schlüssel, die gültige Python-Bezeichner sind. Andernfalls können beliebige gültige Schlüssel verwendet werden.
Wörterbücher behalten die Einfügungsreihenfolge bei. Beachten Sie, dass die Aktualisierung eines Schlüssels die Reihenfolge nicht beeinflusst. Schlüssel, die nach der Löschung hinzugefügt werden, werden am Ende eingefügt.
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4} >>> d {'one': 1, 'two': 2, 'three': 3, 'four': 4} >>> list(d) ['one', 'two', 'three', 'four'] >>> list(d.values()) [1, 2, 3, 4] >>> d["one"] = 42 >>> d {'one': 42, 'two': 2, 'three': 3, 'four': 4} >>> del d["two"] >>> d["two"] = None >>> d {'one': 42, 'three': 3, 'four': 4, 'two': None}
Geändert in Version 3.7: Die Reihenfolge der Wörterbücher ist garantiert die Einfügungsreihenfolge. Dieses Verhalten war ein Implementierungsdetail von CPython ab 3.6.
Dies sind die Operationen, die Wörterbücher unterstützen (und daher sollten benutzerdefinierte Mapping-Typen sie auch unterstützen)
- list(d)
Gibt eine Liste aller Schlüssel zurück, die im Wörterbuch d verwendet werden.
- len(d)
Gibt die Anzahl der Elemente im Wörterbuch d zurück.
- d[key]
Gibt das Element von d mit dem Schlüssel key zurück. Löst eine
KeyErroraus, wenn key nicht im Mapping enthalten ist.Wenn eine Unterklasse von dict die Methode
__missing__()definiert und key nicht vorhanden ist, ruft die Operationd[key]diese Methode mit dem Schlüssel key als Argument auf. Die Operationd[key]gibt dann zurück oder löst aus, was von dem Aufruf__missing__(key)zurückgegeben oder ausgelöst wird. Keine anderen Operationen oder Methoden rufen__missing__()auf. Wenn__missing__()nicht definiert ist, wird eineKeyErrorausgelöst.__missing__()muss eine Methode sein; es kann keine Instanzvariable sein.>>> class Counter(dict): ... def __missing__(self, key): ... return 0 ... >>> c = Counter() >>> c['red'] 0 >>> c['red'] += 1 >>> c['red'] 1
Das obige Beispiel zeigt einen Teil der Implementierung von
collections.Counter. Eine andere__missing__()-Methode wird voncollections.defaultdictverwendet.
- d[key] = value
Setzt value für
d[key].
- del d[key]
Entfernt
d[key]aus d. Löst eineKeyErroraus, wenn key nicht im Mapping enthalten ist.
- key in d
Gibt
Truezurück, wenn d einen Schlüssel key hat, andernfallsFalse.
- key not in d
Entspricht
not key in d.
- iter(d)
Gibt einen Iterator über die Schlüssel des Wörterbuchs zurück. Dies ist eine Abkürzung für
iter(d.keys()).
- clear()¶
Entfernt alle Elemente aus dem Wörterbuch.
- copy()¶
Gibt eine flache Kopie des Wörterbuchs zurück.
- classmethod fromkeys(iterable, value=None, /)¶
Erstellt ein neues Wörterbuch mit Schlüsseln aus iterable und Werten, die auf value gesetzt sind.
fromkeys()ist eine Klassenmethode, die ein neues Wörterbuch zurückgibt. value ist standardmäßigNone. Alle Werte verweisen auf nur eine einzige Instanz, daher ist es im Allgemeinen nicht sinnvoll, dass value ein veränderliches Objekt wie eine leere Liste ist. Um unterschiedliche Werte zu erhalten, verwenden Sie stattdessen eine Dictionary-Comprehension.
- get(key, default=None, /)¶
Gibt den Wert für key zurück, wenn key im Wörterbuch vorhanden ist, andernfalls default. Wenn default nicht angegeben ist, ist es standardmäßig
None, so dass diese Methode niemals eineKeyErrorauslöst.
- items()¶
Gibt eine neue Ansicht der Elemente des Wörterbuchs zurück (
(Schlüssel, Wert)-Paare). Siehe die Dokumentation der Ansichtsobjekte.
- keys()¶
Gibt eine neue Ansicht der Schlüssel des Wörterbuchs zurück. Siehe die Dokumentation der Ansichtsobjekte.
- pop(key, /)¶
- pop(key, default, /)
Wenn key im Wörterbuch vorhanden ist, wird es entfernt und sein Wert zurückgegeben, andernfalls wird default zurückgegeben. Wenn default nicht angegeben ist und key nicht im Wörterbuch vorhanden ist, wird eine
KeyErrorausgelöst.
- popitem()¶
Entfernt und gibt ein
(Schlüssel, Wert)-Paar aus dem Wörterbuch zurück. Paare werden in LIFO-Reihenfolge zurückgegeben.popitem()ist nützlich, um destruktiv über ein Wörterbuch zu iterieren, wie es oft in Mengenalgorithmen verwendet wird. Wenn das Wörterbuch leer ist, löst der Aufruf vonpopitem()eineKeyErroraus.Geändert in Version 3.7: Die LIFO-Reihenfolge ist jetzt garantiert. In früheren Versionen gab
popitem()ein beliebiges Schlüssel/Wert-Paar zurück.
- reversed(d)
Gibt einen umgekehrten Iterator über die Schlüssel des Wörterbuchs zurück. Dies ist eine Abkürzung für
reversed(d.keys()).Hinzugefügt in Version 3.8.
- setdefault(key, default=None, /)¶
Wenn key im Wörterbuch vorhanden ist, wird sein Wert zurückgegeben. Wenn nicht, wird key mit dem Wert default eingefügt und default zurückgegeben. default ist standardmäßig
None.
- update(**kwargs)¶
- update(mapping, /, **kwargs)
- update(iterable, /, **kwargs)
Aktualisiert das Wörterbuch mit den Schlüssel/Wert-Paaren aus mapping oder iterable und kwargs, wobei vorhandene Schlüssel überschrieben werden. Gibt
Nonezurück.update()akzeptiert entweder ein anderes Objekt mit einerkeys()-Methode (in diesem Fall wird__getitem__()mit jedem von der Methode zurückgegebenen Schlüssel aufgerufen) oder ein Iterable von Schlüssel/Wert-Paaren (als Tupel oder andere Iterables der Länge zwei). Wenn Schlüsselwortargumente angegeben sind, wird das Wörterbuch dann mit diesen Schlüssel/Wert-Paaren aktualisiert:d.update(red=1, blue=2).
- values()¶
Gibt eine neue Ansicht der Werte des Wörterbuchs zurück. Siehe die Dokumentation der Ansichtsobjekte.
Ein Gleichheitsvergleich zwischen einer
dict.values()-Ansicht und einer anderen gibt immerFalsezurück. Dies gilt auch beim Vergleichen vondict.values()mit sich selbst.>>> d = {'a': 1} >>> d.values() == d.values() False
- d | other
Erstellt ein neues Wörterbuch mit den zusammengeführten Schlüsseln und Werten von d und other, die beide Wörterbücher sein müssen. Die Werte von other haben Vorrang, wenn d und other gemeinsame Schlüssel haben.
Hinzugefügt in Version 3.9.
- d |= other
Aktualisiert das Wörterbuch d mit Schlüsseln und Werten aus other, das entweder ein Mapping oder ein Iterable von Schlüssel/Wert-Paaren sein kann. Die Werte von other haben Vorrang, wenn d und other gemeinsame Schlüssel haben.
Hinzugefügt in Version 3.9.
Wörterbücher und Dictionary-Ansichten sind umkehrbar.
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4} >>> d {'one': 1, 'two': 2, 'three': 3, 'four': 4} >>> list(reversed(d)) ['four', 'three', 'two', 'one'] >>> list(reversed(d.values())) [4, 3, 2, 1] >>> list(reversed(d.items())) [('four', 4), ('three', 3), ('two', 2), ('one', 1)]
Geändert in Version 3.8: Wörterbücher sind jetzt umkehrbar.
Siehe auch
types.MappingProxyType kann verwendet werden, um eine schreibgeschützte Ansicht eines dict zu erstellen.
Dictionary-Ansichtsobjekte¶
Die von dict.keys(), dict.values() und dict.items() zurückgegebenen Objekte sind *Ansichtsobjekte*. Sie bieten eine dynamische Ansicht der Dictionary-Einträge, was bedeutet, dass die Ansicht Änderungen widerspiegelt, wenn sich das Wörterbuch ändert.
Dictionary-Ansichten können iteriert werden, um ihre jeweiligen Daten zu liefern, und unterstützen Mitgliedschaftstests.
- len(dictview)
Gibt die Anzahl der Einträge im Wörterbuch zurück.
- iter(dictview)
Gibt einen Iterator über die Schlüssel, Werte oder Elemente (repräsentiert als Tupel von
(Schlüssel, Wert)) im Wörterbuch zurück.Schlüssel und Werte werden in Einfügungsreihenfolge durchlaufen. Dies ermöglicht die Erstellung von
(Wert, Schlüssel)-Paaren mitzip():pairs = zip(d.values(), d.keys()). Eine andere Möglichkeit, dieselbe Liste zu erstellen, istpairs = [(v, k) for (k, v) in d.items()].Das Iterieren über Ansichten beim Hinzufügen oder Löschen von Einträgen im Wörterbuch kann eine
RuntimeErrorauslösen oder nicht alle Einträge durchlaufen.Geändert in Version 3.7: Die Reihenfolge der Wörterbücher ist garantiert die Einfügungsreihenfolge.
- x in dictview
Gibt
Truezurück, wenn x in den Schlüsseln, Werten oder Elementen des zugrunde liegenden Wörterbuchs enthalten ist (im letzteren Fall sollte x ein(Schlüssel, Wert)-Tupel sein).
- reversed(dictview)
Gibt einen umgekehrten Iterator über die Schlüssel, Werte oder Elemente des Wörterbuchs zurück. Die Ansicht wird in umgekehrter Einfügungsreihenfolge durchlaufen.
Geändert in Version 3.8: Wörterbuchansichten sind jetzt umkehrbar.
- dictview.mapping
Gibt einen
types.MappingProxyTypezurück, der das ursprüngliche Wörterbuch kapselt, auf das sich die Ansicht bezieht.Hinzugefügt in Version 3.10.
Schlüsselansichten verhalten sich mengenartig, da ihre Einträge eindeutig und hashbar sind. Elementansichten haben ebenfalls mengenartige Operationen, da die (Schlüssel, Wert)-Paare eindeutig und die Schlüssel hashbar sind. Wenn alle Werte in einer Elementansicht ebenfalls hashbar sind, kann die Elementansicht mit anderen Mengen interoperieren. (Wertansichten werden nicht als mengenartig behandelt, da die Einträge im Allgemeinen nicht eindeutig sind.) Für mengenartige Ansichten sind alle für die abstrakte Basisklasse collections.abc.Set definierten Operationen verfügbar (z. B. ==, < oder ^). Bei der Verwendung von Mengenoperatoren akzeptieren mengenartige Ansichten jedes iterierbare Objekt als anderes Operand, im Gegensatz zu Mengen, die nur Mengen als Eingabe akzeptieren.
Ein Beispiel für die Verwendung von Wörterbuchansichten
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
>>> # iteration
>>> n = 0
>>> for val in values:
... n += val
...
>>> print(n)
504
>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']
>>> # set operations
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}
>>> keys ^ {'sausage', 'juice'} == {'juice', 'sausage', 'bacon', 'spam'}
True
>>> keys | ['juice', 'juice', 'juice'] == {'bacon', 'spam', 'juice'}
True
>>> # get back a read-only proxy for the original dictionary
>>> values.mapping
mappingproxy({'bacon': 1, 'spam': 500})
>>> values.mapping['spam']
500
Kontextmanager-Typen¶
Pythons with-Anweisung unterstützt das Konzept eines Laufzeitkontexts, der durch einen Kontextmanager definiert wird. Dies wird mithilfe eines Paares von Methoden implementiert, die es benutzerdefinierten Klassen ermöglichen, einen Laufzeitkontext zu definieren, der vor der Ausführung des Anweisungsblocks betreten und beendet wird, wenn die Anweisung endet
- contextmanager.__enter__()¶
Betritt den Laufzeitkontext und gibt entweder dieses Objekt oder ein anderes Objekt zurück, das mit dem Laufzeitkontext verbunden ist. Der von dieser Methode zurückgegebene Wert wird an den Bezeichner in der
as-Klausel vonwith-Anweisungen gebunden, die diesen Kontextmanager verwenden.Ein Beispiel für einen Kontextmanager, der sich selbst zurückgibt, ist ein Datei-Objekt. Datei-Objekte geben sich selbst von \_\_enter__() zurück, um
open()als Kontextausdruck in einerwith-Anweisung verwenden zu können.Ein Beispiel für einen Kontextmanager, der ein verwandtes Objekt zurückgibt, ist der von
decimal.localcontext()zurückgegebene. Diese Manager setzen den aktiven Dezimalkontext auf eine Kopie des ursprünglichen Dezimalkontextes und geben dann die Kopie zurück. Dies ermöglicht es, Änderungen am aktuellen Dezimalkontext im Rumpf derwith-Anweisung vorzunehmen, ohne den Code außerhalb derwith-Anweisung zu beeinträchtigen.
- contextmanager.__exit__(exc_type, exc_val, exc_tb)¶
Verlässt den Laufzeitkontext und gibt ein boolesches Flag zurück, das angibt, ob eine aufgetretene Ausnahme unterdrückt werden soll. Wenn während der Ausführung des Rumpfes der
with-Anweisung eine Ausnahme aufgetreten ist, enthalten die Argumente den Ausnahmetyp, den Wert und die Traceback-Informationen. Andernfalls sind alle drei ArgumenteNone.Die Rückgabe eines wahren Wertes aus dieser Methode führt dazu, dass die
with-Anweisung die Ausnahme unterdrückt und die Ausführung mit der Anweisung unmittelbar nach derwith-Anweisung fortsetzt. Andernfalls verbreitet sich die Ausnahme, nachdem diese Methode ihre Ausführung beendet hat. Ausnahmen, die während der Ausführung dieser Methode auftreten, ersetzen jede Ausnahme, die im Rumpf derwith-Anweisung aufgetreten ist.Die übergebene Ausnahme sollte niemals explizit erneut ausgelöst werden. Stattdessen sollte diese Methode einen falschen Wert zurückgeben, um anzuzeigen, dass die Methode erfolgreich abgeschlossen wurde und die ausgelöste Ausnahme nicht unterdrücken möchte. Dies ermöglicht es dem Kontextmanagement-Code, leicht zu erkennen, ob eine \_\_exit__()-Methode tatsächlich fehlgeschlagen ist oder nicht.
Python definiert mehrere Kontextmanager zur Unterstützung der einfachen Thread-Synchronisation, des sofortigen Schließens von Dateien oder anderen Objekten und der einfacheren Manipulation des aktiven Dezimal-Arithmetik-Kontextes. Die spezifischen Typen werden über ihre Implementierung des Kontextmanagement-Protokolls hinaus nicht speziell behandelt. Beispiele finden Sie im Modul contextlib.
Pythons Generatoren und der Dekorator contextlib.contextmanager bieten eine bequeme Möglichkeit, diese Protokolle zu implementieren. Wenn eine Generatorfunktion mit dem Dekorator contextlib.contextmanager dekoriert wird, gibt sie einen Kontextmanager zurück, der die notwendigen \_\_enter__() und \_\_exit__() Methoden implementiert, anstatt den Iterator, der von einer undekorierten Generatorfunktion erzeugt wird.
Beachten Sie, dass es in der Python/C-API keine spezielle Zelle für diese Methoden in der Typenstruktur von Python-Objekten gibt. Erweiterungstypen, die diese Methoden definieren möchten, müssen sie als normale, von Python zugängliche Methode bereitstellen. Im Vergleich zum Aufwand für die Einrichtung des Laufzeitkontextes ist der Aufwand für eine einzelne Klassen-Dictionary-Suche vernachlässigbar.
Typ-Annotation-Typen — Generischer Alias, Union¶
Die Kern-eingebauten Typen für Typ-Annotationen sind Generischer Alias und Union.
Generischer Alias-Typ¶
GenericAlias-Objekte werden im Allgemeinen durch Subskription einer Klasse erstellt. Sie werden am häufigsten mit Container-Klassen wie list oder dict verwendet. Zum Beispiel ist list[int] ein GenericAlias-Objekt, das durch Subskription der Klasse list mit dem Argument int erstellt wird. GenericAlias-Objekte sind primär für die Verwendung mit Typ-Annotationen bestimmt.
Hinweis
Es ist im Allgemeinen nur möglich, eine Klasse zu subskribieren, wenn die Klasse die spezielle Methode __class_getitem__() implementiert.
Ein GenericAlias-Objekt fungiert als Proxy für einen generischen Typ und implementiert *parametrisierte Generika*.
Für eine Container-Klasse können die an eine Subskription der Klasse übergebenen Argumente die Art(en) der Elemente angeben, die ein Objekt enthält. Zum Beispiel kann set[bytes] in Typ-Annotationen verwendet werden, um eine set zu bezeichnen, in der alle Elemente vom Typ bytes sind.
Für eine Klasse, die __class_getitem__() definiert, aber kein Container ist, geben die an eine Subskription der Klasse übergebenen Argumente oft den Rückgabetyp (die Rückgabetypen) einer oder mehrerer auf einem Objekt definierten Methoden an. Zum Beispiel können reguläre Ausdrücke sowohl für den Datentyp str als auch für den Datentyp bytes verwendet werden
Wenn
x = re.search('foo', 'foo'), istxein re.Match-Objekt, bei dem die Rückgabewerte vonx.group(0)undx[0]beide vom Typstrsind. Wir können diese Art von Objekt in Typ-Annotationen mit demGenericAliasre.Match[str]darstellen.Wenn
y = re.search(b'bar', b'bar')(beachten Sie dasbfürbytes), istyebenfalls eine Instanz vonre.Match, aber die Rückgabewerte vony.group(0)undy[0]sind beide vom Typbytes. In Typ-Annotationen würden wir diese Variante von re.Match-Objekten mitre.Match[bytes]darstellen.
GenericAlias-Objekte sind Instanzen der Klasse types.GenericAlias, die auch verwendet werden kann, um GenericAlias-Objekte direkt zu erstellen.
- T[X, Y, ...]
Erstellt einen
GenericAlias, der einen TypTdarstellt, der durch die Typen X, Y und weitere, je nach verwendetemT, parametrisiert ist. Zum Beispiel eine Funktion, die einelisterwartet, diefloat-Elemente enthältdef average(values: list[float]) -> float: return sum(values) / len(values)
Ein weiteres Beispiel für Mapping-Objekte, unter Verwendung eines
dict, das ein generischer Typ ist und zwei Typ-Parameter erwartet, die den Schlüsseltyp und den Werttyp darstellen. In diesem Beispiel erwartet die Funktion eindictmit Schlüsseln vom Typstrund Werten vom Typintdef send_post_request(url: str, body: dict[str, int]) -> None: ...
Die integrierten Funktionen isinstance() und issubclass() akzeptieren keine GenericAlias-Typen für ihr zweites Argument
>>> isinstance([1, 2], list[str])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: isinstance() argument 2 cannot be a parameterized generic
Die Python-Laufzeit erzwingt keine Typ-Annotationen. Dies gilt auch für generische Typen und ihre Typ-Parameter. Beim Erstellen eines Container-Objekts aus einem GenericAlias werden die Elemente im Container nicht gegen ihren Typ überprüft. Zum Beispiel ist der folgende Code nicht empfohlen, läuft aber ohne Fehler durch
>>> t = list[str]
>>> t([1, 2, 3])
[1, 2, 3]
Darüber hinaus löschen parametrisierte Generika Typ-Parameter während der Objekterstellung
>>> t = list[str]
>>> type(t)
<class 'types.GenericAlias'>
>>> l = t()
>>> type(l)
<class 'list'>
Das Aufrufen von repr() oder str() auf einem Generikum zeigt den parametrisierten Typ
>>> repr(list[int])
'list[int]'
>>> str(list[int])
'list[int]'
Die Methode __getitem__() von generischen Containern löst eine Ausnahme aus, um Fehler wie dict[str][str] zu verhindern
>>> dict[str][str]
Traceback (most recent call last):
...
TypeError: dict[str] is not a generic class
Solche Ausdrücke sind jedoch gültig, wenn Typ-Variablen verwendet werden. Der Index muss so viele Elemente haben, wie es Typ-Variablen-Elemente im \_\_args__-Attribut des GenericAlias-Objekts gibt.
>>> from typing import TypeVar
>>> Y = TypeVar('Y')
>>> dict[str, Y][int]
dict[str, int]
Standardmäßige generische Klassen¶
Die folgenden Standardbibliotheksklassen unterstützen parametrisierte Generika. Diese Liste ist nicht erschöpfend.
Spezielle Attribute von GenericAlias-Objekten¶
Alle parametrisierten Generika implementieren spezielle schreibgeschützte Attribute.
- genericalias.__origin__¶
Dieses Attribut verweist auf die nicht parametrisierte generische Klasse
>>> list[int].__origin__ <class 'list'>
- genericalias.__args__¶
Dieses Attribut ist ein
Tupel(möglicherweise der Länge 1) von generischen Typen, die an die ursprüngliche \_\_class_getitem__() der generischen Klasse übergeben wurden.>>> dict[str, list[int]].__args__ (<class 'str'>, list[int])
- genericalias.__parameters__¶
Dieses Attribut ist ein verzögert berechnetes Tupel (möglicherweise leer) eindeutiger Typvariablen, die in \_\_args__ gefunden wurden.
>>> from typing import TypeVar >>> T = TypeVar('T') >>> list[T].__parameters__ (~T,)
Hinweis
Ein
GenericAlias-Objekt mittyping.ParamSpec-Parametern hat möglicherweise keine korrekten__parameters__nach der Substitution, datyping.ParamSpechauptsächlich für die statische Typprüfung gedacht ist.
- genericalias.__unpacked__¶
Ein boolescher Wert, der wahr ist, wenn der Alias mit dem Operator
*entpackt wurde (sieheTypeVarTuple).Hinzugefügt in Version 3.11.
Siehe auch
- PEP 484 - Type Hints
Einführung des Frameworks von Python für Typ-Annotationen.
- PEP 585 - Type Hinting Generics In Standard Collections
Einführung der Möglichkeit, Standardbibliotheksklassen nativ zu parametrisieren, vorausgesetzt, sie implementieren die spezielle Klassenmethode
__class_getitem__().- Generika, benutzerdefinierte Generika und
typing.Generic Dokumentation zur Implementierung generischer Klassen, die zur Laufzeit parametrisiert und von statischen Typprüfern verstanden werden können.
Hinzugefügt in Version 3.9.
Union-Typ¶
Ein Union-Objekt enthält den Wert der bitweisen OR-Operation (|) auf mehreren Typ-Objekten. Diese Typen sind primär für Typ-Annotationen bestimmt. Der Union-Typ-Ausdruck ermöglicht eine sauberere Syntax für Typ-Hints im Vergleich zur Subskription von typing.Union.
- X | Y | ...
Definiert ein Union-Objekt, das die Typen X, Y und so weiter enthält.
X | Ybedeutet entweder X oder Y. Es ist äquivalent zutyping.Union[X, Y]. Zum Beispiel erwartet die folgende Funktion ein Argument vom Typintoderfloatdef square(number: int | float) -> int | float: return number ** 2
Hinweis
Der
|-Operand kann zur Laufzeit nicht verwendet werden, um Unions zu definieren, bei denen ein oder mehrere Mitglieder eine Vorwärtsreferenz sind. Zum Beispiel schlägtint | "Foo", wobei"Foo"eine Referenz auf eine noch nicht definierte Klasse ist, zur Laufzeit fehl. Für Unions, die Vorwärtsreferenzen enthalten, stellen Sie den gesamten Ausdruck als Zeichenkette dar, z. B."int | Foo".
- union_object == other
Union-Objekte können auf Gleichheit mit anderen Union-Objekten getestet werden. Details
Unionen von Unionen werden abgeflacht
(int | str) | float == int | str | float
Redundante Typen werden entfernt
int | str | int == int | str
Beim Vergleichen von Unionen wird die Reihenfolge ignoriert
int | str == str | int
Es erstellt Instanzen von
typing.Unionint | str == typing.Union[int, str] type(int | str) is typing.Union
Optionale Typen können als Union mit
Nonegeschrieben werdenstr | None == typing.Optional[str]
- isinstance(obj, union_object)
- issubclass(obj, union_object)
Aufrufe von
isinstance()undissubclass()werden ebenfalls mit einem Union-Objekt unterstützt>>> isinstance("", int | str) True
Jedoch können parametrisierte Generika in Union-Objekten nicht überprüft werden
>>> isinstance(1, int | list[int]) # short-circuit evaluation True >>> isinstance([1], int | list[int]) Traceback (most recent call last): ... TypeError: isinstance() argument 2 cannot be a parameterized generic
Der vom Benutzer exponierte Typ für das Union-Objekt kann von typing.Union abgerufen und für \_\_instance__-Prüfungen verwendet werden
>>> import typing
>>> isinstance(int | str, typing.Union)
True
>>> typing.Union()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot create 'typing.Union' instances
Hinweis
Die Methode __or__() für Typobjekte wurde hinzugefügt, um die Syntax X | Y zu unterstützen. Wenn eine Metaklasse __or__() implementiert, kann die Union sie überschreiben
>>> class M(type):
... def __or__(self, other):
... return "Hello"
...
>>> class C(metaclass=M):
... pass
...
>>> C | int
'Hello'
>>> int | C
int | C
Siehe auch
PEP 604 – PEP, der die Syntax X | Y und den Union-Typ vorschlägt.
Hinzugefügt in Version 3.10.
Geändert in Version 3.14: Union-Objekte sind jetzt Instanzen von typing.Union. Zuvor waren sie Instanzen von types.UnionType, das eine Alias für typing.Union bleibt.
Andere eingebaute Typen¶
Der Interpreter unterstützt mehrere andere Arten von Objekten. Die meisten davon unterstützen nur eine oder zwei Operationen.
Module¶
Die einzige spezielle Operation auf einem Modul ist der Attributzugriff: m.name, wobei m ein Modul ist und name auf einen Namen zugreift, der in der Symboltabelle von m definiert ist. Modulattribute können zugewiesen werden. (Beachten Sie, dass die import-Anweisung streng genommen keine Operation auf einem Modulobjekt ist; import foo erfordert kein existierendes Modulobjekt namens foo, sondern erfordert eine (externe) *Definition* für ein Modul namens foo irgendwo.)
Ein spezielles Attribut jedes Moduls ist __dict__. Dies ist das Dictionary, das die Symboltabelle des Moduls enthält. Die Änderung dieses Dictionaries ändert tatsächlich die Symboltabelle des Moduls, aber die direkte Zuweisung zum \_\_dict__-Attribut ist nicht möglich (Sie können m.__dict__['a'] = 1 schreiben, was m.a zu 1 definiert, aber Sie können nicht m.__dict__ = {} schreiben). Die direkte Änderung von \_\_dict__ wird nicht empfohlen.
In den Interpreter eingebaute Module werden so geschrieben: <module 'sys' (built-in)>. Wenn sie aus einer Datei geladen werden, werden sie als <module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'> geschrieben.
Klassen und Instanzen von Klassen¶
Siehe Objekte, Werte und Typen und Klassendefinitionen hierzu.
Funktionen¶
Funktionsobjekte werden durch Funktionsdefinitionen erstellt. Die einzige Operation auf einem Funktionsobjekt ist dessen Aufruf: func(argument-list).
Es gibt eigentlich zwei Arten von Funktionsobjekten: eingebaute Funktionen und benutzerdefinierte Funktionen. Beide unterstützen dieselbe Operation (das Aufrufen der Funktion), aber die Implementierung ist unterschiedlich, daher die unterschiedlichen Objekttypen.
Weitere Informationen finden Sie unter Funktionsdefinitionen.
Methoden¶
Methoden sind Funktionen, die über die Attributnotation aufgerufen werden. Es gibt zwei Arten: eingebaute Methoden (wie z. B. append() bei Listen) und Instanzmethoden von Klassen. Eingebaute Methoden werden mit den Typen beschrieben, die sie unterstützen.
Wenn Sie auf eine Methode (eine in einem Klassen-Namespace definierte Funktion) über eine Instanz zugreifen, erhalten Sie ein spezielles Objekt: ein gebundenes Methode (auch Instanzmethode genannt) Objekt. Beim Aufruf fügt es das Argument self zur Argumentenliste hinzu. Gebundene Methoden haben zwei spezielle schreibgeschützte Attribute: m.__self__ ist das Objekt, auf dem die Methode operiert, und m.__func__ ist die Funktion, die die Methode implementiert. Der Aufruf von m(arg-1, arg-2, ..., arg-n) ist vollständig äquivalent zum Aufruf von m.__func__(m.__self__, arg-1, arg-2, ..., arg-n).
Wie Funktionsobjekte unterstützen gebundene Methodenobjekte das Abrufen beliebiger Attribute. Da jedoch Methodenattribute tatsächlich auf dem zugrunde liegenden Funktionsobjekt (method.__func__) gespeichert sind, ist das Setzen von Methodenattributen auf gebundenen Methoden nicht zulässig. Der Versuch, ein Attribut auf einer Methode zu setzen, führt zum Auslösen eines AttributeError. Um ein Methodenattribut zu setzen, müssen Sie es explizit auf dem zugrunde liegenden Funktionsobjekt setzen.
>>> class C:
... def method(self):
... pass
...
>>> c = C()
>>> c.method.whoami = 'my name is method' # can't set on the method
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'method' object has no attribute 'whoami'
>>> c.method.__func__.whoami = 'my name is method'
>>> c.method.whoami
'my name is method'
Weitere Informationen finden Sie unter Instanzmethoden.
Code-Objekte¶
Code-Objekte werden von der Implementierung verwendet, um "pseudo-kompilierte" ausführbare Python-Codes wie einen Funktionsrumpf darzustellen. Sie unterscheiden sich von Funktionsobjekten, da sie keine Referenz auf ihre globale Ausführungsumgebung enthalten. Code-Objekte werden von der eingebauten Funktion compile() zurückgegeben und können aus Funktionsobjekten über deren Attribut __code__ extrahiert werden. Siehe auch das Modul code.
Der Zugriff auf __code__ löst ein Audit-Ereignis object.__getattr__ mit den Argumenten obj und "__code__" aus.
Ein Code-Objekt kann ausgeführt oder ausgewertet werden, indem es (anstelle einer Quellzeichenkette) an die eingebauten Funktionen exec() oder eval() übergeben wird.
Weitere Informationen finden Sie unter Die Standard-Typhierarchie.
Typ-Objekte¶
Typ-Objekte repräsentieren die verschiedenen Objekttypen. Der Typ eines Objekts wird über die eingebaute Funktion type() abgerufen. Für Typen gibt es keine speziellen Operationen. Das Standardmodul types definiert Namen für alle Standard-eingebauten Typen.
Typen werden so geschrieben: <class 'int'>.
Das Null-Objekt¶
Dieses Objekt wird von Funktionen zurückgegeben, die explizit keinen Wert zurückgeben. Es unterstützt keine speziellen Operationen. Es gibt genau ein Null-Objekt, das den Namen None (ein eingebauter Name) trägt. type(None)() erzeugt dasselbe Singleton.
Es wird als None geschrieben.
Das Ellipsis-Objekt¶
Dieses Objekt wird häufig verwendet, um anzuzeigen, dass etwas weggelassen wurde. Es unterstützt keine speziellen Operationen. Es gibt genau ein Ellipsis-Objekt, das den Namen Ellipsis (ein eingebauter Name) trägt. type(Ellipsis)() erzeugt dasselbe Ellipsis Singleton.
Es wird als Ellipsis oder ... geschrieben.
In typischer Verwendung erscheint ... als das Ellipsis-Objekt an einigen verschiedenen Stellen, zum Beispiel
In Typ-Annotationen, wie z. B. für aufrufbare Argumente oder Tuple-Elemente.
Als Rumpf einer Funktion anstelle einer pass-Anweisung.
In Drittanbieterbibliotheken, wie z. B. NumPy's Slicing und Striding.
Python verwendet auch drei Punkte auf Arten, die keine Ellipsis-Objekte sind, zum Beispiel
Doctest's
ELLIPSIS, als Muster für fehlenden Inhalt.Die Standard-Python-Eingabeaufforderung der interaktiven Shell, wenn eine partielle Eingabe unvollständig ist.
Schließlich verwendet die Python-Dokumentation oft drei Punkte in konventionellem englischem Sprachgebrauch, um weggelassenen Inhalt zu bedeuten, selbst in Codebeispielen, die sie auch als Ellipsis verwenden.
Das NotImplemented-Objekt¶
Dieses Objekt wird von Vergleichen und binären Operationen zurückgegeben, wenn diese aufgefordert werden, auf Typen zu operieren, die sie nicht unterstützen. Weitere Informationen finden Sie unter Vergleiche. Es gibt genau ein NotImplemented Objekt. type(NotImplemented)() erzeugt die Singleton-Instanz.
Es wird als NotImplemented geschrieben.
Interne Objekte¶
Informationen hierzu finden Sie unter Die Standard-Typhierarchie. Dort werden Stack-Frame-Objekte, Traceback-Objekte und Slice-Objekte beschrieben.
Spezielle Attribute¶
Die Implementierung fügt mehreren Objekttypen einige spezielle schreibgeschützte Attribute hinzu, wo sie relevant sind. Einige davon werden von der eingebauten Funktion dir() nicht gemeldet.
- definition.__name__¶
Der Name der Klasse, Funktion, Methode, des Deskriptors oder der Generator-Instanz.
- definition.__qualname__¶
Der qualifizierte Name der Klasse, Funktion, Methode, des Deskriptors oder der Generator-Instanz.
Hinzugefügt in Version 3.3.
- definition.__module__¶
Der Name des Moduls, in dem eine Klasse oder Funktion definiert wurde.
- definition.__doc__¶
Die Dokumentationszeichenkette einer Klasse oder Funktion oder
None, wenn sie undefiniert ist.
- definition.__type_params__¶
Die Typ-Parameter von generischen Klassen, Funktionen und Typ-Aliassen. Für Klassen und Funktionen, die nicht generisch sind, ist dies ein leeres Tupel.
Hinzugefügt in Version 3.12.
Begrenzung der Integer-String-Konvertierungslänge¶
CPython hat eine globale Grenze für die Konvertierung zwischen int und str, um Denial-of-Service-Angriffe zu mildern. Diese Grenze gilt *nur* für Dezimal- oder andere nicht-Zweierpotenz-Zahlbasen. Hexadezimal-, Oktal- und Binärkonvertierungen sind unbegrenzt. Die Grenze kann konfiguriert werden.
Der Typ int in CPython ist eine beliebig lange Zahl, die in binärer Form gespeichert wird (bekannt als "bignum"). Es existiert kein Algorithmus, der eine Zeichenkette in eine binäre Ganzzahl oder eine binäre Ganzzahl in eine Zeichenkette in linearer Zeit umwandeln kann, *es sei denn*, die Basis ist eine Zweierpotenz. Selbst die besten bekannten Algorithmen für die Basis 10 haben eine sub-quadratische Komplexität. Die Konvertierung eines großen Werts wie int('1' * 500_000) kann auf einer schnellen CPU über eine Sekunde dauern.
Die Begrenzung der Konvertierungsgröße bietet eine praktische Möglichkeit, CVE 2020-10735 zu vermeiden.
Die Grenze gilt für die Anzahl der Ziffernzeichen in der Eingabe- oder Ausgabesequenz, wenn ein nicht-linealer Konvertierungsalgorithmus beteiligt wäre. Unterstriche und das Vorzeichen zählen nicht zur Grenze.
Wenn eine Operation die Grenze überschreiten würde, wird ein ValueError ausgelöst.
>>> import sys
>>> sys.set_int_max_str_digits(4300) # Illustrative, this is the default.
>>> _ = int('2' * 5432)
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion: value has 5432 digits; use sys.set_int_max_str_digits() to increase the limit
>>> i = int('2' * 4300)
>>> len(str(i))
4300
>>> i_squared = i*i
>>> len(str(i_squared))
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit
>>> len(hex(i_squared))
7144
>>> assert int(hex(i_squared), base=16) == i*i # Hexadecimal is unlimited.
Die Standardgrenze beträgt 4300 Ziffern, wie in sys.int_info.default_max_str_digits angegeben. Die niedrigste konfigurierbare Grenze beträgt 640 Ziffern, wie in sys.int_info.str_digits_check_threshold angegeben.
Verifizierung
>>> import sys
>>> assert sys.int_info.default_max_str_digits == 4300, sys.int_info
>>> assert sys.int_info.str_digits_check_threshold == 640, sys.int_info
>>> msg = int('578966293710682886880994035146873798396722250538762761564'
... '9252925514383915483333812743580549779436104706260696366600'
... '571186405732').to_bytes(53, 'big')
...
Hinzugefügt in Version 3.11.
Betroffene APIs¶
Die Einschränkung gilt nur für potenziell langsame Konvertierungen zwischen int und str oder bytes
int(string)mit der Standardbasis 10.int(string, base)für alle Basen, die keine Zweierpotenz sind.str(integer).repr(integer).jede andere String-Konvertierung in Basis 10, z. B.
f"{integer}","{}".format(integer)oderb"%d" % integer.
Die Einschränkungen gelten nicht für Funktionen mit linearem Algorithmus
int(string, base)mit Basis 2, 4, 8, 16 oder 32.Format Specification Mini-Language für hexadezimale, oktale und binäre Zahlen.
strzudecimal.Decimal.
Konfiguration der Grenze¶
Vor dem Start von Python können Sie eine Umgebungsvariable oder ein Befehlszeilenflag des Interpreters verwenden, um die Grenze zu konfigurieren
PYTHONINTMAXSTRDIGITS, z. B.PYTHONINTMAXSTRDIGITS=640 python3, um die Grenze auf 640 zu setzen, oderPYTHONINTMAXSTRDIGITS=0 python3, um die Einschränkung zu deaktivieren.-X int_max_str_digits, z. B.python3 -X int_max_str_digits=640sys.flags.int_max_str_digitsenthält den Wert vonPYTHONINTMAXSTRDIGITSoder-X int_max_str_digits. Wenn sowohl die Umgebungsvariable als auch die Option-Xgesetzt sind, hat die Option-XVorrang. Ein Wert von -1 bedeutet, dass beide nicht gesetzt waren, d. h. bei der Initialisierung wurde ein Wert vonsys.int_info.default_max_str_digitsverwendet.
Aus Code heraus können Sie die aktuelle Grenze abfragen und eine neue setzen, indem Sie diese sys-APIs verwenden
sys.get_int_max_str_digits()undsys.set_int_max_str_digits()sind ein Getter und Setter für die interpretatorweite Grenze. Unterinterpreten haben ihre eigene Grenze.
Informationen über den Standardwert und das Minimum finden Sie in sys.int_info
sys.int_info.default_max_str_digitsist die einkompilierte Standardgrenze.sys.int_info.str_digits_check_thresholdist der niedrigste akzeptierte Wert für die Grenze (außer 0, was sie deaktiviert).
Hinzugefügt in Version 3.11.
Vorsicht
Das Setzen einer niedrigen Grenze *kann* zu Problemen führen. Obwohl selten, gibt es Code, der Integer-Konstanten in Dezimalform in seinem Quelltext enthält, die den Mindestschwellenwert überschreiten. Eine Folge des Setzens der Grenze ist, dass Python-Quellcode, der Dezimal-Integer-Literale enthält, die länger als die Grenze sind, beim Parsen einen Fehler verursacht, normalerweise beim Start, beim Import oder sogar bei der Installation - jederzeit, wenn keine aktuelle .pyc-Datei für den Code vorhanden ist. Eine Problemumgehung für Quellcode, der solche großen Konstanten enthält, ist die Umwandlung in die 0x-Hexadezimalform, da diese keine Grenze hat.
Testen Sie Ihre Anwendung gründlich, wenn Sie eine niedrige Grenze verwenden. Stellen Sie sicher, dass Ihre Tests mit der frühzeitig gesetzten Grenze über die Umgebung oder das Flag ausgeführt werden, damit sie beim Start und sogar während jedes Installationsschritts angewendet wird, der Python aufrufen könnte, um .py-Quellen in .pyc-Dateien vorzukompilieren.
Empfohlene Konfiguration¶
Der Standardwert sys.int_info.default_max_str_digits ist für die meisten Anwendungen angemessen. Wenn Ihre Anwendung eine andere Grenze erfordert, setzen Sie sie von Ihrem Haupteinstiegspunkt aus mit Python-versionsunabhängigem Code, da diese APIs in Sicherheits-Patch-Releases vor Version 3.12 hinzugefügt wurden.
Beispiel
>>> import sys
>>> if hasattr(sys, "set_int_max_str_digits"):
... upper_bound = 68000
... lower_bound = 4004
... current_limit = sys.get_int_max_str_digits()
... if current_limit == 0 or current_limit > upper_bound:
... sys.set_int_max_str_digits(upper_bound)
... elif current_limit < lower_bound:
... sys.set_int_max_str_digits(lower_bound)
Wenn Sie sie vollständig deaktivieren müssen, setzen Sie sie auf 0.
Fußnoten