Tipps und Tricks von meinem Telegramm-Kanal @pythonetc, Juni 2019


Es ist eine neue Auswahl von Tipps und Tricks zu Python und Programmierung von meinem Telegramm-Kanal @pythonetc.

Frühere Veröffentlichungen


Das Symbol \ in der regulären Zeichenfolge hat eine besondere Bedeutung. \t ist ein Tabulatorzeichen, \r ist ein Wagenrücklauf und so weiter.

Sie können Raw-Strings verwenden, um dieses Verhalten zu deaktivieren. r'\t' ist nur Backslash und t .

Sie können offensichtlich nicht ' inside r'...' . Es kann jedoch weiterhin von \ maskiert werden, aber \ bleibt in der Zeichenfolge erhalten:

 >>> print(r'It\'s insane!') It\'s insane! 


Listenverständnisse können mehr als eine for und if Klauseln enthalten:

 In : [(x, y) for x in range(3) for y in range(3)] Out: [ (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2) ] In : [ (x, y) for x in range(3) for y in range(3) if x != 0 if y != 0 ] Out: [(1, 1), (1, 2), (2, 1), (2, 2)] 

Außerdem kann jeder Ausdruck in for und if alle zuvor definierten Variablen verwenden:

 In : [ (x, y) for x in range(3) for y in range(x + 2) if x != y ] Out: [ (0, 1), (1, 0), (1, 2), (2, 0), (2, 1), (2, 3) ] 

Sie können mischen, if s und for s, wie Sie möchten:

 In : [ (x, y) for x in range(5) if x % 2 for y in range(x + 2) if x != y ] Out: [ (1, 0), (1, 2), (3, 0), (3, 1), (3, 2), (3, 4) ] 


Mit der sorted Funktion können Sie eine benutzerdefinierte Methode zum Sortieren bereitstellen. Dies geschieht mit dem key , das beschreibt, wie Originalwerte in Werte konvertiert werden, die tatsächlich verglichen werden:

 >>> x = [dict(name='Vadim', age=29), dict(name='Alex', age=4)] >>> sorted(x, key=lambda v: v['age']) [{'age': 4, 'name': 'Alex'}, {'age': 29, 'name': 'Vadim'}] 

Leider unterstützen nicht alle Bibliotheken, die mit Vergleichen arbeiten, so etwas wie dieses key . Bemerkenswerte Beispiele sind heapq (teilweise Unterstützung) und bisect (keine Unterstützung).

Es gibt zwei Möglichkeiten, mit der Situation umzugehen. Die erste besteht darin, benutzerdefinierte Objekte zu verwenden, die einen ordnungsgemäßen Vergleich unterstützen:

 >>> class User: ... def __init__(self, name, age): ... self.name = name ... self.age = age ... def __lt__(self, other): ... return self.age < other.age ... >>> x = [User('Vadim', 29), User('Alex', 4)] >>> [x.name for x in sorted(x)] ['Alex', 'Vadim'] 

Möglicherweise müssen Sie jedoch mehrere Versionen solcher Klassen erstellen, da es mehrere Möglichkeiten gibt, Objekte zu vergleichen. Es kann lästig sein, kann aber auf dem zweiten Weg leicht gelöst werden.

Anstatt benutzerdefinierte Objekte zu erstellen, können Sie Tupel (a, b) wobei a der zu vergleichende Wert (auch bekannt als prioirty) und b der ursprüngliche Wert ist:

 >>> users = [dict(name='Vadim', age=29), dict(name='Alex', age=4)] >>> to_sort = [(u['age'], u) for u in users] >>> [x[1]['name'] for x in sorted(to_sort)] ['Alex', 'Vadim'] 


Der Unterschied zwischen Funktionsdefinition und Generatordefinition besteht im Vorhandensein des Schlüsselworts yield im Funktionskörper:

 In : def f(): ...: pass ...: In : def g(): ...: yield ...: In : type(f()) Out: NoneType In : type(g()) Out: generator 

Das bedeutet, dass Sie Folgendes tun müssen, um einen leeren Generator zu erstellen:

 In : def g(): ...: if False: ...: yield ...: In : list(g()) Out: [] 

Da die yield from einfachen Iteratoren unterstützt, wäre diese besser aussehende Version jedoch folgende:

 def g(): yield from [] 


In Python können Sie Vergleichsoperatoren verketten:

 >>> 0 < 1 < 2 True >>> 0 < 1 < 0 False 

Solche Ketten müssen nicht mathematisch gültig sein, Sie können > und < mischen:

 >>> 0 < 1 > 2 False >>> 0 < 1 < 2 > 1 > 0 True 

Andere Operatoren wie == , is und in werden ebenfalls unterstützt:

 >>> [] is not 3 in [1, 2, 3] True 

Jeder Operator wird auf die beiden nächsten Operanden angewendet. a OP1 b OP2 c ist streng gleich (a OP1 b) AND (b OP2 c) . Es wird kein Vergleich zwischen a und c impliziert:

 class Spy: def __init__(self, x): self.x = x def __eq__(self, other): print(f'{self.x} == {other.x}') return self.x == other.x def __ne__(self, other): print(f'{self.x} != {other.x}') return self.x != other.x def __lt__(self, other): print(f'{self.x} < {other.x}') return self.x < other.x def __le__(self, other): print(f'{self.x} <= {other.x}') return self.x <= other.x def __gt__(self, other): print(f'{self.x} > {other.x}') return self.x > other.x def __ge__(self, other): print(f'{self.x} >= {other.x}') return self.x >= other.x s1 = Spy(1) s2 = Spy(2) s3 = Spy(3) print(s1 is s1 < s2 <= s3 == s3) 

Ausgabe:

 1 < 2 2 <= 3 3 == 3 True 

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


All Articles