【问题标题】:Passing a function and one of its arguments to another function in Python将函数及其参数之一传递给 Python 中的另一个函数
【发布时间】:2014-01-22 14:53:31
【问题描述】:

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

在 Matlab 中,这很简单:

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

我想知道 Python 中是否有类似的东西?我曾尝试在线搜索,但我对这个特定问题的英文措辞不是很熟悉,所以没有运气。

【问题讨论】:

标签: python function arguments


【解决方案1】:

lambda 适合这种情况。

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)

【讨论】:

    【解决方案2】:

    也可以用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 的回答中复制的函数 adder(我很懒 :))

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

    【讨论】:

    • 但是我们不能为不同的功能重用部分函数对象。 :)
    • @thefourtheye,在实际项目中很少需要如此灵活的包装器。
    【解决方案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. 我们可以动态决定调用哪个函数

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

    【讨论】:

      【解决方案4】:

      可以这么简单

      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")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        • 2013-11-19
        • 2012-08-02
        • 2010-10-22
        • 1970-01-01
        相关资源
        最近更新 更多