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