2014-01-22 9 views
6

Ich versuche jetzt, eine multi-variable Funktion F(x, y, z) als Argument einer anderen Funktion G(F, x) in Python übergeben. Wie geschrieben, sind die zwei Argumente in der Funktion G die Funktion F und eine von Fs Variablen x. Mit anderen Worten, was ich versuche, statt F als eine Funktion mit drei Variablen zu übergeben, würde ich es lieber als eine einzige variable Funktion übergeben, die nur von x abhängt. Die Werte von y und z sind bereits vor G.Übergeben einer Funktion und eines seiner Argumente an eine andere Funktion in Python

In Matlab Aufruf zugewiesen, geschieht dies einfach durch:

G((@x) F(x, y, z)); 

Ich frage mich, ob es etwas ähnliches in Python ist? Ich habe versucht, online zu suchen, aber ich bin nicht sehr vertraut mit der englischen Formulierung für diese spezielle Frage, also kein Glück.

+0

Soll G den Ausgang von F verwenden, oder führt er F alleine aus? Es klingt wie das, was Sie fragen, heißt "currying": http://mtomassoli.wordpress.com/2012/03/18/currying-in-python/ –

Antwort

3

Sie können es mit Python Verschlüsse tun und function currying technique, wie diese

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

def wrapper_g(y, z): 
    def g(f, x, y = y, z = z): 
     return f(x, y, z) # By closure property, `f` accesses `y` and `z` 
    return g 

g = wrapper_g(5, 10)  # We are creating `g` with default parameters 5 and 10 
print g(adder, 20)   # along with the third parameter 20, adder is called. 
print g(adder, 40)   # along with the third parameter 40, adder is called. 
print g(multiplier, 2)  # We can pass any function, which can act on 2 params. 
print g(multiplier, 2, y = 3, z = 4) # We can dynamically alter the default param 

Ausgabe

35 
55 
100 
24 

Vorteile:

  1. Wir können dynamisch d ecide welche Funktion aufgerufen werden soll

  2. Wir können sogar die Standardparameter ändern, während Sie anrufen.

1

Es kann so einfach sein wie das

def F(x,y,z): 
    print "x=",x 
    print "y=",y 
    print "z=",z 

def G(func,x): 
    func(x,"G's Y", "G's Z") 

G(F,"Main's X") 
5

Es kann auch mit functools.partial

In [158]:from functools import partial 

In [159]: adder_w = partial(adder, y=5, z=10) 

In [160]: adder_w(2) 
Out[160]: 17 

EDIT erfolgen:

Sorry, ich habe vergessen, Funktion Addierer zu kopieren (Ich bin faul :)) aus der @ thefourtheye die Antwort

def adder(x, y, z): 
    return x + y + z 
+0

Aber wir können das Teilfunktionsobjekt nicht für verschiedene Funktionen wiederverwenden . :) – thefourtheye

+0

@thefourtheye, es ist selten, dass Sie eine solche flexible Wrapper in realen Projekten brauchen. – volcano

5

Lambda ist für diese Situation geeignet.

def G(func, x): 
    return func(x) 

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

print G(lambda x: F(x, 1, 2), 3) 
Verwandte Themen