1416 Stimmen

Versteckte Funktionen von Python

339voto

Jason Baker Punkte 180981

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" bedeutet, und diesen durch die gewünschte veränderliche Variable ersetzen:

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

39 Stimmen

Das ist definitiv eine der unangenehmen versteckten Funktionen. Das ist mir auch schon ab und zu begegnet.

77 Stimmen

Ich fand dies viel einfacher zu verstehen, als ich erfuhr, dass die Standardargumente in einem Tupel enthalten sind, das ein Attribut der Funktion ist, z. B. foo.func_defaults . Da es sich um ein Tupel handelt, ist es unveränderlich.

0 Stimmen

Könnten Sie im Detail erklären, wie das geschieht?

316voto

Rafał Dowgird Punkte 40450

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

0 Stimmen

Einverstanden. Betrachten wir dies als ein böses Beispiel für eine versteckte Funktion von Python :)

89 Stimmen

In anderen Sprachen wird dieses magische Gerät "Variable" genannt.

5 Stimmen

Coroutines sollten Coroutines sein und Genenerator sollten auch sie selbst sein, ohne sich zu vermischen. Megatoller Link und Vortrag und Beispiele dazu hier: dabeaz.com/koroutinen

312voto

eduffy Punkte 37562

Wenn Sie die Verwendung von Leerzeichen zur Kennzeichnung von Bereichen nicht mögen, können Sie den C-Stil {} verwenden, indem Sie den Befehl ausgeben:

from __future__ import braces

122 Stimmen

Das ist böse. :)

37 Stimmen

>>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance :P

0 Stimmen

Moment, ist das Zukunftspaket nicht eine zukünftige Ergänzung der Sprache? Planen sie also, irgendwann einmal Klammern hinzuzufügen?

305voto

Rafał Dowgird Punkte 40450

Das Schritt-Argument in Slice-Operatoren. Zum Beispiel:

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

Der Sonderfall x[::-1] ist eine nützliche Redewendung für 'x umgekehrt'.

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

31 Stimmen

Viel klarer ist meiner Meinung nach die Funktion reversed(). >>> list(reversed(range(4))) [3, 2, 1, 0]

3 Stimmen

Wie kann man dann "this i a string"[::-1] besser schreiben? umgekehrt scheint nicht zu helfen

2 Stimmen

"".join(reversed("this i a string"))

288voto

rlerallut Punkte 7067

Die for...else-Syntax (siehe http://docs.python.org/ref/for.html )

for i in foo:
    if i == 0:
        break
else:
    print("i was never 0")

Der "else"-Block wird normalerweise am Ende der for-Schleife ausgeführt, es sei denn, die Pause wird aufgerufen.

Der obige Code könnte wie folgt emuliert werden:

found = False
for i in foo:
    if i == 0:
        found = True
        break
if not found: 
    print("i was never 0")

219 Stimmen

Ich denke, die for/else-Syntax ist umständlich. Es "fühlt" sich so an, als sollte die else-Klausel ausgeführt werden, wenn der Schleifenkörper nie ausgeführt wird.

0 Stimmen

Es wird weniger unangenehm, wenn wir es als for/if/else betrachten, wobei das else zum if gehört. Und es ist eine so nützliche Redewendung, dass ich mich wundere, dass andere Sprachdesigner nicht darauf gekommen sind!

14 Stimmen

Ah. Das habe ich noch nie gesehen! Aber ich muss sagen, dass es ein wenig falsch bezeichnet ist. Wer würde erwarten, dass der else-Block nur ausgeführt wird, wenn break nie ausgeführt wird? Ich stimme mit codeape überein: Es sieht so aus, als ob else für leere Foos eingegeben wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X