这是我的Fib-squence的迭代器:
class fibo:
def __init__(self, n=0):
self.n = n
self.x1 = 0
self.x2 = 1
def next(self):
if self.n == 0:
raise StopIteration
else:
self.n = self.n -1
tmp = self.x1
self.x1, self.x2 = self.x2, self.x1 + self.x2
return tmp
def __iter__(self):
return self
结果是
^{pr2}$如何修改代码,使连续调用迭代下一个n个Fibonacci数,而不是迭代前n个Fibonacci数,例如????在
>>> f=fibo(5)
>>> [i for i in f]
[0, 1, 1, 2, 3]
>>> [i for i in f]
[5, 8, 13, 21, 34]
>>> [i for i in f]
[55, 89, 144, 233, 377]
>>> [i for i in f]
[610, 987, 1597, 2584, 4181]
为了得到您想要的东西,但是语法不同,您可以使用What is the most “pythonic” way to iterate over a list in chunks?的答案。尤其是来自one of the answers的代码片段:
这个函数将把iterable分成大小相等的“块”。您可以将其与现有的
^{pr2}$fibo
类的非终止版本一起使用:组合起来,现在可以执行以下操作:
^{3}$请注意,这个修改过的
fibo
永远不会停止迭代,所以您需要小心地将它交给任何试图急切地迭代到最后的东西。在另外,下面是一个使用生成器而不是类的迭代器的替代实现:
这在2.7中有效
输出
^{pr2}$在Python中,获取所需的确切语法是完全非法的,或者是非常不鼓励的,因为迭代器协议要求迭代器在完成一次之后继续生成
StopIteration
。来自引入迭代器的PEP 234:EDIT再想一想,我认为您需要的实际上是“合法的”Python,因为list comprehension
^{pr2}$[i for i in fibo]
隐式调用fibo上的__iter__
方法,因此或多或少要求一个新的迭代器(即使这是由同一个对象实现的)。因此,实现您想要的行为的正确方法是:工作原理如下:
^{3}$这显示了所需的行为:它继续引发
StopIteration
当它耗尽时,您需要显式地调用iter
来重置它。这与C.B.的版本稍有不同,C.B.的版本只是简单地包装起来,不需要重置:相关问题 更多 >
编程相关推荐