在python中将函数作为参数传递

时间:2014-01-10 02:58:03

标签: python lambda

假设我想计算以下f(f(...f(x)..) 基本上很多次都是自身的功能。
目前我正在做以下事情来实现这个结果(并返回所有中间步骤):

def iterator(function, x, n=4):
    x = float(x)
    arr = []
    for i in range(n + 1):
        arr.append(x)
        x = function(x)

    return arr

def funcM(x):
    return x / 4 + 12

然后我将我的函数funcM作为参数传递:
print iterator(funcM, 100, 5)

这种方法没有错,计算是正确的。

但是有没有办法在不定义函数funcM的情况下做同样的事情? 可能是将lambda函数作为参数传递给迭代器函数(对不起,如果它没有意义,我真的不知道lambda函数是什么)。

2 个答案:

答案 0 :(得分:26)

lambda函数(或更准确地说,lambda 表达式)只是一个您可以在现场定义的函数,就在您需要的地方。例如,

f = lambda x: x * 2

完全相同
def f(x):
    return x * 2

当我准确地说,我的意思是 - 他们反汇编到相同的字节码。两者之间的唯一区别是第二个示例中定义的名称具有名称。

Lambda表达式变得有用,因为创建一个表达式不是一个声明,这意味着,正如其他人已经回答的那样,你可以做到

print iterator(lambda x: x / 4 + 12, 100, 5)

准确地得到你想要的东西。

然而,lambda表达式和常规函数之间的主要区别在于lambda更受限制。 Lambdas只能包含表达式,而不能包含语句。表达式是您可以放在=赋值右侧的任何内容。 (如果你想变得更迂腐,Python将表达式定义为http://docs.python.org/2/reference/expressions.html

这意味着lambda表达式无法赋值给变量(事实上,除了参数之外,它根本不能有局部变量)。它无法打印(除非它调用另一个功能)。它不能有for循环,while循环,if测试(除了三元运算符x if cond else y)或try / except块。

如果您需要执行其中任何操作,只需定义常规功能即可。事实上,只要你认为你想使用lambda,请三思而后行。如果您使用常规函数,代码不会更具可读性吗?那个lambda表达式不是你想在代码中的其他地方重用吗?

最后,总是做一些导致最易读和可维护的代码。 就性能而言,lambda和普通函数之间没有区别。

答案 1 :(得分:8)

是的,你可以使用lambda表达式。它们是为此而制造的。

iterator(lambda x: x/4+12, 100, 5)

来自docs的字词:

  

Lambda通常用于创建小型匿名函数。   实际上,它们只是定义函数的一种合成糖。该   上面的lambda表达式与您的函数完全相同   没有名字。

如果您想了解更多信息,请阅读以下内容:

http://www.diveintopython.net/power_of_introspection/lambda_functions.html
Why use lambda functions?