Python中的“lambda”是什么?

9

我想知道在Python中lambda是什么,它在哪里以及为什么使用它。

谢谢。


4
你有没有看过Python教程?http://docs.python.org/tutorial/controlflow.html#lambda-forms - user647772
2
SO需要一个关闭原因:“问题可以通过第一个Google搜索结果得到答案”。 - Glenn Maynard
4
不,应该让SO成为谷歌搜索的第一个结果。 - Andrew Jaffe
2
不必再提供关于某个主题的解释、教程、参考和规范,因为已经有数十个完美的资源可供使用。 - Glenn Maynard
1
公平地说,大多数谷歌搜索结果都将“function”与“expression”混为一谈,就像下面的大多数答案一样——它们并不相同。 - Glenn Maynard
显示剩余4条评论
12个回答

10
Lambda更多是一个概念或编程技巧,而不是其他任何东西。
基本上,它的思想是,你会得到一个函数(在Python中是第一类对象),该函数作为另一个函数的结果返回,而不是对象或原始类型。我知道,这很令人困惑。
参见这个示例来自python文档:
def make_incrementor(n):
  return lambda x: x + n
f = make_incrementor(42)
f(0)
>>> 42
f(1)
>>> 43

因此,make_incrementor创建一个函数,该函数在其结果中使用n。您可以编写一个函数,使参数增加2,如下所示:

f2 = make_incrementor(2)
f2(3)
>>> 5

在函数式编程和像Lisp&Scheme这样的函数式编程语言中,这是一个非常强大的思想。

希望这可以帮助到您。


1
Python中的函数与其他对象并没有什么不同,它们与变量之间的关系也是相同的。顺便说一下,直接从另一个函数返回的lambda似乎并不是lambda使用最常见的例子——Google代码搜索显示它们仅占lambda使用量的5%。 - Rosh Oxymoron
谢谢澄清。我会尝试更新我的回答,使其更加清晰明了。至于示例,它是由Python文档选择的。;-) 这只是一个基本示例,旨在帮助那些在Python中寻求概念介绍的人。 - Dave
@Dave,不好意思,但这不是C/C++中静态变量的相同操作吗?它保持相同的值等。Lambda是模拟Python中静态变量的一种方式吗?提前感谢! - BugShotGG
1
@GeoPapas 很抱歉回复晚了 =D。静态变量和lambda是不同的。首先,静态变量仍然是一个变量,而lambda是一个函数。想象一下lambda函数有3个参数或者像列表这样的复杂数据结构。你可以在lambda函数中进行复杂的业务逻辑。此外,只有一个静态变量,而你可以有许多(无限)的lambda。想象一下上面例子中的f2和f3 = make_incrementor(3)。f2会将2添加到x,而f3会将3添加到x。两个不同的lambda,每个都绑定到不同值的参数n。 - Dave

5

函数表达式不等同于匿名函数。函数表达式是匿名表达式

虽然函数表达式可以像函数一样访问,但它们与函数并不相同。函数能够执行复杂的任务:流程控制、变量声明和包含表达式的语句列表。表达式仅仅是函数的其中一个组成部分,并且这也是函数表达式所提供的。与函数相比,函数表达式受到了很大的限制。

Python 不支持匿名函数。如果想要使用这种功能,可以查看 JavaScript 和 Lua 等语言的例子。

(注意:在函数式编程语言中,使用 "函数" 这个词来表示数学定义的函数是正确的,但在过程式语言中,"函数" 这个词与数学定义的意义完全不同。所以,在过程式语言中,把函数表达式称为匿名函数是不准确的。)


+1,“Lambda函数并非匿名函数。Lambda表达式是匿名的表达式。” 所以,如果我理解正确的话,你可以说“在Python中,使用lambda函数,你能够对表达式进行参数化”。谢谢。 - eat
@eat:表达式总是带有参数--x*2 的参数是 x。Lambda 允许您将表达式封装为对象。 - Glenn Maynard
“x2”的参数是“x”,但我不这么认为(在这种情况下,参数实际上是常数2)。考虑“line= lambda a, b: a x+ b”,现在我更愿意说我有一个表达式“a* x+ b”,带有参数“a”和“b”,这意味着当定义“line”时,“x”被绑定,而当实际调用“line”时,其余符号被绑定。这是我的一些关于lambda的看法。谢谢。 - eat

2

lambda 允许你在代码中定义简单的、无名的函数,例如作为参数传递。如果你计划仅使用这个函数一次,因此不希望用命名函数来使代码混乱,则这非常有用。

假设你有一个数字列表(thelist),你想要得到一个与其长度相同的数字列表,其中每个数字都加倍。你可以像这样操作,而不是定义一个 times_two 函数:

map(lambda x: x * 2, thelist)

lambda 也使得柯里化更加方便。


2
Lambda函数并不是Python特有的概念,而是指匿名函数的通用编程术语,即没有名称的函数。在Python中,它们通常用于需要将简单函数作为参数传递给另一个函数的情况。
列表上的sort方法需要一个key参数,它是一个用于计算列表排序值的函数。想象一下,您正在对一个由两个元素组成的元组列表进行排序,并且您想要根据第一个元素对列表进行排序。您需要向key传递一个返回第一个元素的函数。您可以这样做:
def first_element(x):
    return x[0]
my_list.sort(key=first_element)

或者,更加简洁地说,您可以执行以下操作:
my_list.sort(key=lambda x: x[0])

2
lambda是一种更简单的方式来定义一个计算单个表达式的简单函数。使用def语句可能会不方便,使代码变得更长、更难阅读。两者创建的函数在工作方式上几乎相同,区别在于lambda仅限于单个表达式,其值被返回,而def为函数分配名称,并将其添加到本地变量中。此外,lambda可以直接用于表达式,而def是一个语句。请保留HTML标记。
def f(x, y):
    return x + y

这会给你几乎与之相同的结果,就像

f = lambda x, y: x + y

你可以直接在表达式中使用它

g(5, 6, helper=lambda x, y: x + y)

使用def会更加冗长。

def helper_function(x + y):
    return x + y

g(5, 6, helper=helper_function)

你说关于 'def' 和 'lambda' 的第一个示例将会给你_几乎_相同的结果。那么结果有什么不同呢? - Andrew

2

lambda是一种定义匿名内联函数以完成某些任务的方式,而不是使用def关键字进行定义并调用它。将其视为一种简写,当您不需要重用函数时可以使用它。在任何使用lambda的地方,您都可以替换为显式调用的函数:它的使用完全是可选的,并留给程序员作为编码风格问题。

示例代码(不使用lambda):

def numSquared(num):
    return num**2

for i in range(1,11):
    print numSquared(i)

示例代码(使用lambda):

for i in range(1,11):
    print (lambda x: x**2)(i)

一个关于lambda的好入门讨论:DiveIntPython.org - Lambda


diveinto python 的链接已失效。 - balki

1
通过谷歌搜索“python lambda”返回的第一个链接指向页面,其中的第一段回答了你的问题。我可以复制粘贴内容,但我认为这是不公平的 :)

现在,链接已经失效了。 - mtso

0

这是一个内联匿名函数。


0

lambda是一个匿名函数,通常用于需要快速计算的事情。

例如(这在LexYacc命令解析器中使用):

assign_command = lambda dictionary, command: lambda command_function: dictionary.setdefault(command, command_function)

这是一个装饰器。放在我们从LexYacc解析器中得到的命令之前:@assign_command(_command_handlers, 'COMMAND')

这本质上是从定义的LexYacc语言构建Python脚本。

或者,更简单一点:

`x = lambda x: return x > 0 and x & (x-1) == 0


0

我想用一种通俗易懂的方式来解释这个问题,因为所有的技术细节已经被涵盖了。

一个 lambda 函数就像任何其他函数一样,唯一使它不同的是(除了语法和不能重复使用的事实),它在我们想要快速编写一个函数以仅使用一个表达式来接受参数并返回值时使用。

例如: 如果一个函数所做的只是接受一个参数并将其加1,那么使用 lambda 函数比普通函数更好。 但是,如果您的函数需要多行处理才能返回值,则需要使用普通函数定义,然后调用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接