为什么 Python Lambda 有用?

我正在尝试找出 Python lambda。 lambda 是在现实生活中应该被遗忘的那些 “有趣” 语言项目之一吗?

我敢肯定,在某些情况下可能需要使用它,但是鉴于它的晦涩之处,在将来的发行版中重新定义了它的潜力(根据各种定义我的假设)以及降低的编码清晰度 - 是否应该被避免?

这让我想起了 C 类型的溢出(缓冲区溢出)- 指向顶部变量,并通过重载来设置其他字段值。感觉像是技术娴熟的演艺风格,但却是维护编码员的噩梦。

答案

lambda x: x**2 + 2*x - 5
mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])
def filterfunc(x):
    return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])
mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]
>>> f = lambda x: x + 1
>>> f(3)
4
> f = function(x) { x + 1 }
> f(3)
4

两行摘要:

  1. 闭包 :非常有用。学习他们,使用他们,爱他们。
  2. Python 的lambda关键字:不必要,偶尔有用。如果您发现要使用它进行远程复杂的操作,则将其收起并定义一个真正的功能。

Lambda 是非常重要的抽象机制的一部分,该机制处理高阶函数。为了正确理解其价值,请观看Abelson 和 Sussman 的高质量课程,并阅读SICP

这些是现代软件业务中的相关问题,并且变得越来越流行。

我怀疑 lambda 会消失。有关最终放弃尝试删除它的信息,请参见Guido 的文章 。另请参阅冲突概述

您可以查看此帖子,以获得有关 Python 功能特性背后交易的更多历史记录: http : //python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

奇怪的是,最初促使引入 lambda 和其他功能特征的 map,filter 和 reduce 功能在很大程度上已被列表理解和生成器表达式所取代。实际上,reduce 函数已从 Python 3.0 中的内置函数列表中删除。 (但是,没有必要发送有关删除 lambda,地图或过滤器的投诉:它们正在留下。:-)

我自己的 2 美分:就清晰程度而言,lambda 很少值得。通常,有一个更清晰的解决方案,其中不包含 lambda。

for value in ["one","two","three"]:
    b = tk.Button(label=value, command=lambda arg=value: my_callback(arg))
    b.pack()
a = lambda x: x + 1
print a(1)
def a(x): return x + 1
print a(1)
>>> a = lambda x: x + 1
>>> type(a)
<type 'function'>
>>> n = 4
>>> [i + n for i in range(10)]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
w = PyQt4.QtGui.QLineEdit()
w.textChanged.connect(lambda event: dothing())
plural_rules = [
    lambda n: 'all',
    lambda n: 'singular' if n == 1 else 'plural',
    lambda n: 'singular' if 0 <= n <= 1 else 'plural',
    ...
]
# Call plural rule #1 with argument 4 to find out which sentence form to use.
plural_rule[1](4) # returns 'plural'

使用lambda几乎可以做的任何事情,使用命名函数或列表和生成器表达式都可以做得更好。

因此,在大多数情况下,您基本上只应该是在任何情况下都可以选择的一种(可能不是交互式解释器中编写的草稿代码)。

我已经使用 Python 几年了,但从未遇到过需要 lambda 的情况。确实,如本教程所述,它仅用于语法糖。