1

我正在通过 learnpython.org 学习 python。我通过所有基本课程都很好,但是我在生成器级别上遇到了麻烦。

我想我了解该yield命令的工作原理,但我不知道如何使用它来获得完成课程所需的斐波那契数列。这是我的代码,但它只给了我前 2 个数字。

# fill in this function
def fib():
    a,b = 1,0  # Sets the values (is this causing a problem?)
    yield a    # Sends back the value of a to the iterator (for loop)
    b = a + b  # Sets the value of b to a + b
    yield b    # Sends back the value of b to the iterator (for loop)

# testing code
import types
if type(fib()) == types.GeneratorType:
    print "Good, The fib function is a generator."

    counter = 0
    for n in fib():
        print n
        counter += 1
        if counter == 10:
            break

这是最烦人的,因为我想完成这个级别,但我不知道如何。

4

2 回答 2

4

您的生成器将为yield执行的每个语句生成一个结果。你只执行了两个yield语句,所以你的生成器产生了两个结果。

尝试这个:

def fib():
    a,b = 1,0  # Sets the values (is this causing a problem?)
    while True:
        a,b = b, a + b  # Sets the value of b to a + b
        yield b    # Sends back the value of b to the iterator (for loop)

如您所见,while循环将永远运行,因此此生成器将产生无限(无限?)数量的结果。


或者,您可以修改生成器以生成有限序列,并修改调用者以利用它:

def fib(counter=None, limit=None):
    a,b = 0,1
    i = 0
    while (counter is None or counter > i) and (limit is None or limit > b):
        i += 1
        yield b
        a,b = b, a + b

print list(fib(counter=10))
print list(fib(limit=60))
于 2013-11-05T17:14:46.450 回答
0

return在python中,每个函数的末尾总是有一个隐式的。因此,当您的生成器到达函数末尾时,在第二次 yield 之后,它会停止。如果您想继续前进(无限生成器),则需要将产量置于无限循环中。

def fib():
    current, past = 1, 0
    while True:
        yield current
        current, past = current + past, current

边注:

此外,python 有一个很好的功能,可以从一个内置的无限生成器中抓取前 N 个项目到一个名为 itertools 的酷库中,因此可以像这样清理第二部分:

from itertools import islice
for number in islice(fib(), 10):
    print(number)
于 2013-11-05T17:24:29.510 回答