3 回答
TA贡献1840条经验 获得超5个赞
如果需要将分配lambda
给名称,请改用a def
。def
s只是分配的语法糖,因此结果是相同的,并且它们更具灵活性和可读性。
lambda
s只能使用一次,丢弃没有名称的函数。
但是,这种用例很少见。您很少需要传递未命名的函数对象。
内建函数map()
和filter()
需要函数对象,但是列表理解和生成器表达式通常比那些函数更具可读性,并且可以覆盖所有用例,而无需使用lambda。
对于情况下,你真的需要一个小的函数对象,你应该使用operator
模块的功能,如operator.add
代替lambda x, y: x + y
如果您仍然需要一些lambda
未涵盖的内容,则可以考虑编写def
,以提高可读性。如果功能比operator
模块中的功能更复杂,则a def
可能更好。
因此,现实世界中的好用lambda
例非常少见。
TA贡献1845条经验 获得超8个赞
实际上,对我来说有两个区别:
首先是关于他们做什么以及他们返回什么:
def是不返回任何内容并在本地名称空间中创建“名称”的关键字。
lambda是一个关键字,它返回一个函数对象,并且不在本地名称空间中创建“名称”。
因此,如果需要调用带有函数对象的函数,则在一行python代码中执行此操作的唯一方法是使用lambda。def没有等效功能。
在某些框架中,这实际上是很常见的。例如,我经常使用Twisted,
d.addCallback(lambda result: setattr(self, _someVariable, result))
是很常见的,并且对lambda更为简洁。
第二点区别是允许实际执行的功能。
用'def'定义的函数可以包含任何python代码
用“ lambda”定义的函数必须求值为表达式,因此不能包含诸如print,import,raise,...之类的语句。
例如,
def p(x): print x
如预期般运作
lambda x: print x
是一个SyntaxError。
当然,也有变通方法-代替print用sys.stdout.write,或import用__import__。但是通常情况下,最好还是使用一个函数。
TA贡献1824条经验 获得超8个赞
Guido van Rossum 在这次采访中说,他希望自己不要让“ lambda”进入Python:
“ 问:您最不满意Python的什么功能?
有时候我接受捐助太快了,后来才意识到这是一个错误。一个例子就是一些函数式编程功能,例如lambda函数。lambda是一个关键字,使您可以创建一个小的匿名函数;诸如map,filter和reduce的内置函数可以在序列类型(如列表)上运行该函数。
在实践中,结果并非如此。Python只有两个范围:本地和全局。这使编写lambda函数很痛苦,因为您经常想在定义了lambda的作用域中访问变量,但由于这两个作用域而不能。有办法解决这个问题,但这有点不合时宜。通常,在Python中仅使用for循环而不是搞乱lambda函数似乎容易得多。只有当已有内置功能可以满足您的需求时,地图和朋友才能正常工作。
恕我直言,Iambdas有时可能很方便,但是通常以可读性为代价很方便。你能告诉我这是怎么做的:
str(reduce(lambda x,y:x+y,map(lambda x:x**x,range(1,1001))))[-10:]
我写了它,花了我一分钟才弄清楚。这是来自欧拉计划-我不会说哪个问题,因为我讨厌剧透,但是它只需要0.124秒即可:)
添加回答
举报