2014-01-22 162 views
6

我现在试图在Python中将多变量函数F(x, y, z)作为另一个函数G(F, x)的参数传递。正如所写的,函数G中的两个参数是函数F和F的变量x中的一个。换句话说,我试图做的不是将F作为一个三变量函数传递,而是将它作为一个仅依赖于x的单变量函数传递。 y和z值调用G.将函数及其参数之一传递给Python中的另一个函数

在Matlab中之前已经分配,​​这是简单地通过做:

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

我想知道是否有在Python类似的东西?我试图在网上搜索,但我不太熟悉这个问题的英文措辞,所以没有运气。

+0

G应该使用F的输出还是它自己执行F?这听起来像你要求的是'currying':http://mtomassoli.wordpress.com/2012/03/18/currying-in-python/ –

回答

3

您可以使用Python封锁和function currying technique做到这一点,像这样

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 

输出

35 
55 
100 
24 

优点:

  1. 我们可以动态d ecide要调用哪个函数

  2. 我们甚至可以在调用时更改默认参数。

1

它可能与此

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

,可能与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 

编辑来也做简单:

对不起,我忘记包含功能加法器复制(我懒:))从@ thefourtheye的回答

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

但我们不能重用部分函数对象,为不同的功能。 :) – thefourtheye

+0

@thefourtheye,你很少会在实际项目中需要这样一个灵活的包装。 – volcano

5

拉姆达适用于这种情况。

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) 
相关问题