2012-10-08 16 views
13

Wenn eine Funktion n Anzahl von Argumenten nimmt, und es gibt eine andere Funktion, die eine Sequenz mit n Anzahl von Elementen (oder ich habe eine Sequenz mit n Anzahl von Elementen), gibt es eine Möglichkeit, "Karte" Diese beiden Funktionen (oder machen die erste Funktion nehmen eine Sequenz von n Anzahl von Elementen als Eingabe und Ergebnis zurückgeben) Ich will (und vielleicht in einigen Fällen nicht), um die Funktion selbst zu bearbeiten und ändern Sie die Argumente Parameter und zurück Werttypen.entpacken Funktion Argument

d.h)

def func1(x, y, z): 
    return x+y+z 

def func2(w): 
    return [i for i in range(w,w+3)] 

kippe func1(func2(...)) in diesem Fall.

Antwort

14

Sie suchen die *args Argument Syntax:

>>> def foo(bar, baz, spam): 
...  print bar, baz, spam 
... 
>>> arguments = [1, 2, 3] 
>>> foo(*arguments) 
1, 2, 3 

Wenn Argumente an einem aufrufbare vorbei, jeder Ausdruck von einem asterix * voraus, als eine Folge von Positionsargumenten interpretiert wird, und übergeben wird erweitert auf als separate Argumente für das aufgerufene Objekt (Funktion, Methode, etc.).

Für Ihr Beispiel wäre das:

func1(*func2(...)) 

Es ist ein Schlüsselwort, äquivalent mit ** Doppel asterixes (nimmt eine Abbildung), und Sie können die gleiche Syntax in Funktion Signaturen verwenden.

Siehe die documentation on call expressions, und für die Funktion Signatur Spiegelsyntax, die documentation on function definitions.