#generator:生成器,内部保存的并不是像列表一样真实的数据,而是一套算法,依次推导出下一个数据#生成器属于可迭代对象,可以使用for-in遍历。#如果生成器访问到最后一个元素,就不能再继续访问了#生成器会记录自己被访问到哪个数据了。#for-in是从记录的数据开始访问到最后一个数据,next()访问下一个数据
工具/原料
python3.6
pycharm
方法/步骤
1、fromcollectionsimportIterable,Iterator#引入包#将列表生成式的方括号改成圆括号,返回结果就不是列表了,而是一个生成器。g=(iforiinrange(10))print(g)
2、print(isinstance(g,Iterator))#生成器属于迭代器。print(isinstance(g,Iterable))#生成器属于可迭代对象。print(isinstance('good',Iterator))#字符串等容器属于可迭代对象,但是不属于迭代器。
3、#生成器每次被访问都会记录自己被访问的位置next(g)#通过next()访问生成器中的下一个元素print(next(g))
4、#for-in遍历生成器会直接从记录的位置访问到最后foriing:print(i,end='')print()
5、#next(g)#访问到最后一个,就不能在访问了,否则崩溃g=(iforiinrange(10))#使用next()访问生成器中特定数量的数据#生成器,访问一个加载一个,不访问不加载:俗称懒加载或惰性加载。foriinrange(6):print(next(g))
6、#利用函数创建生成器defback_genarator(n):print(111111)foriinrange(n+1):print(2222222)yieldiprint(3333333)
7、#生成器记录的是算法规则,依次加载#调用next()才开始执行生成器内部的代码,每调用一次next,代码会走到yield,将结果抛出,然后代码暂停#如果已经访问到最后一个yield,就代码生成器结束了,不能再次调用next()g=back_genarator(3)print(next(g))print(next(g))