Was sind die weniger bekannten, aber nützlichen Funktionen der Programmiersprache Python?
- Versuchen Sie, die Antworten auf den Python-Kern zu beschränken.
- Eine Funktion pro Antwort.
- Geben Sie ein Beispiel und eine kurze Beschreibung der Funktion, nicht nur einen Link zur Dokumentation.
- Beschriften Sie das Feature mit einem Titel als erste Zeile.
Schnelle Links zu Antworten:
- Argument entpacken
- Hosenträger
- Verketten von Vergleichsoperatoren
- Dekorateure
- Standardargument Fallstricke / Gefahren veränderlicher Standardargumente
- Deskriptoren
- Wörterbuch
.get
Standardwert - Docstring-Tests
- Ellipsis Slicing Syntax
- Aufzählung
- Für / sonst
- Funktion als iter () Argument
- Generatorausdrücke
import this
- In Place Value Swapping
- Listenschritt
__missing__
Artikel- Mehrzeiliger Regex
- Benannte Zeichenfolgenformatierung
- Verschachteltes Listen- / Generatorverständnis
- Neue Typen zur Laufzeit
.pth
Dateien- ROT13-Codierung
- Regex-Debugging
- Senden an Generatoren
- Tab-Vervollständigung in Interactive Interpreter
- Ternärer Ausdruck
try/except/else
- Auspacken +
print()
Funktion with
Aussage
python
hidden-features
compie
quelle
quelle
(< 1 x 10)
. Sie können sie sogar auf einzelne Argumente anwenden, z. B(= 10)
.: Cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/…Holen Sie sich den Python-Regex-Analysebaum, um Ihren Regex zu debuggen.
Reguläre Ausdrücke sind eine großartige Funktion von Python, aber das Debuggen kann schmerzhaft sein, und es ist allzu leicht, einen regulären Ausdruck falsch zu verstehen.
Glücklicherweise kann Python den Regex-Analysebaum drucken, indem das undokumentierte, experimentelle, versteckte Flag
re.DEBUG
(tatsächlich 128) an übergeben wirdre.compile
.Sobald Sie die Syntax verstanden haben, können Sie Ihre Fehler erkennen. Dort können wir sehen, dass ich vergessen habe, dem
[]
In zu entkommen[/font]
.Natürlich können Sie es mit beliebigen Flags kombinieren, z. B. mit kommentierten regulären Ausdrücken:
quelle
aufzählen
Wenn Sie eine iterable Datei mit enumerate umschließen, wird das Element zusammen mit seinem Index angezeigt.
Zum Beispiel:
Verweise:
enumerate
quelle
Generatorobjekte erstellen
Wenn du schreibst
Sie können den Generator herausholen und x zuweisen. Jetzt können Sie es tun
Dies hat den Vorteil, dass Sie keinen Zwischenspeicher benötigen, den Sie sonst benötigen würden
In einigen Fällen kann dies zu einer erheblichen Beschleunigung führen.
Sie können viele if-Anweisungen an das Ende des Generators anhängen und im Grunde verschachtelte for-Schleifen replizieren:
quelle
iter () kann ein aufrufbares Argument annehmen
Zum Beispiel:
Die
iter(callable, until_value)
Funktion ruft wiederholt aufcallable
und gibt das Ergebnis aus, bisuntil_value
es zurückgegeben wird.quelle
lambda
Schlüsselwort hier erforderlich ist?Seien Sie vorsichtig mit veränderlichen Standardargumenten
Verwenden Sie stattdessen einen Sentinel-Wert, der "nicht angegeben" bedeutet, und ersetzen Sie ihn durch die veränderbare Variable, die Sie standardmäßig verwenden möchten:
quelle
foo.func_defaults
. Was als Tupel unveränderlich ist.Senden von Werten in Generatorfunktionen . Zum Beispiel mit dieser Funktion:
Du kannst:
quelle
Wenn Sie keine Leerzeichen verwenden möchten, um Bereiche zu kennzeichnen, können Sie den C-Stil {} verwenden, indem Sie Folgendes ausgeben:
quelle
Das Schrittargument in Slice-Operatoren. Zum Beispiel:
Der Sonderfall
x[::-1]
ist eine nützliche Redewendung für 'x umgekehrt'.quelle
Dekorateure
Mit Dekorateuren können Sie eine Funktion oder Methode in eine andere Funktion einbinden, die Funktionen hinzufügen, Argumente oder Ergebnisse ändern usw. Sie schreiben Dekorateure eine Zeile über der Funktionsdefinition, beginnend mit einem "at" -Zeichen (@).
Das Beispiel zeigt einen
print_args
Dekorateur, der die Argumente der dekorierten Funktion druckt, bevor er sie aufruft:quelle
Die for ... else-Syntax (siehe http://docs.python.org/ref/for.html )
Der "else" -Block wird normalerweise am Ende der for-Schleife ausgeführt, es sei denn, die Pause wird aufgerufen.
Der obige Code könnte wie folgt emuliert werden:
quelle
Ab 2.5 haben Diktate eine spezielle Methode
__missing__
, die für fehlende Gegenstände aufgerufen wird:Es gibt auch eine diktierte Unterklasse in
collections
aufgerufendefaultdict
, die fast dasselbe tut, aber eine Funktion ohne Argumente für nicht vorhandene Elemente aufruft:Ich empfehle, solche Diktate in reguläre Diktate umzuwandeln, bevor Sie sie an Funktionen übergeben, die solche Unterklassen nicht erwarten. Viele Codes verwenden
d[a_key]
und fangen KeyErrors, um zu überprüfen, ob ein Element vorhanden ist, das dem Diktat ein neues Element hinzufügen würde.quelle
m={}; m.setdefault('foo', []).append(1)
.defaultdict
ist auch leistungsfähiger als diesetdefault
Methode in anderen Fällen. Zum Beispiel für eine Gegendd = collections.defaultdict(int) ... dd[k] += 1
vsd.setdefault(k, 0) += 1
.In-Place-Wertetausch
Die rechte Seite der Zuweisung ist ein Ausdruck, der ein neues Tupel erstellt. Die linke Seite der Zuweisung entpackt sofort das (nicht referenzierte) Tupel zu den Namen
a
undb
.Nach der Zuweisung wird das neue Tupel nicht referenziert und für die Speicherbereinigung markiert, und die Werte sind an gebunden
a
undb
wurden ausgetauscht.Wie im Python-Tutorial zu Datenstrukturen erwähnt ,
quelle
Lesbare reguläre Ausdrücke
In Python können Sie einen regulären Ausdruck auf mehrere Zeilen aufteilen, Ihre Übereinstimmungen benennen und Kommentare einfügen.
Beispiel für eine ausführliche Syntax (von Dive in Python ):
Beispiel für Namensnamenübereinstimmungen (aus dem HOWTO für reguläre Ausdrücke )
re.VERBOSE
Dank der Verkettung von Zeichenfolgenliteralen können Sie auch einen regulären Ausdruck ohne Verwendung ausführlich schreiben .quelle
Entpacken des Funktionsarguments
Sie können eine Liste oder ein Wörterbuch als Funktionsargumente mit
*
und entpacken**
.Zum Beispiel:
Sehr nützliche Verknüpfung, da Listen, Tupel und Diktate häufig als Container verwendet werden.
quelle
ROT13 ist eine gültige Codierung für den Quellcode, wenn Sie die richtige Codierungsdeklaration oben in der Codedatei verwenden:
quelle
cevag h"Uryyb fgnpxbiresybj!"
Erstellen Sie neue Typen auf voll dynamische Weise
das ist genau das gleiche wie
Wahrscheinlich nicht das Nützlichste, aber schön zu wissen.
Bearbeiten : Der feste Name des neuen Typs sollte
NewType
genau so sein wie bei derclass
Anweisung.Bearbeiten : Der Titel wurde angepasst, um die Funktion genauer zu beschreiben.
quelle
Kontextmanager und die
with
Anweisung " "Eingeführt im PEP 343 , ein Kontext - Manager ist ein Objekt , das für eine Reihe von Aussagen , die als Laufzeitkontext wirkt.
Da die Funktion neue Schlüsselwörter verwendet, wird sie schrittweise eingeführt: Sie ist in Python 2.5 über die
__future__
Direktive verfügbar . Python 2.6 und höher (einschließlich Python 3) ist standardmäßig verfügbar.Ich habe die "with" -Anweisung oft verwendet, weil ich denke, dass es ein sehr nützliches Konstrukt ist. Hier ist eine kurze Demo:
Was hier hinter den Kulissen passiert, ist, dass die Anweisung "with" das Special
__enter__
und die__exit__
Methoden für das Dateiobjekt aufruft . Ausnahmedetails werden auch an übergeben,__exit__
wenn eine Ausnahme aus dem with-Anweisungshauptteil ausgelöst wurde, sodass dort eine Ausnahmebehandlung stattfinden kann.In diesem speziellen Fall bedeutet dies für Sie, dass die Datei geschlossen wird, wenn die Ausführung außerhalb des Bereichs der
with
Suite liegt, unabhängig davon, ob dies normal erfolgt oder ob eine Ausnahme ausgelöst wurde. Dies ist im Grunde eine Möglichkeit, allgemeinen Code für die Ausnahmebehandlung zu abstrahieren.Andere häufige Anwendungsfälle hierfür sind das Sperren mit Threads und Datenbanktransaktionen.
quelle
withs
:)with open('filea') as filea and open('fileb') as fileb: ...
with open('filea') as filea, open('fileb') as fileb: ...
Wörterbücher haben eine get () -Methode
Wörterbücher haben eine 'get ()' - Methode. Wenn Sie d ['key'] ausführen und key nicht vorhanden ist, erhalten Sie eine Ausnahme. Wenn Sie d.get ('key') ausführen, erhalten Sie None zurück, wenn 'key' nicht vorhanden ist. Sie können ein zweites Argument hinzufügen, um dieses Element anstelle von "Keine" zurückzugewinnen, z. B.: D.get ('Schlüssel', 0).
Es ist großartig für Dinge wie das Addieren von Zahlen:
sum[value] = sum.get(value, 0) + 1
quelle
get(key, None)
. Hatte keine Ahnung, dassNone
standardmäßig zur Verfügung gestellt wurde.Deskriptoren
Sie sind die Magie hinter einer ganzen Reihe von Python-Kernfunktionen.
Wenn Sie einen gepunkteten Zugriff verwenden, um ein Mitglied (z. B. xy) nachzuschlagen, sucht Python zuerst nach dem Mitglied im Instanzwörterbuch. Wenn es nicht gefunden wird, sucht es im Klassenwörterbuch danach. Wenn es im Klassenwörterbuch gefunden wird und das Objekt das Deskriptorprotokoll implementiert, führt Python es aus, anstatt es nur zurückzugeben. Ein Deskriptor ist jede Klasse , die die Geräte
__get__
,__set__
oder__delete__
Methoden.So implementieren Sie Ihre eigene (schreibgeschützte) Version der Eigenschaft mithilfe von Deskriptoren:
und Sie würden es genau wie die eingebaute Eigenschaft () verwenden:
Deskriptoren werden in Python verwendet, um unter anderem Eigenschaften, gebundene Methoden, statische Methoden, Klassenmethoden und Slots zu implementieren. Wenn man sie versteht, kann man leicht erkennen, warum viele Dinge, die früher wie Python-Macken aussahen, so sind, wie sie sind.
Raymond Hettinger hat ein exzellentes Tutorial , das sie viel besser beschreibt als ich.
quelle
foo = property(lambda self: self.__foo)
property
selbst wird mit Deskriptoren implementiert, was der Punkt meines Beitrags war.Bedingte Zuordnung
Es macht genau das, wonach es sich anhört: "Weisen Sie x 3 zu, wenn y 1 ist, andernfalls weisen Sie x 2 zu". Beachten Sie, dass die Parens nicht notwendig sind, aber ich mag sie für die Lesbarkeit. Sie können es auch verketten, wenn Sie etwas Komplizierteres haben:
Ab einem bestimmten Punkt geht es allerdings etwas zu weit.
Beachten Sie, dass Sie if ... else in einem beliebigen Ausdruck verwenden können. Zum Beispiel:
Hier wird func1 aufgerufen, wenn y 1 ist, andernfalls func2. In beiden Fällen wird die entsprechende Funktion mit den Argumenten arg1 und arg2 aufgerufen.
Analog gilt auch:
Dabei sind Klasse1 und Klasse2 zwei Klassen.
quelle
x = ((y == 1) ? 3 : 2)
macht für mich mehr SinnDoctest : Dokumentation und Unit-Test gleichzeitig.
Beispiel aus der Python-Dokumentation:
quelle
locals()
dann in Ihrem Doctest dolocals().update(setUp())
= DBenannte Formatierung
Die% -Formatierung erfordert ein Wörterbuch (gilt auch für die Validierung von% i /% s usw.).
Und da local () auch ein Wörterbuch ist, können Sie dies einfach als Diktat übergeben und% -substitions aus Ihren lokalen Variablen haben. Ich denke, das ist verpönt, vereinfacht aber die Dinge.
Neue Stilformatierung
quelle
Um weitere Python-Module hinzuzufügen (insbesondere solche von Drittanbietern), scheinen die meisten Benutzer PYTHONPATH-Umgebungsvariablen zu verwenden, oder sie fügen Symlinks oder Verzeichnisse in ihre Site-Package-Verzeichnisse ein. Eine andere Möglichkeit ist die Verwendung von * .pth-Dateien. Hier ist die Erklärung des offiziellen Python-Dokuments:
quelle
Ausnahme sonst Klausel:
Die Verwendung der else-Klausel ist besser als das Hinzufügen von zusätzlichem Code zur try-Klausel, da dadurch vermieden wird, dass versehentlich eine Ausnahme abgefangen wird, die nicht durch den durch die try ... außer -Anweisung geschützten Code ausgelöst wurde.
Siehe http://docs.python.org/tut/node10.html
quelle
Ausnahmen erneut erheben :
Die Anweisung 'raise' ohne Argumente in einem Fehlerhandler weist Python an, die Ausnahme mit intaktem ursprünglichen Traceback erneut auszulösen , sodass Sie sagen können: "Oh, sorry, sorry, ich wollte das nicht abfangen, sorry, sorry. ""
Wenn Sie den ursprünglichen Traceback drucken, speichern oder damit experimentieren möchten, können Sie ihn mit sys.exc_info () abrufen. Der Druckvorgang erfolgt wie in Python mit dem Traceback-Modul.
quelle
raise e
stattdessen, wodurch der ursprüngliche Traceback nicht erhalten bleibt.exc_info = sys.exc_info(); raise exc_info[0], exc_info[1], exc_info[2]
ist gleichbedeutend damit, aber Sie können diese Werte ändern (z. B. den Ausnahmetyp oder die Nachricht ändern)Hauptnachrichten :)
Entschlüsselt :
quelle
print s.translate("".join(chr(64<i<91 and 65+(i-52)%26 or 96<i<123 and 97+(i-84)%26 or i) for i in range(256)))
Jetzt sieht es viel besser aus !! :-DVervollständigung der Registerkarte Interaktiver Interpreter
Sie müssen auch eine PYTHONSTARTUP-Umgebungsvariable festlegen.
quelle
easy_install ipdb
- dann können Sie verwendenimport ipdb; ipdb.set_trace()
readline.parse_and_bind ("bind ^I rl_complete")
Verschachtelte Listenverständnisse und Generatorausdrücke:
Diese können große Teile des Nested-Loop-Codes ersetzen.
quelle
for
Anweisungen in der Reihenfolge geschrieben werden muss, in der Sie erwarten würden, dass sie in einer Standard-for-Schleife von außen nach innen geschrieben werden.for
s undif
s mityield x
innen. Um dies in einen Generatorausdruck umzuwandeln, verschieben Siex
zuerst, löschen Sie alle Doppelpunkte (und dieyield
) und umgeben Sie das Ganze in Klammern. Um stattdessen ein Listenverständnis zu erhalten, ersetzen Sie die äußeren Parens durch eckige Klammern.Überlastung des
set
Bedieners für das eingebaute Gerät:Weitere Details finden Sie in der Standardbibliotheksreferenz: Set Types
quelle