Skip to main content
 首页 » 编程设计

python之python中的生成器错误

2025年05月04日15mq0036

我对 python 中的生成器还是个新手。我自己尝试了一个并尝试了一些非常简单的事情:

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

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

TypeError: unsupported operand type(s) for +: 'generator' and 'generator' 

生成器不能这样用吗?

请您参考如下方法:

调用生成器函数不会产生下一个值。它生成一个生成器对象,这是迭代器对象的专业版本。实际上,您有一些东西包装了一个暂停的函数。

要从该函数中获取另一个值,您必须调用 next(iterator)在对象上或使用类似 list(iteratort) 的东西或 for ... in iterator遍历对象并获取值。参见 What does the "yield" keyword do?了解更多详情。

所以在这里,你必须使用 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 

这将为您提供第一个 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] 

或者您可以使用该参数生成所有斐波那契值直到一个限制,或者生成一个无穷无尽的斐波那契数生成器。这些都不需要递归,像上面这样的循环就足够了。