首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >lambda函数和嵌套函数('def')哪个更好用?

lambda函数和嵌套函数('def')哪个更好用?
EN

Stack Overflow用户
提问于 2008-09-25 17:15:03
回答 16查看 79.8K关注 0票数 121

我主要使用lambda函数,但有时也使用似乎提供相同行为的嵌套函数。

这里有一些简单的例子,如果在另一个函数中找到了其中一个,它们在功能上会做同样的事情:

Lambda函数

代码语言:javascript
复制
>>> a = lambda x : 1 + x
>>> a(5)
6

嵌套函数

代码语言:javascript
复制
>>> def b(x): return 1 + x

>>> b(5)
6

使用一种比使用另一种有什么优势吗?(性能?可读性?限制?一致性?等)

这有什么关系吗?如果不是,那是不是违反了Pythonic原理:

There should be one-- and preferably only one --obvious way to do it.

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2008-09-25 17:16:31

如果需要将lambda分配给名称,请改用defdef只是赋值的语法糖,所以结果是一样的,而且它们更灵活,可读性更好。

lambda%s可以使用一次,丢弃没有名称的函数。

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

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

对于确实需要小函数对象的情况,应该使用operator模块函数,如operator.add,而不是lambda x, y: x + y

如果您仍然需要一些未涵盖的lambda,您可以考虑编写一个def,只是为了更具可读性。如果函数比operator模块中的函数更复杂,那么def可能更好。

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

票数 126
EN

Stack Overflow用户

发布于 2008-09-26 10:20:43

实际上,对我来说有两点不同:

第一个是关于他们做了什么和他们返回了什么:

因此,如果您需要调用一个接受function对象的函数,在一行python代码中唯一的方法就是使用lambda。def没有等价物。

在一些框架中,这实际上是很常见的;例如,我经常使用Twisted,所以做类似这样的事情

代码语言:javascript
复制
d.addCallback(lambda result: setattr(self, _someVariable, result))

是很常见的,在lambdas中更简洁。

第二个不同之处在于允许实际函数做什么。

  • 使用'def‘定义的函数可以包含任何python代码
  • 使用'lambda’定义的函数必须计算为表达式,因此不能包含print,import,raise,...

等语句

例如,

代码语言:javascript
复制
def p(x): print x

按预期工作,而

代码语言:javascript
复制
lambda x: print x

是一个SyntaxError。

当然,也有变通的办法--用sys.stdout.write代替print,或者用__import__代替import。但在这种情况下,通常你最好使用一个函数。

票数 35
EN

Stack Overflow用户

发布于 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有时会很方便,但通常是以可靠性为代价的。你能告诉我这是做什么的吗:

代码语言:javascript
复制
str(reduce(lambda x,y:x+y,map(lambda x:x**x,range(1,1001))))[-10:]

这是我写的,我花了一分钟才弄明白。这是来自Project Euler的-我不会说是哪个问题,因为我讨厌剧透,但它在0.124秒内运行:)

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/134626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档