LearnPython.org发电机故障

时间:2013-11-05 17:11:06

标签: python fibonacci

我正在通过learnpython.org学习python。我完成了所有基本类,但是我遇到了Generators级别的问题。

我想我理解yield命令是如何工作的,但是我无法弄清楚如何使用它来获得完成课程所需的Fibonacci序列。这是我的代码,但它只给我前两个数字。

# 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

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

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

在python中,每个函数末尾都有一个隐式return。因此,当您的发电机到达功能的末尾时,在第二次产量之后,它会停止。如果你想继续(无限生成器),你需要将产量放在无限循环中。

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

旁注:

此外,python有一个nice function用于从内置于名为itertools的酷库中的无限生成器中获取前N个项目,因此第二部分可以像这样清理:

from itertools import islice
for number in islice(fib(), 10):
    print(number)