Python:将带参数的函数作为参数传递

28
def lite(a,b,c):
    #...

def big(func): # func = callable()
    #...


#main
big(lite(1,2,3))

如何做到这一点?
以哪种方式将带参数的函数传递给另一个函数?

4个回答

44

为什么不这样做:

big(lite, (1, 2, 3))

你可以这样做:

def big(func, args):
    func(*args)

5
你甚至可以执行big(lite, 1, 2, 3)def big(func, *args): func(*args) - Anurag Uniyal
1
如果您能够(并且愿意)更改 big,并且 lite 具有固定的签名,那就很好。但是通常一个或两个都是外部的。在这种情况下,Teddy 的方法(partial)更加通用。 - Mark

13
import functools

#main
big(functools.partial(lite, 1,2,3))

有点柯里化也没什么坏处! - Vasantha Ganesh

5

通常有两种解决类似问题的方法:

  1. 使用lambda表达式...但是传递的函数将期望一个参数,因此需要更改big()函数。
  2. 使用调用带有参数的原始函数的命名函数。请注意,这样的函数可以在其他函数内声明,并且参数可以是变量。

例如:

#!/usr/bin/python

def lite(a,b,c):
    return "%r,%r,%r" % (a,b,c)

def big(func): # func = callable()
    print func()

def big2(func): # func = callable with one argument
    print func("anything")


def main():
    param1 = 1
    param2 = 2
    param3 = 3

    big2(lambda x: lite(param1, param2, param3))

    def lite_with_params():
        return lite(param1,param2,param3)

    big(lite_with_params)

main()

0

不要这样做,你正在传递太大的lite()函数返回值。

你应该这样做:

def lite(a, b, c):
    return a + b + c

def big(func, arg):
    print func(arg[0], arg[1], arg[2])



big(lite, (1, 2, 3))

这就是元组解包的用途 - 请查看我的答案。 - Skilldrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接