这个斐波那契 Lambda 函数是如何工作的? [复制]
Posted
技术标签:
【中文标题】这个斐波那契 Lambda 函数是如何工作的? [复制]【英文标题】:How does this Fibonacci Lambda function work? [duplicate] 【发布时间】:2020-03-09 08:28:17 【问题描述】:我是 Python 的初学者(自学)并被介绍给 Lambda(无名)函数,但我无法推断出斐波那契数列的以下表达式(来自 Google),但在线 (Google) 没有关于此的解释被评估(逐步)。这里有很多脑力,我想有人可以帮助我。您能帮助逐步评估并解释吗?
lambda n: reduce(lambda x, _: x+[x[-1]+x[-2]],range(n-2), [0, 1])
提前致谢。
(感谢xnkr,关于reduce 函数的建议已解释,是的,我能够理解这一点,这是我所做的自我培训的一部分,但我不明白这对lambda x 是如何工作的,_:x+ [x[-1]+x[-2]],range(n-2), [0, 1]. 这不仅仅是关于 reduce 的问题,而是关于整个构造的问题 - 有两个 lambda,一个 reduce 和 I不知道表达式的计算结果。下划线代表什么,它是如何工作的,等等)
有人能花 2 分钟来解释一下这里的整个结构吗?
【问题讨论】:
我认为这里的问题是理解reduce
,而不是 lambda。你知道reduce
在做什么吗?
是的,DeepSpace,我相信你是对的。但是,考虑到我是 Python 新手,所以我可能在理解 Lambda 方面存在差距(我无法将其分解为单独的参数,嵌套 lambdas 如何采用以及 reduce 采用哪些参数等)和 Reduce 函数以及这个 lambda 表达式整体工作。你能进一步解释一下吗?
(感谢 xnkr,关于 reduce 函数的建议已解释,是的,我能够理解这一点,这是我所做的自我训练的一部分,但我不明白这对 lambda 是如何工作的x, _ : x+[x[-1]+x[-2]],range(n-2), [0, 1]。这不仅仅是关于 reduce 的问题,而是关于整个构造的问题 - 有两个 lambdas ,一个减少,我不知道表达式的计算结果。下划线代表什么,它是如何工作的,等等)有人可以在这里花 2 分钟来解释整个结构吗?
【参考方案1】:
一块一块地分解:
lambda n:
- 定义一个接受 1 个参数 (n) 的函数;相当于匿名版本:def somefunc(n):
reduce()
- 我们稍后会回到它的作用;根据文档,这是一个按顺序对另一个函数、一个可迭代函数和可选的一些初始值进行操作的函数。它们是:
A) lambda x, _:
- 再次定义一个函数。这一次,它是两个参数的函数,作为标识符的下划线只是一个约定,表示我们不会使用它。
B) X + [ <stuff> ]
- 使用第一个参数的值添加一些东西列表。从我们使用 reduce 的事实中我们已经知道 arg 是一些列表。
C) <stuff>
是 x[-1] + x[-2]
- 这意味着我们在 X 前面添加的列表是,在这种情况下,最后两项的总和已经在 X 中,在我们在这个迭代中对 X 做任何事情之前。
range(n-2)
是我们正在处理的可迭代对象;所以,从 1 到 N-2 的数字列表。 -2
在这里是因为初始值(在 3 中)已经覆盖了前两个数字。
说到这里,[0, 1]
是我们为 X[-2]、X[-1] 预定义的前两个起始值。
现在我们正在执行。 reduce()
从 (1) 中获取函数,并继续将其应用于 (2) 中 range() 提供的每个参数,并将值附加到 (3) 中初始化为 [0, 1]
的列表中。所以,我们调用I1: [0, 1] + lambda 0, [0, 1]
,然后是I2: I1 + lambda 1, I1
,然后是I3: I2 + lambda 2, I2
,以此类推。
【讨论】:
感谢 user8407600 提供详细信息。非常感谢您的详细回复。几个简单的问题,以帮助我理解这些概念。我记得范围从 0 开始(即 range(10) 给出 [0,1,...,9])对吗?第二个问题是: x 是数组(列表)还是元素?那么 x+x[-1]+x[-2] 会评估为将两个项目附加到列表 x 吗? 如果你只传递一个参数,范围确实从 0 开始;有了更多,您可以指定开始和停止。在这种情况下没关系,因为这里它只是定义了输出列表的长度。 X 是一个列表;更一般地说,它是reduce() 之前所有迭代的聚合结果。写成X+X[-1]+X[-2],确实是双追加。以上是关于这个斐波那契 Lambda 函数是如何工作的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章