Frage Versteckte Funktionen von Python [geschlossen]


Was sind die weniger bekannten, aber nützlichen Funktionen der Programmiersprache Python?

  • Versuchen Sie, die Antworten auf den Python-Core zu beschränken.
  • Ein Feature pro Antwort.
  • Geben Sie ein Beispiel und eine kurze Beschreibung der Funktion an, nicht nur einen Link zur Dokumentation.
  • Beschriften Sie das Feature mit einem Titel als erste Zeile.

Schnelle Links zu Antworten:


1420


Ursprung


Antworten:


Verkettungsvergleichsoperatoren:

>>> x = 5
>>> 1 < x < 10
True
>>> 10 < x < 20 
False
>>> x < 10 < x*10 < 100
True
>>> 10 > x <= 9
True
>>> 5 == x > 4
True

Falls Sie denken, dass es so ist 1 < x, die als herauskommt Trueund dann vergleichen True < 10, was auch ist TrueNein, das passiert wirklich nicht (siehe letztes Beispiel). Es übersetzt sich wirklich in 1 < x and x < 10, und x < 10 and 10 < x * 10 and x*10 < 100, aber mit weniger Tipparbeit und jeder Begriff wird nur einmal ausgewertet.


741



Holen Sie sich den Python-Regex-Syntaxbaum, um Ihre Regex zu debuggen.

Reguläre Ausdrücke sind ein großartiges Feature von Python, aber das Debuggen kann sehr mühsam sein und es ist viel zu einfach, eine Regex falsch zu schreiben.

Glücklicherweise kann Python den Regex-Parse-Baum drucken, indem er das undokumentierte, experimentelle, versteckte Flag übergibt re.DEBUG (eigentlich 128) zu re.compile.

>>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]",
    re.DEBUG)
at at_beginning
literal 91
literal 102
literal 111
literal 110
literal 116
max_repeat 0 1
  subpattern None
    literal 61
    subpattern 1
      in
        literal 45
        literal 43
      max_repeat 1 2
        in
          range (48, 57)
literal 93
subpattern 2
  min_repeat 0 65535
    any None
in
  literal 47
  literal 102
  literal 111
  literal 110
  literal 116

Sobald Sie die Syntax verstanden haben, können Sie Ihre Fehler erkennen. Da können wir sehen, dass ich vergessen habe zu entkommen [] im [/font].

Natürlich können Sie es mit beliebigen Flaggen kombinieren, wie zB kommentierte Regexes:

>>> re.compile("""
 ^              # start of a line
 \[font         # the font tag
 (?:=(?P<size>  # optional [font=+size]
 [-+][0-9]{1,2} # size specification
 ))?
 \]             # end of tag
 (.*?)          # text between the tags
 \[/font\]      # end of the tag
 """, re.DEBUG|re.VERBOSE|re.DOTALL)

512



aufzählen

Wrap iterable mit enumerate und es wird das Element mit seinem Index ergeben.

Beispielsweise:


>>> a = ['a', 'b', 'c', 'd', 'e']
>>> for index, item in enumerate(a): print index, item
...
0 a
1 b
2 c
3 d
4 e
>>>

Verweise:


460



Erstellen von Generatoren

Wenn du schreibst

x=(n for n in foo if bar(n))

Du kannst den Generator rausholen und ihn x zuweisen. Jetzt bedeutet es, dass du es kannst

for n in x:

Der Vorteil ist, dass Sie keinen Zwischenspeicher benötigen, den Sie benötigen würden

x = [n for n in foo if bar(n)]

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:

>>> n = ((a,b) for a in range(0,2) for b in range(4,6))
>>> for i in n:
...   print i 

(0, 4)
(0, 5)
(1, 4)
(1, 5)

419



iter () kann ein aufrufbares Argument verwenden

Zum Beispiel:

def seek_next_line(f):
    for c in iter(lambda: f.read(1),'\n'):
        pass

Das iter(callable, until_value) Funktion ruft wiederholt auf callable und ergibt sein Ergebnis bis until_value ist zurück gekommen.


353



Seien Sie vorsichtig mit veränderbaren Standardargumenten

>>> def foo(x=[]):
...     x.append(1)
...     print x
... 
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]

Stattdessen sollten Sie einen Sentinel-Wert verwenden, der "not given" ("nicht vorhanden") angibt, und ihn durch den mutable-Standardwert ersetzen:

>>> def foo(x=None):
...     if x is None:
...         x = []
...     x.append(1)
...     print x
>>> foo()
[1]
>>> foo()
[1]

339



Senden von Werten in Generatorfunktionen. Zum Beispiel mit dieser Funktion:

def mygen():
    """Yield 5 until something else is passed back via send()"""
    a = 5
    while True:
        f = (yield a) #yield a and possibly get f in return
        if f is not None: 
            a = f  #store the new value

Sie können:

>>> g = mygen()
>>> g.next()
5
>>> g.next()
5
>>> g.send(7)  #we send this back to the generator
7
>>> g.next() #now it will yield 7 until we send something else
7

317



Wenn Sie nicht möchten, dass Leerzeichen zur Bezeichnung von Bereichen verwendet werden, können Sie den C-Stil {} verwenden, indem Sie Folgendes ausgeben:

from __future__ import braces

314



Das Schrittargument in Schichtoperatoren. Beispielsweise:

a = [1,2,3,4,5]
>>> a[::2]  # iterate over the whole list in 2-increments
[1,3,5]

Der Sonderfall x[::-1] ist ein nützliches Idiom für 'x reversed'.

>>> a[::-1]
[5,4,3,2,1]

305



Dekorateure

Dekorateure Lassen Sie eine Funktion oder Methode in eine andere Funktion einbinden, die Funktionen hinzufügen, Argumente oder Ergebnisse ändern kann. Sie schreiben Dekoratoren eine Zeile oberhalb der Funktionsdefinition, beginnend mit einem "at" -Zeichen (@).

Beispiel zeigt a print_args Dekorator, der die Argumente der verzierten Funktion vor dem Aufruf ausgibt:

>>> def print_args(function):
>>>     def wrapper(*args, **kwargs):
>>>         print 'Arguments:', args, kwargs
>>>         return function(*args, **kwargs)
>>>     return wrapper

>>> @print_args
>>> def write(text):
>>>     print text

>>> write('foo')
Arguments: ('foo',) {}
foo

289