Python 3-Funktionen, die es wert sind, verwendet zu werden

Viele Programmierer begannen, von der zweiten Version von Python auf die dritte zu wechseln, da die Unterstützung für Python 2 bald eingestellt wird . Der Autor des Artikels, dessen Übersetzung wir veröffentlichen, stellt fest, dass der Großteil des Python 3-Codes, den er gesehen hat, wie ein Code mit Klammern aussieht, der in Python 2 geschrieben ist. Ihm zufolge sündigt er selbst so etwas . Hier gibt er Beispiele für einige der großartigen Funktionen, die nur für Benutzer von Python 3 verfügbar sind. Er hofft, dass diese Funktionen denjenigen das Leben erleichtern, die etwas über sie lernen.



Alle Beispiele in diesem Artikel wurden mit Python 3.7 geschrieben. Die Beschreibung der einzelnen Funktionen enthält Informationen zur Mindestversion von Python, die für die Verwendung erforderlich ist.

Format Strings (3.6+)


Ohne Zeichenfolgen ist es schwierig, in einer Programmiersprache etwas Nützliches zu schreiben. Für eine effektive Arbeit mit Zeichenfolgen benötigt ein Entwickler jedoch praktische Tools. Solche Tools, mit denen Sie mit komplexen Strukturen arbeiten können, ohne den Seelenfrieden zu verlieren. Die meisten Python-Entwickler verwenden die format :

 user = "Jane Doe" action = "buy" log_message = 'User {} has logged in and did an action {}.'.format( user, action ) print(log_message) # User Jane Doe has logged in and did an action buy. 

Python 3 unterstützt zusammen mit der format Formatzeichenfolgen ( F-Zeichenfolgen , F-Zeichenfolgen). Sie sind ein flexibles Werkzeug zur Durchführung verschiedener String-Manipulationen. So sieht das vorherige Beispiel aus, das mithilfe von Formatzeichenfolgen neu geschrieben wurde:

 user = "Jane Doe" action = "buy" log_message = f'User {user} has logged in and did an action {action}.' print(log_message) # User Jane Doe has logged in and did an action buy. 

Pathlib-Modul (3.4+)


Formatzeichenfolgen sind eine großartige Technologie, aber es wurden spezielle Tools entwickelt, um mit einigen Zeilen zu arbeiten, z. B. Dateipfade, die die Bearbeitung erheblich vereinfachen. Python 3 verfügt über ein Pathlib- Modul, eine praktische Abstraktion für die Arbeit mit Dateipfaden. Wenn Sie sich noch nicht sicher sind, ob dieses Modul zur Lösung Ihrer Probleme nützlich ist, schauen Sie sich dieses Material an.

 from pathlib import Path root = Path('post_sub_folder') print(root) # post_sub_folder path = root / 'happy_user' #    print(path.resolve()) # /home/weenkus/Workspace/Projects/DataWhatNow-Codes/how_your_python3_should_look_like/post_sub_folder/happy_user 

Typ Anmerkungen (3.5+)


Was ist besser - statische oder dynamische Eingabe? Vielleicht hat fast jeder Programmierer seine eigene Antwort auf diese schwierige Frage. Ich überlasse es dem Leser, wie genau sie ihre Programme typisieren. Aber ich denke, es ist gut für alle, zumindest zu wissen, dass Python 3 Typanmerkungen unterstützt.

 def sentence_has_animal(sentence: str) -> bool: return "animal" in sentence sentence_has_animal("Donald had a farm without animals") # True 

Transfers (3.4+)


Python 3 unterstützt dank der Enum Klasse einen einfachen Mechanismus zum Arbeiten mit Aufzählungen . Aufzählungen eignen sich zum Speichern von Konstantenlisten. Andernfalls werden Konstanten zufällig im Code verteilt.

 from enum import Enum, auto class Monster(Enum):   ZOMBIE = auto()   WARRIOR = auto()   BEAR = auto()  print(Monster.ZOMBIE) # Monster.ZOMBIE 

In der Python 3- Dokumentation können Sie feststellen, dass eine Aufzählung eine Sammlung symbolischer Namen (Mitglieder) ist, die an eindeutige, unveränderliche Werte gebunden sind. Mitglieder einer einzelnen Liste können auf Identität verglichen werden. Aufzählungen können umgangen werden.

 for monster in Monster:   print(monster) # Monster.ZOMBIE # Monster.WARRIOR # Monster.BEAR 

Eingebauter LRU-Cache (3.2+)


Heutzutage werden Caching-Mechanismen in fast allen Software- und Hardwaresystemen verwendet. Python 3 vereinfacht das Caching mit dem lru_cache- Dekorator erheblich , der den LRU-Caching-Algorithmus implementiert (am wenigsten verwendet ).

Unten finden Sie eine Funktion, die die Fibonacci-Zahlen berechnet. Diese Funktion wird häufig gezwungen, bei rekursiven Aufrufen dieselben Vorgänge auszuführen. Infolgedessen stellt sich heraus, dass die Leistung durch Zwischenspeichern verbessert werden kann.

 import time def fib(number: int) -> int:   if number == 0: return 0   if number == 1: return 1     return fib(number-1) + fib(number-2) start = time.time() fib(40) print(f'Duration: {time.time() - start}s') # Duration: 30.684099674224854s 

Jetzt verwenden wir lru_cache , um diese Funktion zu optimieren (diese Optimierungstechnik wird als Memoisierung bezeichnet ). Infolgedessen wird die Ausführungszeit einer Funktion, die zuvor in Sekunden gemessen wurde, jetzt in Nanosekunden gemessen.

 from functools import lru_cache @lru_cache(maxsize=512) def fib_memoization(number: int) -> int:   if number == 0: return 0   if number == 1: return 1     return fib_memoization(number-1) + fib_memoization(number-2) start = time.time() fib_memoization(40) print(f'Duration: {time.time() - start}s') # Duration: 6.866455078125e-05s 

Iterable Objekte entpacken (3.0+)


Beim Entpacken iterierbarer Objekte können Sie Variablen verwenden, deren Namen mit einem Sternchen versehen sind. Alles, was nicht in andere Variablen passt, gelangt in solche Variablen. Im folgenden Beispiel fallen der erste und der letzte Wert aus der Liste, die durch den Befehl range(5) gebildet wurden, in die Variablen head und tail . Alles, was zwischen dem ersten und dem letzten Wert liegt, wird in die body Variable aufgenommen.

 head, *body, tail = range(5) print(head, body, tail) # 0 [1, 2, 3] 4 py, filename, *cmds = "python3.7 script.py -n 5 -l 15".split() print(py) print(filename) print(cmds) # python3.7 # script.py # ['-n', '5', '-l', '15'] first, _, third, *_ = range(10) print(first, third) # 0 2 

Datenklassen (3.7+)


Python 3 führte Datenklassen ein . Sie geben dem Programmierer viel Handlungsfreiheit. Sie können verwendet werden, um die Menge des Boilerplate-Codes zu reduzieren. Tatsache ist, dass der dataclass automatisch spezielle Methoden generiert, z. B. __init__() und __repr__() . Im offiziellen Text des entsprechenden Vorschlags werden sie als "veränderbare benannte Tupel mit Standardwerten" beschrieben. Hier ist ein Beispiel für das Erstellen einer Klasse ohne Verwendung des dataclass :

 class Armor:     def __init__(self, armor: float, description: str, level: int = 1):       self.armor = armor       self.level = level       self.description = description                  def power(self) -> float:       return self.armor * self.level  armor = Armor(5.2, "Common armor.", 2) armor.power() # 10.4 print(armor) # <__main__.Armor object at 0x7fc4800e2cf8> 

Hier ist das gleiche, aber bereits mit dataclass :

 from dataclasses import dataclass @dataclass class Armor:   armor: float   description: str   level: int = 1     def power(self) -> float:       return self.armor * self.level  armor = Armor(5.2, "Common armor.", 2) armor.power() # 10.4 print(armor) # Armor(armor=5.2, description='Common armor.', level=2) 

Unterstützung für Paketordner ohne __init__.py-Datei (3.3+)


Eine Möglichkeit, Python-Code zu strukturieren, besteht darin, Pakete zu verwenden (Pakete werden in Ordnern abgelegt, die die Datei __init__.py enthalten). Hier ist ein Beispiel aus der offiziellen Dokumentation:

 sound/                                 __init__.py                 sound     formats/                                   __init__.py             wavread.py             wavwrite.py             aiffread.py             aiffwrite.py             auread.py             auwrite.py             ...     effects/                                  __init__.py             echo.py             surround.py             reverse.py             ...     filters/                                 __init__.py             equalizer.py             vocoder.py             karaoke.py             ... 

Bei Verwendung von Python 2 sollte jeder der im Beispiel genannten Ordner eine __init__.py . __init__.py Datei enthalten. Dank dieser Datei wird der Ordner als Python-Paket wahrgenommen. In Python 3 werden mit dem Aufkommen der Funktion " Implizite Namespace-Pakete" solche Ordner nicht mehr benötigt.

 sound/                                 __init__.py                 sound     formats/                                   wavread.py             wavwrite.py             aiffread.py             aiffwrite.py             auread.py             auwrite.py             ...     effects/                                  echo.py             surround.py             reverse.py             ...     filters/                                 equalizer.py             vocoder.py             karaoke.py             ... 

Es sollte beachtet werden, dass in der Tat nicht alles so einfach ist. Gemäß dieser offiziellen Spezifikation wird die Datei __init__.py für reguläre Pakete weiterhin benötigt. Wenn Sie es aus dem Ordner entfernen, wird das Paket zu einem sogenannten Namespace-Paket , für das zusätzliche Einschränkungen gelten.

Zusammenfassung


In diesem Artikel werden nicht alle interessanten Funktionen von Python 3 behandelt. Wir hoffen jedoch, dass Sie hier etwas Nützliches finden. Beispielcode finden Sie in diesem Repository.

Liebe Leser! Welche Funktionen von Python 3 würden Sie hier zur Liste hinzufügen?

Source: https://habr.com/ru/post/de452564/


All Articles