繁体   English   中英

了解斐波那契数发生器

[英]Understanding Fibonacci number generator

我正在尝试了解此代码块中正在发生的事情

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

以及发生了什么。 谢谢。

这称为“元组分配”。

通常,您会遇到多个任务,例如

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之后会返回什么? i + j等。

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

r = i
i = j
j = i+j

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

tmp = i
i = j
j = tmp

但是在python中,您可以使用

i, j = j, i

一切都会正常进行(tm)。

线

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

是序列解包语句。

i = j = 1

  1. 首先评估右侧i, j, i+j并将其打包为元组(1, 1, 2) 1、2、1 (1, 1, 2)
  2. 然后,将元组解压缩为名称rij ,使得r = 1i = 1j = 2

python文档 5.3节的末尾简要提到了这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM