迭代器
1,如何让一个对象成为一个可以迭代的对象?
- 该对象的内部需要实现 __iter__方法
- 代码示例:
from collections import Iterable, Iterator class Groups(object): def __init__(self): self.names = [] def add(self, name): self.names.append(name) def __iter__(self): pass class GroupIterator(object): def __iter__(self): pass def __next__(self): return 11 group = Groups() group.add("老王") group.add("老张") group.add("老李") if isinstance(group, Iterable): print("这是一个可以迭代的对象") if isinstance(GroupIterator(), Iterator): print("这是一个迭代器")
2, 什么是迭代器?
- 迭代器需要满足两个条件
- 内部实现__iter__方法
- 内部实现__next__方法
3,自定义一个迭代器
- 根据以上知识点自定义一个迭代器
from collections import Iterable, Iterator class Groups(object): def __init__(self): self.names = [] def add(self, name): self.names.append(name) def __iter__(self): return GroupIterator(self) class GroupIterator(object): def __init__(self, obj): self.obj = obj self.num = 0 def __iter__(self): pass def __next__(self): if self.num < len(self.obj.names): ret = self.obj.names[self.num] self.num += 1 return ret else: # 抛出异常,终止迭代 raise StopIteration group = Groups() group.add("老王") group.add("老张") group.add("老李") if isinstance(group, Iterable): print("这是一个可以迭代的对象") if isinstance(GroupIterator(group.names), Iterator): print("这是一个迭代器") for name in group: print(name)
4,完善迭代器
- 代码示例:
from collections import Iterable, Iterator class Groups(object): def __init__(self): self.names = [] self.num = 0 def add(self, name): self.names.append(name) def __iter__(self): return self def __next__(self): if self.num < len(self.names): ret = self.names[self.num] self.num += 1 return ret else: # 抛出异常,终止迭代 raise StopIteration group = Groups() group.add("老王") group.add("老张") group.add("老李") for name in group: print(name)
5, 总结
- 可迭代对象
- 实现__iter__方法
- 迭代器
- 实现__iter__方法和__next__方法
- 一个对象时一个迭代器,那么他一定可以迭代,但是一个对象可以迭代,不一定是一个迭代器,比如for循环