Es ist eine neue Auswahl von Tipps und Tricks zu Python und Programmierung von meinem Telegramm-Kanal @pythonetc.
←
Frühere VeröffentlichungenDas 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