我可以找到很多东西向我展示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
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时,我感觉很棒.
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)
告诉你更多.
可能还有一些信息,但是通过使用匿名lambda函数而不是命名函数,你已经获得了大量信息.
另外,它不会污染您的命名空间;)
对我而言,这是代码表现力的问题.在编写人们必须支持的代码时,该代码应该以尽可能简洁易懂的方式讲述故事.有时lambda表达式更复杂,有时它更直接地告诉代码行或代码块在做什么.写作时要慎重.
可以把它想象成一个句子.重要的部分是什么(名词和动词与对象和方法等),以及如何为该行或代码块排序,以便直观地传达它所做的事情.
是的,你是对的 - 这是一个结构性的选择.通过使用lambda表达式,它可能不会使您的程序更正确.它也不会使它们更可靠,这与速度无关.
它只是关于灵活性和表达力.喜欢列表理解.你可以做大部分定义命名函数(可能污染命名空间,但这又是纯粹的风格问题).
它可以通过以下事实帮助实现可读性:您不必定义单独的命名函数,其他人必须查找,阅读和理解它所做的只是在其参数上调用方法blah().
当你使用它来编写创建和返回其他函数的函数时,它可能会更有趣,这些函数究竟是做什么的,取决于它们的参数.这可能是一种非常简洁易读的参数化代码行为方式.你可以表达更多有趣的想法.
但这仍然是一种结构性选择.你可以这样做.但是面向对象编程也是如此;)
暂时忽略它是我们正在讨论的特定匿名函数的细节.函数(包括匿名函数)在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_PONY
或BUFFER_SIZE
事先声明的问题.有时候使用(数字,字符串或函数)文字是合适的,有时候命名这样的东西并通过它的名称引用它更合适.
见例如.艾伦·霍鲁布(Allen Holub)关于Java设计模式的挑衅,思想或愤怒的书; 他使用匿名课程相当多.
小智 5
Lambda 虽然在某些情况下很有用,但也有很大的滥用潜力。lambda 几乎总是使代码更难阅读。虽然将您的所有代码都放在一行中可能会让人感到满意,但对于下一个必须阅读您的代码的人来说,这会很糟糕。
直接来自 PEP8
“Guido 的一个重要见解是,代码的阅读频率远高于编写代码的频率。”
毫无疑问,滥用 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 函数如何在可能更复杂的情况和函数中提高可读性和代码重用性。