了解Fibonacci数字生成器

时间:2016-06-27 16:24:25

标签: python

我正在尝试了解这段代码中发生的事情

def enum(seq):
    n = 0
    for i in seq:
        yield n, i
        n += 1
def fibonacci():
    i = j = 1
    while True:
        r, i, j = i, j, i + j
        yield r

我对生成器如何工作有一般的了解,我只是对这条线感到困惑:

r, i, j = i, j, i +j

以及正在发生的事情。感谢。

3 个答案:

答案 0 :(得分:0)

它被称为' tuple assignment'。

通常,您会遇到多个分配,例如

select t.* from
(values -- values to insert
(1,2),(1,3)) t(x,y)
left join dbo.XXX x on x.XXX_id = t.x
where x.XXX_id is null

这可以改写为:

a = 1
b = 2
c = 3

或者甚至喜欢这样:

(a, b, c) = (1, 2, 3)

如果要交换值:

a, b, c = 1, 2, 3

是的,这也有效。

在你的情况下,一些交换和一些添加同时发生*。 a, b = b, a 是将返回的值,r是下一步要返回的值i - 之后要返回。在j之后会返回什么? j等等。

答案 1 :(得分:0)

这是标准的“解包分配” - 计算右侧的三个值,然后将值绑定到位置(在这种情况下,它们都是简单的名称,但理论上它们可以是容器元素)在左手侧。这种特殊情况大致相当于

r = i
i = j
j = i+j

但请注意,在一般情况下,可以在单个语句中执行操作,否则在不使用临时变量的情况下无法安全地执行操作。经典的“交换两个变量”需要一个临时的,如

tmp = i
i = j
j = tmp

但是在python中你可以使用

i, j = j, i

一切都会正常工作(tm)。

答案 2 :(得分:0)

该行

r, i, j = i, j, i+j

是序列解包声明。

i = j = 1

  1. 首先评估右侧i, j, i+j并将其打包成元组(1, 1, 2)
  2. 然后将元组解压缩到名称rij中,以便r = 1i = 1j = 2
  3. python docs中的第5.3节末尾简要提到了这一点。