这个 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() - 我们稍后会回到它的作用;根据文档,这是一个函数,它按顺序对另一个函数、一个可迭代函数和可选的一些初始值进行操作。它们是:

  1. A) lambda x, _: - 再次定义一个函数。这次,它是两个参数的函数,下划线作为标识符只是一种约定,表示我们不会使用它。

    B) X + [ <stuff> ] - 用第一个 arg 的值预先添加一些东西列表。我们已经从我们正在使用 reduce 的事实中知道 arg 是一些列表。

    C) <stuff>x[-1] + x[-2] - 这意味着我们在 X 前面添加的列表是,在这种情况下,最后两项的总和 已经在 X 中,之前 我们在此迭代中对 X 做任何事情。

  2. range(n-2) 是我们正在处理的可迭代对象;所以,从 1 到 N-2 的数字列表。 -2 在这里是因为初始值(在 3 中)已经覆盖了前两个数字。

  3. 说起来,[0, 1]是我们预定义的X[-2]、X[-1]的前两个起始值。

  4. 现在我们正在执行。 reduce() 从 (1) 中获取函数并将其应用于 (2) 中 range() 提供的每个参数,并将值附加到在 (3) 中初始化为 [0, 1] 的列表中。所以,我们调用 I1: [0, 1] + lambda 0, [0, 1],然后调用 I2: I1 + lambda 1, I1,然后调用 I3: I2 + lambda 2, I2 等等。