Ich programmiere seit mehreren Jahren in Python, habe jedoch kürzlich festgestellt, dass viele nützliche Tricks und interessante Momente an mir vorbeigegangen sind. Vielleicht bin ich nicht der einzige. Deshalb habe ich beschlossen, sie hier aufzulisten. Ich hoffe, diese Tricks sind für jemanden bei der Arbeit nützlich oder bringen mich dazu, mich kennenzulernen mit dieser Sprache näher.
Wie in vielen Sprachen in Python entspricht 1 True und 0 False, d. H.
1 == True.
Es scheint, und was ist daran falsch? Dies hat jedoch einige Nebenwirkungen, die mit der Tatsache verbunden sind, dass dieselben Objekte dieselben Hashes haben müssen, sodass Sie den Schlüssel 1 und True nicht in einem Wörterbuch zusammenfassen können.
>>> a = {1: "one", 0: "zero", True: "true", False: "false"}
Es erlaubt auch die folgenden Operationen:
>>> print(2 * False + True)
In diesem Beispiel wurden die Zeichenfolgen als Wörterbuchwerte verwendet. Ich möchte sie jedoch häufig als Wörterbuchschlüssel verwenden. Ich war immer verärgert, dass Sie beim Erstellen eines Wörterbuchs mit geschweiften Klammern die Zeichenfolgen in Anführungszeichen setzen müssen. Ich möchte sie weglassen. Dies ist möglich, wenn Sie sie erstellen Wörterbuch durch dict () Konstruktor.
>>> {"one": 1, "two": 2, "three": 3} == dict(one=1, two=2, three=3)
Darüber hinaus werden nicht nur Wörterbücher, sondern auch Mengen (Mengen) mit geschweiften Klammern erstellt.
>>> a = {1, 2, 3}
Um die beiden Sätze zu kombinieren, möchte ich aus irgendeinem Grund den Operator + verwenden, wahrscheinlich aufgrund der Art und Weise, wie die Zeichenfolgen verkettet sind. Python unterstützt diesen Operator jedoch nicht für Sets. Dies bedeutet natürlich nicht, dass wir immer Funktionen verwenden müssen. Die Entwickler gingen systematischer auf dieses Problem ein und fügten der Sprache Unterstützung für grundlegende Operationen an Mengen (nicht nur Gewerkschaften) hinzu und
hängten sie an logische Operatoren .
a = {1, 2, 3} b = {0, 2, 4} print(a & b)
Wenn Sie die Konversation über Wörterbücher fortsetzen, beginnend mit Version 3.7, stellt die Sprachspezifikation sicher, dass Wörterbücher die Einfügereihenfolge von Elementen beibehalten. OrderedDict wird nicht mehr benötigt.
www.python.org/downloads/release/python-370mail.python.org/pipermail/python-dev/2017-December/151283.html d = dict(zero='Cero', one='Uno', two='Dos', three='Tres', four='Cuatro', five='Cinco', six='Seis', seven='Siete', eight='Ocho', night='Nueve') for index, (key, value) in enumerate(d.items()): print(f"{index} is {key} in England and {value} in Spain")
Achten Sie auf die Ausgabezeile, sie beginnt mit dem Präfix f - dies ist ein spezieller Zeilentyp, der in
Python 3.6 eingeführt wurde .
Es gibt drei Arten von Zeichenfolgen in der Sprache: regulär, angegeben durch Anführungszeichen ohne Präfixe, raw \ nicht verarbeitet (raw), in denen Sonderzeichen wie \ n nicht verarbeitet und selbst als Text und F-Zeilen eingefügt werden.
Sie wurden erstellt, um die Ausgabe zu vereinfachen. Python unterstützt eine Vielzahl von Ausgabemethoden:
print("result" + str(2))
Jetzt mehr und F-Linien hinzugefügt. Alle Variablen aus dem Bereich sind in ihnen verfügbar. Sie können Funktionen aufrufen, Elemente per Schlüssel abrufen und Formatzeichenfolgen unterstützen.
from math import pi result = 4 name = "user" print(f"{name:84s} pi= {pi:.2f}, result={result}, {name[2]}")
Sie sind
schneller als alle anderen Ausgabemethoden. Wenn Ihnen also Python3.6 zur Verfügung steht, wird empfohlen, sie zu verwenden.
Eines der coolsten Python-Stücke - darin werden keine Objekte und Grundelemente gepackt und entpackt, sondern Parameter und Sammlungen.
def func(*argv, **kwargs)
Es gibt jedoch einen architektonischen Fehler in der Implementierung:
- argv - ein Tupel, dessen Werte nicht geändert werden können, dessen Werte nicht hinzugefügt oder gelöscht werden können
- kwargs ist ein veränderbares Wörterbuch, daher ist kein Caching möglich
Der Nachteil ist natürlich nicht groß, aber es ist immer noch unangenehm, dass Sie kwargs nicht direkt in einen wörterbuchbasierten Cache übertragen können. Wenn Sie einem Tupel eine Liste hinzufügen, kann ein solches Tupel auch nicht zum Wörterbuch hinzugefügt werden.
Mengen werden auch auf der Grundlage einer Hash-Tabelle erstellt, was bedeutet, dass Werte gehasht werden müssen. Außerdem ist die Menge selbst ein veränderlicher und nicht gehashter Typ. Es gibt einen speziellen Typ von Frozenset - eine unveränderliche Menge (fragen Sie mich nicht, warum sie benötigt wird).
Sie diskutierten die Erstellung des Frozendict-Typs, haben ihn aber noch nicht hinzugefügt (obwohl er bereits mindestens eine Anwendung hat - als kwargs). Für ein unveränderliches Wörterbuch muss namedtuple ausgeblasen
werden . Und auch für Notizen und unprätentiöse Klassen.
Wer schrieb in seinen Schuljahren Zyklen, um die Werte des Arrays anzuzeigen, und war wütend über das Komma am Ende, jedes Mal, wenn er sich entschied, zu punkten oder neu zu schreiben, um schön zu sein, und erst im 2-3-Kurs lernte er die Join-Methode? Oder bin ich der einzige?
Eine der unangenehmen Eigenschaften der Join-Methode für Zeichenfolgen besteht darin, dass sie nur mit Zeichenfolgenelementen funktioniert. Wenn die Auflistung mindestens eine Nicht-Zeichenfolge enthält, müssen Sie einen Generatorausdruck verwenden. Dies scheint eine zu komplizierte Lösung für eine so einfache Aufgabe zu sein. Es gibt jedoch eine Möglichkeit, die Ausgabe von Listenwerten zu vereinfachen (ohne Klammern). .
a = list(range(5)) print(" ".join(a))
Da Strings auch Sammlungen sind, können sie auch „verbunden“ werden.
print('-'.join("hello"))
Betrachten Sie die Zeile aus dem vorherigen Beispiel.
print(" ".join(str(i) for i in a))
Der Generatorausdruck wird ohne Klammern an die Verknüpfungsfunktion übergeben. Klammern können weggelassen werden, um das Lesen des Codes zu vereinfachen. Python kümmert sich um die Ausdruckskraft.
print(sum(i**2 for i in range(10)))
Außerdem können beim Erstellen von Tupeln Klammern weggelassen werden:
article = "python", 2018, "LinearLeopard"
Das Sternchen kann auch in Funktionsdeklarationen verwendet werden, sodass Sie Parameter erstellen können, die
nur über die Taste angegeben
werden können .
def sortwords(*wordlist, case_sensitive=False):
Sie können beliebig viele Parameter übergeben, ohne befürchten zu müssen, dass einer davon als Wert des Parameters case_sensitive wahrgenommen wird.
Es ist möglich und so.
def func(first, second, *, kwonly):
Wir werden uns genauer ansehen, wie es sich einfach von Argumenten unterscheidet.
def func(first, second, *, kwonly=True): print(first, second, kwonly) def func2(first, second, *args, kwonly=True): print(first, second, *args, kwonly) func(1)
Eine interessante Funktion ist mit Standardparametern verbunden: Sie werden beim Kompilieren des Moduls in Bytecode berechnet, daher ist es besser, dort keine veränderlichen Typen zu verwenden. Wir deklarieren eine Funktion, die am Ende der Liste ein Element hinzufügt. Wenn das zweite Argument weggelassen wird, gibt die Funktion eine neue Liste zurück, die nur dieses Element enthält.
def add_to(elem, collection=[]): collection.append(elem) return collection a = ["a", "c"] print(add_to("b", a))
Die Standardwerte werden im Feld __defaults__ gespeichert. Sie können jederzeit herausfinden, was dort vorhanden ist.
print(add_to.__defaults__)
Da das Standardargument (eine leere Liste) zum Zeitpunkt des Programmstarts erstellt und nicht jedes Mal neu erstellt wurde, haben wir genau dieses Verhalten erhalten.
Sie können dieses Verhalten beheben, wenn Sie den Standardwert als unveränderlichen Typ festlegen und eine Liste im Hauptteil der Funktion erstellen:
def add_to(elem, collection=None): collection = collection or [] collection.append(elem) return collection
Achten Sie auf den Befehl
collection = collection or []
Dies ist ein kürzeres (und weniger klares, wenn auch nicht für jedermann) Analogon
collection = collection if collection else []
Link zum nächsten Teil