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

我确信有一些边缘情况可能需要它,但是考虑到它的模糊性,它在未来版本中被重新定义的可能性(我基于它的各种定义的假设)以及降低的编码清晰度——应该避免它吗?

这让我想起了C类型的溢出(缓冲区溢出)——指向顶部变量并重载以设置其他字段值。这感觉有点像技术人员的表演,但维护程序员的噩梦。


当前回答

我是一个python初学者,所以为了获得一个清晰的lambda概念,我将它与'for'循环进行了比较;在效率方面。 下面是代码(python 2.7) -

import time
start = time.time() # Measure the time taken for execution

def first():
    squares = map(lambda x: x**2, range(10))
    # ^ Lambda
    end = time.time()
    elapsed = end - start
    print elapsed + ' seconds'
    return elapsed # gives 0.0 seconds

def second():
    lst = []
    for i in range(10):
        lst.append(i**2)
    # ^ a 'for' loop
    end = time.time()
    elapsed = end - start
    print elapsed + ' seconds'
    return elapsed # gives 0.0019998550415 seconds.

print abs(second() - first()) # Gives 0.0019998550415 seconds!(duh)

其他回答

只是函数的一种奇特说法。除了它的名字,它没有什么晦涩、吓人或神秘的地方。当你读到下面这行,在脑海中用函数替换lambda:

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

它只是定义了一个关于x的函数。其他一些语言,比如R,显式地说:

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

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

函数这是一种非官僚化的创建函数的方法。

就是这样。例如,假设你有一个主要函数,需要对值平方。我们来看看传统的方法和的方法

传统的方法:

def main():
...
...
y = square(some_number)
...
return something

def square(x):
    return x**2

方式:

def main():
...
square = lambda x: x**2
y = square(some_number)
return something

看到区别了吗?

Lambda函数非常适合用于列表,比如列表推导式或映射。事实上,列表理解是一种使用lambda来表达自己的“python”方式。例:

>>>a = [1,2,3,4]
>>>[x**2 for x in a]
[1,4,9,16]

让我们看看每个语法元素的含义:

[]:“给我一个清单” X **2:“使用这个新诞生的函数” 对于a中的x: "into each element in a"

很方便吧?创建这样的函数。让我们用lambda重写它:

>>> square = lambda x: x**2
>>> [square(s) for x in a]
[1,4,9,16]

现在让我们使用map,这是同样的东西,但更语言中立。Maps有两个参数:

(i)一个功能

(ii)可迭代对象

给你一个列表,其中每个元素它是应用于可迭代对象的每个元素的函数。

使用map,我们会得到:

>>> a = [1,2,3,4]
>>> squared_list = map(lambda x: x**2, a)

如果你掌握了lambdas和映射,你将拥有以简洁的方式操作数据的强大能力。Lambda函数既不晦涩,也不影响代码的清晰性。不要把难的东西和新东西混为一谈。一旦你开始使用它们,你就会发现非常清楚。

我已经使用Python好几年了,我从来没有遇到过需要lambda的情况。实际上,正如教程所述,这只是语法糖。

我怀疑lambda不会消失。 请参阅Guido关于最终放弃尝试删除它的帖子。也请参阅冲突概要。

你可以看看这篇文章,了解更多Python函数特性背后的交易历史: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

奇怪的是,最初引入lambda和其他函数特性的map、filter和reduce函数在很大程度上已经被列表推导式和生成器表达式所取代。事实上,在Python 3.0中,reduce函数已从内置函数列表中删除。(但是,没有必要投诉lambda、map或filter的删除:它们被保留了。: -)

我个人的意见是:就清晰度而言,lambda值不了多少。通常有一个更清晰的不包含的解。

你说的是lambda表达式吗?就像

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函数可能是写出一些东西的最短方法。

Returning a function from another function >>> def transform(n): ... return lambda x: x + n ... >>> f = transform(3) >>> f(4) 7 This is often used to create function wrappers, such as Python's decorators. Combining elements of an iterable sequence with reduce() >>> reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9]) '1, 2, 3, 4, 5, 6, 7, 8, 9' Sorting by an alternate key >>> sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x)) [5, 4, 6, 3, 7, 2, 8, 1, 9]

我经常使用lambda函数。我花了一段时间来适应它们,但最终我明白了它们是语言中非常有价值的一部分。