多任务之协程
一、迭代器
1. 迭代器介绍:
- 迭代是访问元素集合的一种方式;
- 迭代器是一个可以记住遍历的位置的对象;
- 迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束;
- 迭代器只能往前不会后退
2. 可迭代对象
- 可迭代对象有:list、tuple、str等类型数据使用for…in…的循环语法从其中一次拿到数据进行使用,我们吧这样的过程称为遍历,也叫做迭代
3. 判断是否可以迭代:
-
判断XXXX是否是可迭代对象:
from collections import Iterable isinstance(XXXX, Iterable): 返回是True则可以迭代
4. 迭代器的用途和优点:
- 用途:可以代替range()的遍历 --> 元组转列表就是用的迭代器
- 优点: 完成一件事情,占用空间小,不存放返回结果,只存放生成的过程
5. 自己创建一个迭代器类的过程
- 首先要让其称为可迭代对象: 类中要有
__iter__
方法 - 调用类的
__iter__
方法得到其返回值 __iter__
方法的返回值要是一个迭代器- 迭代器对象要含有:
__iter__
方法和__next__
方法
6. 自己创建迭代器的实现
- __iter__方法返回另外一个迭代器对象
"""自定义一个迭代器类""" import time from collections.abc import Iterable from collections.abc import Iterator class Classmate(object): """自定义一个存名字的类""" def __init__(self): # 定义一个存放名字的列表 self.names = list() def add(self, name): # 向列表中添加名字 self.names.append(name) def __iter__(self): """如果想要一个对象成为一个迭代的对象,即可以使用for,那么必须实现__iter__方法, 而且他的返回值的类中必须有__next__方法""" return ClassIterator(self) class ClassIterator(object): def __init__(self, obj): self.obj = obj self.current = 0 def __iter__(self): pass def __next__(self): if self.current < len(self.obj.names): # print(self.obj.names[self.current]) ret = self.obj.names[self.current] self.current += 1 return ret else: # 如果超出则返或异常,则for 将会自动停下来 raise StopIteration def main(): classmate = Classmate() classmate.add("张三") classmate.add("李四") classmate.add("王五") print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable)) class_iterator = iter(classmate) print("判断classmate_iterator是否是迭代器:",isinstance(class_iterator, Iterator)) # print(next(class_iterator)) for name in classmate: time.sleep(1) print(name) if __name__ == "__main__": main(