1. 迭代器
1.1 可迭代对象
1. 判断xxx_obj是否可以迭代
2. 在第1步成立的前提下,调用iter函数得到xxx_obj对象的 __iter__方法的返回值
3. __iter__方法的返回值是一个迭代器
4. 如果想要一个对象称为一个 可以迭代的对象,即可以使用for,必须实现 __iter__方法
5. __iter__中必须返回对象的引用(只要这个对象有__iter__和__next__方法,实际上取的__next__的返回值;
6. 迭代器结束,需要抛出一个 StopIteration异常。
from collections import Iterable from collections import Iterator import time class Classmate(object): def __init__(self): self.names = list() def add(self, name): self.names.append(name) def __iter__(self): # 如果想要一个对象称为一个 可以迭代的对象,即可以使用for,必须实现 __iter__方法 return ClassIterator(self) # 必须返回 class ClassIterator(object): def __init__(self, obj): self.obj = obj self.current_num = 0 def __iter__(self): pass def __next__(self): if self.current_num < len(self.obj.names): ret = self.obj.names[self.current_num] self.current_num += 1 return ret else: raise StopIteration classmate = Classmate() classmate.add("王1") classmate.add("李2") classmate.add("张3") # print("classmate是否是可以迭代的对象: ", isinstance(classmate, Iterable)) # classmate_iterator = iter(classmate) # print("classmate_iterator是否是迭代器: ", isinstance(classmate_iterator, Iterator)) # iter # print(next(classmate_iterator)) # for name in classmate: print(name) time.sleep(1)
王1
李2
张3
调用自己的__next__方法
from collections import Iterable from collections import Iterator import time class Classmate(object): def __init__(self): self.names = list() self.current_num = 0 def add(self, name): self.names.append(name) # 判断是否可以迭代 def __iter__(self): # 如果想要一个对象称为一个 可以迭代的对象,即可以使用for,必须实现 __iter__方法 return self # 调用返回对象的__next__方法(这里调用自己的__next__方法 def __next__(self): if self.current_num < len(self.names): ret = self.names[self.current_num] self.current_num += 1 return ret else: raise StopIteration # 停止迭代 classmate = Classmate() classmate.add("王1") classmate.add("李2") classmate.add("张3") # print("classmate是否是可以迭代的对象: ", isinstance(classmate, Iterable)) # classmate_iterator = iter(classmate) # print("classmate_iterator是否是迭代器: ", isinstance(classmate_iterator, Iterator)) # iter # print(next(classmate_iterator)) # for name in classmate: print(name) time.sleep(1)
王1
李2
张3