![]() |
1
87
如果需要分配
然而,这个用例是非常罕见的。很少需要传递未命名的函数对象。
建筑材料
对于真正需要小函数对象的情况,应该使用
如果你还需要一些
所以,现实世界很好
|
![]() |
2
27
实际上,对我来说,有两个不同之处: 第一个问题是他们做了什么,返回了什么:
因此,如果需要调用一个接受函数对象的函数,在一行Python代码中实现这一点的唯一方法就是使用lambda。没有与DEF相同的功能。 在某些框架中,这实际上非常常见;例如,我使用 Twisted 做了很多这样的事
是相当常见的,与兰姆达斯更简洁。 第二个区别是关于允许实际函数做什么。
例如,
按预期工作,而
是语法错误。
当然,还有解决办法-替代
|
![]() |
3
19
In this interview, 吉多·范·罗森说他希望自己不要让“lambda”进入巨蟒:
imho,iambdas有时很方便,但通常以牺牲可读性为代价。你能告诉我这是干什么的吗?
我写了它,花了我一分钟才弄明白。这是来自Project Euler的-我不会说哪个问题,因为我讨厌扰流器,但它只运行0.124秒:) |
![]() |
4
9
对于n=1000,有时需要调用一个函数与lambda:
|
![]() |
5
6
我同意Nosklo的建议:如果需要为函数命名,请使用
|
![]() |
6
5
性能:
使用创建函数
可读性: 对于大多数Python用户来说,lambda函数的可读性稍差,但在某些情况下,它也更简洁。考虑从使用非功能例行程序转换为功能例行程序:
如你所见,
局限性:
一致性:
python主要避免使用函数式编程约定,而支持过程性和简单的目标语义。这个
现有功能:
正如其他人所指出的,许多
在许多情况下,使用预先存在的函数可以使代码更具可读性。 肾盂原理:应该有一个,最好只有一个明显的方法。
类似于
single source of truth
教条。不幸的是,一个显而易见的实现IT原则的方法始终是对Python的渴望,而不是一个真正的指导原则。考虑一下Python中非常强大的数组理解。它们在功能上等同于
这是一个意见问题,但我想说的是,在Python语言中,任何用于一般用途的东西,如果不明显地破坏任何东西,都是“蟒蛇式的”足够了。 |
![]() |
7
3
lambda的主要用途总是用于简单的回调函数,以及用于map、reduce、filter,后者需要一个函数作为参数。当列表理解成为规范时,允许添加如下内容:
很难想象在日常使用中使用lambda的真实情况。因此,我会说,避免使用lambda并创建嵌套函数。 |
![]() |
8
3
lambda的一个重要限制是它们不能包含除表达式之外的任何内容。lambda表达式几乎不可能产生除小的副作用以外的任何东西,因为它不能有像
这就是说,Lua影响了我的编程风格,使我对匿名函数的广泛使用产生了影响,我把代码丢在了它们上面。除此之外,我倾向于将map/reduce看作抽象的操作符,在某种程度上,我不考虑列表理解或生成器,就好像我使用这些操作符显式地推迟了一个实现决策。 编辑: 这是一个相当古老的问题,我对这件事的看法有所改变。
首先,我对分配
|
![]() |
9
3
虽然同意其他答案,但有时它更具可读性。下面是一个例子
我发现它比创建一个
|
![]() |
10
2
我发现的一种羊羔肉的用途…在调试消息中。 因为lambda可以被懒散地评估,所以您可以使用如下代码:
而不是昂贵的:
它处理格式字符串,即使调试调用由于当前日志记录级别而不生成输出。 当然,要使它按描述工作,正在使用的日志模块必须支持lambda作为“惰性参数”(正如我的日志模块所做的那样)。 同样的想法也可以应用于任何其他延迟评估的情况,以创建随需应变的内容价值。 例如,此自定义三元运算符:
而不是:
使用lambda时,只计算由条件选择的表达式,而不使用lambda时,两者都将被计算。 当然,您可以简单地使用函数而不是lambda,但是对于短表达式,lambda更精简(c)。 |
![]() |
11
2
与正则函数相比,使用lambda有一个优点(它们是在表达式中创建的),还有几个缺点。因此,我更喜欢使用
第一点-它们是同一类型的物体lambda产生的对象类型与正则函数相同
因为lambda是函数,所以它们是一流的对象。 lambda和函数:
但默认情况下,lambda缺少一些函数通过完整函数定义语法获得的东西。
兰巴的
|
![]() |
12
1
如果您只想将lambda分配给本地作用域中的变量,那么您也可以使用def,因为它更可读,将来更容易扩展:
或
|
![]() |
13
0
我同意Nosklo。顺便说一下,即使有 使用一次,扔掉 函数,大多数时候您只想使用来自操作员模块的某些内容。 例如: 您有一个带有这个签名的函数:myfunction(数据,回调函数)。 您希望传递一个添加2个元素的函数。 使用lambda:
蟒蛇之道:
当然,这是一个简单的例子,但是操作员模块提供了很多东西,包括list和dict的items setters/getter。真的很酷。 |
![]() |
14
0
考虑到一个简单的例子,
|
![]() |
15
-1
lambda可用于生成新函数:
|
![]() |
16
-1
一个主要的区别是你不能使用
因此,我建议将lambda的使用保留在这种琐碎的操作中,这也不会真正受益于通过命名函数提供的自动文档。 |
![]() |
Hard_Course · 用另一列中的值替换行的最后一个非NA条目 5 月前 |
![]() |
KGB91 · 初始化一个用C存储函数的字典# 6 月前 |
![]() |
RobertF · 如何将函数应用于矩阵的每个元素? 7 月前 |
![]() |
user2986042 · C编译错误“调用的对象不是函数或函数指针” 11 月前 |