魔法函数实现迭代器
class Fibs:def __init__(self, n=20):
self.a = 0
self.b = 1
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
return self.a__next__中的语句是什么意思了?这个next内部具体是如何运行的,
fibs = Fibs()
for each in fibs:
print(each)为什么print能够自动打印出所有的元素了,内部__next__做了设么操作
本帖最后由 十月故里 于 2020-4-1 16:43 编辑
首先第二个你用for语句对这个迭代器进行了遍历,自然就把所有元素都打印了一边
你可以用 next(fibs)来测试一下next的功能,就是自动到fibs的下一个元素
注意next到没有元素的时候会返回一个StopIteration
差不多是酱紫的:
>>> # 假设这里有一个myGen
>>> a = myGen(50)
>>> next(a) # __next__ 就是执行这样的操作
1
>>> next(a)
2
>>> # 直接遍历
>>> for i in a:
print(i, end = " ")
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 __iter__()和__next__()都是重载了python原有的同名函数。
__iter__()是迭代器函数,
__next__()就是返回迭代的下一个元素。
你写的__next__()函数中少了终止条件,程序会无限循环下去
帮你修改了一下。
同时帮你添加了一下next 的用法
class Fibs:
def __init__(self, n=20):
self.a = 0
self.b = 1
self.n=n
def __iter__(self):
return self
def __next__(self):
if self.n==0:
raise StopIteration
self.n-=1
self.a, self.b = self.b, self.a + self.b
return self.a
fibs = Fibs()
for each in fibs:
print(each)
fib2 = Fibs(10)
for i in range(10):
print(next(fib2))
对 fibs 进行一次迭代就是获取 fibs.__next__() 的返回值。
页:
[1]