lambda - 为什么Python lambda很有用?

  显示原文与译文双语对照的内容

我正试着找出 python lambda 。 lambda是那些在现实生活中应该被遗忘的'有趣'语言项目?

我肯定有一些边缘的情况下它可能是必要的,但考虑到默默无闻,它在将来的版本中被重新定义( 我的假设基于它的各种定义)的潜力和减少编码清晰——它应该避免?

这提醒我溢出( 缓冲区溢出) 类型- 指向顶部变量和重载来设置其他字段值。 它感觉像是一种技术技巧,但维护编码器的噩梦。

时间:

你是在谈论lambda函数? 像


f = lambda x: x**2 + 2*x - 5

那些东西实际上非常有用。 python 支持一种叫做函数编程的编程风格,你可以通过它将函数传递给其他函数来做事情。 例如:


mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])

mult3 设置为 [3, 6, 9],原始列表的那些元素是 3的倍数。 这比( 而且,人们可以争论到) 短


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]

( 甚至作为 range(3,10,3) ),但还有其他情况,比如从其他函数中构造函数作为返回值的返回值,而lambda函数可能是编写某些内容的最短方法。 像


def transform(n):
 return lambda x: x + n
f = transform(3)
f(4) # is 7

我经常使用lambda函数。 花了一段时间才习惯了它们,但是一旦我很高兴 python 拥有了它们;

lambda是一个非常重要的抽象机制的一部分,它处理高阶函数。 要正确理解它的值,请从 Abelson和 Sussman 中观看高质量的课程,并阅读组件

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

lambda 只是一种简单的方式来表达 function 。 除了它的名字之外,它没有什么晦涩,intimidating或者晦涩的东西。 当你阅读以下代码行时,将 lambda 替换为 function:


>>> f = lambda x: x + 1
>>> f(3)
4

它只是定义了一个 x 函数。 一些其他语言,如 R,明确地说:


> f = function(x) { x + 1 }
> f(3)
4

你看到了这是编程中最自然的事情之一。

two-line摘要:

  1. 闭包: 非常有用。 学习,使用他们,爱他们。
  2. lambda python 关键字:不必要的,偶尔有用的。 如果你发现自己做了任何复杂的事情,把它放在一边,定义一个真正的函数。

我怀疑lambda不会离开。 参见博文的博文,最后放弃尝试删除它。 还请参见的冲突列表大纲。

你可以查看这篇文章,了解关于 python 功能功能背后的交易的更多历史: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

奇怪的是,最初激发lambda和其他功能特性的映射,过滤器和reduce函数在很大程度上被列表理解和生成器表达式所取代。 实际上,reduce函数已经从 python 3.0中的内置函数列表中删除。 ( 但是,不需要发送关于删除 lambda,映射或者过滤器的投诉: 他们正在逗留。: - )

我自己的两个百分点:很少是lambda值,只要清晰。 通常有一个更清晰的解决方案不包括 lambda 。

lambda在GUI编程中非常有用。 例如假设你正在创建一组按钮,而你希望使用单个paramaterized回调而不是每个按钮的唯一回调。 Lambda让你轻松完成:


for value in ["one","two","three"]:
 b = tk.Button(label=value, command=lambda arg=value: my_callback(arg))
 b.pack()

另一种方法是为每个按钮创建一个单独的回调,从而导致重复的代码。

几乎任何你能用 lambda 做你能做的更好的命名函数或列表和生成器表达式。

因此,在大多数情况下,你应该仅仅在任何情况下都是( 除了在交互式解释器中编写的代码) 。

我发现lambda对于一个函数的列表是有用的,但对于不同的情况。 像 mozilla复数规则


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'

如果你必须为所有你疯狂的人定义一个函数。 同样,对于 plural_rule_1,plural_rule_2,等等 等函数名也不很好,当你依赖于变量函数标识时,你需要 eval() 。

我无法对lambda实现的特殊实现进行讨论,但是一般lambda函数是非常方便的。 他们的核心技术( 甚至是技术) 函数式编程,同时他们也非常 useuful object-oriented项目。 对于某些类型的问题,它们是最好的解决方案,所以当然不应该被遗忘 !

我建议你阅读闭包映射 function (that links to python docs, but it exists in nearly every language that supports functional constructs),了解为什么它是有用的。

...