为了账号安全,请及时绑定邮箱和手机立即绑定

使用哪个更优选:lambda函数或嵌套函数('def')?

使用哪个更优选:lambda函数或嵌套函数('def')?

Helenr 2019-12-25 11:00:43
我主要使用lambda函数,但有时使用似乎提供相同行为的嵌套函数。这是一些琐碎的示例,如果在另一个函数中找到它们,它们在功能上会做同样的事情:Lambda函数>>> a = lambda x : 1 + x>>> a(5)6嵌套功能>>> def b(x): return 1 + x>>> b(5)6使用一个相对于另一个有优势吗?(性能?可读性?局限性?一致性?等)
查看完整描述

3 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

如果需要将分配lambda给名称,请改用a defdefs只是分配的语法糖,因此结果是相同的,并且它们更具灵活性和可读性。

lambdas只能使用一次,丢弃没有名称的函数。

但是,这种用例很少见。您很少需要传递未命名的函数对象。

内建函数map()filter()需要函数对象,但是列表理解生成器表达式通常比那些函数更具可读性,并且可以覆盖所有用例,而无需使用lambda。

对于情况下,你真的需要一个小的函数对象,你应该使用operator模块的功能,如operator.add代替lambda x, y: x + y

如果您仍然需要一些lambda未涵盖的内容,则可以考虑编写def,以提高可读性。如果功能比operator模块中的功能更复杂,则a def可能更好。

因此,现实世界中的好用lambda例非常少见。


查看完整回答
反对 回复 2019-12-25
?
精慕HU

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__。但是通常情况下,最好还是使用一个函数。


查看完整回答
反对 回复 2019-12-25
?
有只小跳蛙

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秒即可:)


查看完整回答
反对 回复 2019-12-25
  • 3 回答
  • 0 关注
  • 507 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信