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

Sal*_*ali 22 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Max*_*oel 33

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

f = lambda x: x * 2
Run Code Online (Sandbox Code Playgroud)

完全一样的

def f(x):
    return x * 2
Run Code Online (Sandbox Code Playgroud)

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

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

print iterator(lambda x: x / 4 + 12, 100, 5)
Run Code Online (Sandbox Code Playgroud)

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

然而,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和普通函数之间没有区别.

  • 请注意,在 Python 3 中打印不是问题,因为 `print` 已更改为函数。 (2认同)

aIK*_*Kid 8

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

iterator(lambda x: x/4+12, 100, 5)
Run Code Online (Sandbox Code Playgroud)

来自文档的单词:

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

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

http://www.diveintopython.net/power_of_introspection/lambda_functions.html
为什么要使用lambda函数?