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)
不能以这种方式使用发电机吗?
调用生成器函数不会产生下一个值.它生成一个生成器对象,一个迭代器对象的专家版本.实际上,你有一些包含暂停功能的东西.
为了得到该功能的另一个值,你就必须调用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)
或者您可以使用该参数生成所有斐波那契值达到极限,或者产生无限的斐波那契数字生成器.这些都不需要递归,像上面这样的循环就足够了.