为什么要使用lambda函数?

NoM*_*ots 64 python lambda

我可以找到很多东西向我展示lambda函数是什么,以及语法如何工作以及什么不是.但除了"酷感因素"(我可以在中间调用另一个函数,整齐!)我还没有看到过于令人信服的事情,说明为什么我真的需要/想要使用它们.

在我见过的大多数例子中,它似乎更像是一种风格或结构选择.并且有点打破了python规则中的"只有一种正确的做法".它如何使我的程序更正确,更可靠,更快速或更容易理解?(我见过的大多数编码标准都倾向于告诉你在单行上避免过于复杂的语句.如果它更容易阅读则将其分解.)

JAB*_*JAB 28

这是一个很好的例子:

def key(x):
    return x[1]

a = [(1, 2), (3, 1), (5, 10), (11, -3)]
a.sort(key=key)
Run Code Online (Sandbox Code Playgroud)

a = [(1, 2), (3, 1), (5, 10), (11, -3)]
a.sort(key=lambda x: x[1])
Run Code Online (Sandbox Code Playgroud)

从另一个角度来看:Lambda表达式也被称为"匿名函数",并且在某些编程范例中非常有用,特别是函数式编程,lambda演算提供了灵感.

http://en.wikipedia.org/wiki/Lambda_calculus

  • 不相关:你可以使用`operator.itemgetter(1)`而不是`lambda x:x [1]`. (7认同)
  • @JF Sebastian,是的,"operator.itemgetter",还有数以百计的其他简短函数,每个人都需要知道,每个特定用途 - 或者使用lambda,其中一个人可以创建一个通用表达式,而不必准确地回想起那个工作的哪个短功能._NOT_使用operator.itemgetter似乎很好地证明了lambda,正如OP所要求的那样. (3认同)
  • `operator`中的函数实际上比lambda函数快一百倍. (2认同)
  • @NoMore:直到你遇到一些更复杂的事情,例如 `lambda x: x[0]**2 + x[1]**2` (2认同)

Don*_*ner 17

在某些情况下,语法更简洁,主要是在处理map等人时.

map(lambda x: x * 2, [1,2,3,4])
Run Code Online (Sandbox Code Playgroud)

对我来说似乎比:

def double(x):
    return x * 2

map(double, [1,2,3,4])
Run Code Online (Sandbox Code Playgroud)

我认为在这种情况下lambda是一个更好的选择,因为它def double几乎与map使用它的情况断开了.另外,我猜它还有一个额外的好处,就是当你完成后该功能被抛弃了.

在我看来,lambda有一个缺点,它限制了它在Python中的用处:lambdas只能有一个表达式(即,你不能有多行).它只能用于强制空格的语言.

另外,每当我使用lambda时,我感觉很棒.

  • 在这种情况下,列表理解可能更合适`[x*2 for x in [1,2,3,4]]`. (8认同)
  • Guido关于多线lambdas和其他内容的博文:http://www.artima.com/weblogs/viewpost.jsp?thread = 147358 (4认同)
  • `map((2).__ mul __,[1,2,3,4])`. (4认同)
  • 我不知道 python(尽管它在我的学习列表中绝对名列前茅),所以我想知道......是否真的有充分的理由不允许 lambda 表达式使用多行?为什么 lambda 表达式的主体不能只是向右一个选项卡之类的? (2认同)
  • @incrediman - 此时lambda和函数之间没有区别 - 函数仍然是可以通过名称引用的对象,具有多行lambda将是def. (2认同)

Way*_*ner 11

Lambda函数在回调函数或需要一次性函数的地方最有用.JAB的例子很完美 - 最好伴随关键字参数key,但它仍然提供有用的信息.

什么时候

def key(x):
    return x[1]
Run Code Online (Sandbox Code Playgroud)

出现300行

[(1,2), (3,1), (5,10), (11,-3)].sort(key)
Run Code Online (Sandbox Code Playgroud)

钥匙做什么?真的没有任何迹象.您可能会有某种猜测,特别是如果您熟悉该功能,但通常需要回头看.OTOH,

[(1,2), (3,1), (5,10), (11,-3)].sort(lambda x: x[1])
Run Code Online (Sandbox Code Playgroud)

告诉你更多.

  1. Sort将函数作为参数
  2. 该函数需要1个参数(并"返回"结果)
  3. 我正在尝试按列表中每个元素的第二个值对此列表进行排序
  4. (如果列表是变量,因此您无法看到值),则此逻辑要求列表中至少包含2个元素.

可能还有一些信息,但是通过使用匿名lambda函数而不是命名函数,你已经获得了大量信息.

另外,它不会污染您的命名空间;)


Dav*_*vid 9

对我而言,这是代码表现力的问题.在编写人们必须支持的代码时,该代码应该以尽可能简洁易懂的方式讲述故事.有时lambda表达式更复杂,有时它更直接地告诉代码行或代码块在做什么.写作时要慎重.

可以把它想象成一个句子.重要的部分是什么(名词和动词与对象和方法等),以及如何为该行或代码块排序,以便直观地传达它所做的事情.

  • 这太棒了:“代码应该以尽可能简洁易懂的方式讲述一个故事......把它想象成构造一个句子......”——我将在我教的下一门课程中使用它,如果你不介意! (3认同)

Pio*_*ski 6

是的,你是对的 - 这是一个结构性的选择.通过使用lambda表达式,它可能不会使您的程序更正确.它也不会使它们更可靠,这与速度无关.

它只是关于灵活性和表达力.喜欢列表理解.你可以做大部分定义命名函数(可能污染命名空间,但这又是纯粹的风格问题).

它可以通过以下事实帮助实现可读性:您不必定义单独的命名函数,其他人必须查找,阅读和理解它所做的只是在其参数上调用方法blah().

当你使用它来编写创建和返回其他函数的函数时,它可能会更有趣,这些函数究竟是做什么的,取决于它们的参数.这可能是一种非常简洁易读的参数化代码行为方式.你可以表达更多有趣的想法.

但这仍然是一种结构性选择.你可以这样做.但是面向对象编程也是如此;)


jus*_*ody 5

暂时忽略它是我们正在讨论的特定匿名函数的细节.函数(包括匿名函数)在Python中是可分配的数量(几乎,但不是真正的值).一个表达式

map(lambda y: y * -1, range(0, 10))
Run Code Online (Sandbox Code Playgroud)

明确提到四个匿名量:-1,0,10和lambda运算符的结果,加上map调用的隐含结果.可以在某些语言中创建匿名类型的值.所以忽略功能和数字之间的表面差异.何时使用匿名函数而不是命名函数的问题类似于何时在代码中放置裸数字文字以及何时声明TIMES_I_WISHED_I_HAD_A_PONYBUFFER_SIZE事先声明的问题.有时候使用(数字,字符串或函数)文字是合适的,有时候命名这样的东西并通过它的名称引用它更合适.

见例如.艾伦·霍鲁布(Allen Holub)关于Java设计模式的挑衅,思想或愤怒的书; 他使用匿名课程相当多.


小智 5

Lambda 虽然在某些情况下很有用,但也有很大的滥用潜力。lambda 几乎总是使代码更难阅读。虽然将您的所有代码都放在一行中可能会让人感到满意,但对于下一个必须阅读您的代码的人来说,这会很糟糕。

直接来自 PEP8

“Guido 的一个重要见解是,代码的阅读频率远高于编写代码的频率。”


Uza*_*car 5

毫无疑问,滥用 lambda 函数通常会导致糟糕且难以阅读的代码。另一方面,如果使用得当,则会起到相反的作用。该线程中已经有很好的答案,但我遇到的一个例子是:

def power(n):
    return lambda x: x**n

square = power(2)
cubic = power(3)
quadruple = power(4)

print(square(10)) # 100
print(cubic(10)) # 1000
print(quadruple(10)) # 10000
Run Code Online (Sandbox Code Playgroud)

这种简化的情况可以用许多其他方式重写,而无需使用 lambda。尽管如此,我们仍然可以通过这个示例推断出 lambda 函数如何在可能更复杂的情况和函数中提高可读性和代码重用性。