我主要使用lambda函数,但有时也使用似乎提供相同行为的嵌套函数。
这里有一些简单的例子,如果在另一个函数中找到了其中一个,它们在功能上会做同样的事情:
Lambda函数
>>> a = lambda x : 1 + x
>>> a(5)
6
嵌套函数
>>> def b(x): return 1 + x
>>> b(5)
6
使用一种比使用另一种有什么优势吗?(性能?可读性?限制?一致性?等)
这有什么关系吗?如果不是,那是不是违反了Pythonic原理:
There should be one-- and preferably only one --obvious way to do it.,
发布于 2008-09-25 17:16:31
如果需要将lambda
分配给名称,请改用def
。def
只是赋值的语法糖,所以结果是一样的,而且它们更灵活,可读性更好。
lambda
%s可以使用一次,丢弃没有名称的函数。
但是,这种用例非常少见。您很少需要传递未命名的函数对象。
内置的map()
和filter()
需要函数对象,但是列表理解和生成器表达式通常比这些函数更具可读性,并且可以涵盖所有用例,而不需要lambda。
对于确实需要小函数对象的情况,应该使用operator
模块函数,如operator.add
,而不是lambda x, y: x + y
如果您仍然需要一些未涵盖的lambda
,您可以考虑编写一个def
,只是为了更具可读性。如果函数比operator
模块中的函数更复杂,那么def
可能更好。
因此,现实世界中好的lambda
用例非常少见。
发布于 2008-09-26 10:20:43
实际上,对我来说有两点不同:
第一个是关于他们做了什么和他们返回了什么:
因此,如果您需要调用一个接受function对象的函数,在一行python代码中唯一的方法就是使用lambda。def没有等价物。
在一些框架中,这实际上是很常见的;例如,我经常使用Twisted,所以做类似这样的事情
d.addCallback(lambda result: setattr(self, _someVariable, result))
是很常见的,在lambdas中更简洁。
第二个不同之处在于允许实际函数做什么。
等语句
例如,
def p(x): print x
按预期工作,而
lambda x: print x
是一个SyntaxError。
当然,也有变通的办法--用sys.stdout.write
代替print
,或者用__import__
代替import
。但在这种情况下,通常你最好使用一个函数。
发布于 2008-09-25 17:29:26
In this interview, Guido van Rossum表示,他希望自己没有让“lambda”成为Python:
"Q。你对Python的什么特性最不满意?有时候我接受贡献太快了,后来意识到这是一个错误。一个例子是一些函数式编程特性,比如lambda函数。lambda是一个关键字,它允许您创建一个小型匿名函数;诸如map、filter和reduce等内置函数在序列类型(如列表)上运行函数。在实践中,它并没有得到很好的结果。Python只有两个作用域:本地和全局。这使得编写lambda函数很痛苦,因为您通常希望访问定义lambda的作用域中的变量,但由于这两个作用域,您无法访问。有一种方法可以绕过这一点,但这是一种杂乱无章的东西。通常,在Python中使用for循环要比使用lambda函数简单得多。只有当已经有一个内置的函数可以做你想做的事情时,地图和朋友才能很好地工作。
IMHO,Iambdas有时会很方便,但通常是以可靠性为代价的。你能告诉我这是做什么的吗:
str(reduce(lambda x,y:x+y,map(lambda x:x**x,range(1,1001))))[-10:]
这是我写的,我花了一分钟才弄明白。这是来自Project Euler的-我不会说是哪个问题,因为我讨厌剧透,但它在0.124秒内运行:)
https://stackoverflow.com/questions/134626
复制相似问题