python中的生成器错误

Shr*_*ram 1 python generator fibonacci python-3.x

我仍然是python中的新生成器.我自己尝试了一个并尝试了一些非常简单的事情:

def fib(a):
...     if a==0 or a==1:return 1
...     yield fib(a-1)+fib(a-2)
print(list(fib(5))
Run Code Online (Sandbox Code Playgroud)

这段代码给了我这个错误:

TypeError: unsupported operand type(s) for +: 'generator' and 'generator'
Run Code Online (Sandbox Code Playgroud)

不能以这种方式使用发电机吗?

Mar*_*ers 6

调用生成器函数不会产生下一个值.它生成一个生成器对象,一个迭代器对象的专家版本.实际上,你有一些包含暂停功能的东西.

为了得到该功能的另一个值,你就必须调用next(iterator)该对象上或使用类似list(iteratort)for ... in iterator遍历所有的对象,并获取值了.请参阅"yield"关键字的作用是什么?更多细节.

所以在这里,您必须使用它next(fib(a-1)) + next(fib(a-2))来获取两个递归值.那也会失败,因为你的终止案例(a == 0 or a == 1)使用return(翻译成StopIteration异常的值)而不是yield; 你也必须解决这个问题.

这就强调了为什么递归函数不应该是生成函数.您的函数不会生成一系列迭代值.对于给定的参数值,只有一个结果.你最好只使用return而不是yield.

如果你想生成一个斐波纳契数列,那么函数参数需要被视为一个限制; "给我第一个n斐波纳契数字".以下迭代函数执行此操作:

def first_n_fibonacci(n):
    a, b = 0, 1
    for i in range(0, n):
        a, b = b, a + b
        yield a
Run Code Online (Sandbox Code Playgroud)

这将为您提供第一个n斐波纳契数列表,作为生成器:

>>> f = first_n_fibonacci(5)
>>> f
<generator object first_n_fibonacci at 0x10b2c8678>
>>> next(f)
1
>>> next(f)
1
>>> list(f)
[2, 3, 5]
Run Code Online (Sandbox Code Playgroud)

或者您可以使用该参数生成所有斐波那契值达到极限,或者产生无限的斐波那契数字生成器.这些都不需要递归,像上面这样的循环就足够了.