我正在尝试了解这段代码中发生的事情
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
以及正在发生的事情。感谢。
答案 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
。
i, j, i+j
并将其打包成元组(1, 1, 2)
。r
,i
和j
中,以便r = 1
,i = 1
和j = 2
。 python docs中的第5.3节末尾简要提到了这一点。