迭代器
代码1
from collections.abc import Iterable, Iterator
class MyIterable:
def __iter__(self):
pass
class MyIterator:
def __iter__(self):
pass
def __next__(self):
pass
def main():
print(isinstance(MyIterable(), Iterable))
print(isinstance(MyIterable(), Iterator))
print(isinstance(MyIterator(), Iterable))
print(isinstance(MyIterator(), Iterator))
if __name__ == '__main__':
main()
输出:
True
False
True
True
解释:
MyIterable 实现了 __iter__ 表示该对象可迭代
MyIterator 实现了 __iter__ 和 __next__ 表示该对象是迭代器
代码2
class FibIterator:
"""斐波那契数列迭代器"""
def __init__(self, num):
self.num = num
self.fisrt = 1
self.second = 1
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < self.num:
self.index += 1
item = self.fisrt
self.fisrt, self.second = self.second, self.fisrt + self.second
return item
else:
raise StopIteration
def main():
for i in FibIterator(6):
print(i)
print()
fi = FibIterator(6)
print(next(fi))
print(next(fi))
print(next(fi))
print(next(fi))
print(next(fi))
print(next(fi))
输出:
1
1
2
3
5
8
1
1
2
3
5
8
解释:
- iter() 就是通过
__iter__获取迭代器, 所以要返回自己, 也就是 return self - next() 本质就是通过迭代器的
__next__方法获取值, 也就是 return item,直至遇到StopIteration异常 - for 循环的本质是先通过 iter() 函数获取可迭代对象的迭代器, 不断使用 next() 方法调用迭代器, 获取下一个值并赋值给 item, 直到遇到 StopIteration 异常后结束循环