这个 Fibonacci Lambda 函数是如何工作的?
How does this Fibonacci Lambda function work?
我是 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我不知道表达式的计算结果。下划线代表什么,它是如何工作的,等等)
有人可以花 2 分钟来解释整个结构吗?
逐条分解:
lambda n:
- 定义一个接受 1 个参数 (n) 的函数;相当于匿名版本:def somefunc(n):
reduce()
- 我们稍后会回到它的作用;根据文档,这是一个函数,它按顺序对另一个函数、一个可迭代函数和可选的一些初始值进行操作。它们是:
A) lambda x, _:
- 再次定义一个函数。这次,它是两个参数的函数,下划线作为标识符只是一种约定,表示我们不会使用它。
B) X + [ <stuff> ]
- 用第一个 arg 的值预先添加一些东西列表。我们已经从我们正在使用 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
等等。
我是 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我不知道表达式的计算结果。下划线代表什么,它是如何工作的,等等)
有人可以花 2 分钟来解释整个结构吗?
逐条分解:
lambda n:
- 定义一个接受 1 个参数 (n) 的函数;相当于匿名版本:def somefunc(n):
reduce()
- 我们稍后会回到它的作用;根据文档,这是一个函数,它按顺序对另一个函数、一个可迭代函数和可选的一些初始值进行操作。它们是:
A)
lambda x, _:
- 再次定义一个函数。这次,它是两个参数的函数,下划线作为标识符只是一种约定,表示我们不会使用它。B)
X + [ <stuff> ]
- 用第一个 arg 的值预先添加一些东西列表。我们已经从我们正在使用 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
等等。