假设我想计算以下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函数是什么)。
答案 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?