版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第详解Python之可迭代对象,迭代器和生成器目录一、概念描述二、序列的可迭代性三、经典的迭代器模式四、生成器也是迭代器五、实现惰性迭代器六、使用生成器表达式简化惰性迭代器总结
一、概念描述
可迭代对象就是可以迭代的对象,我们可以通过内置的iter函数获取其迭代器,可迭代对象内部需要实现__iter__函数来返回其关联的迭代器;
迭代器是负责具体数据的逐个遍历的,其通过实现__next__函数得以逐个的访问关联的数据元素;同时通过实现__iter__来实现对可迭代对象的兼容;
生成器是一种迭代器模式,其实现了数据的惰性生成,即只有使用的时候才会生成对应的元素;
二、序列的可迭代性
python内置的序列可以通过for进行迭代,解释器会调用iter函数获取序列的迭代器,由于iter函数兼容序列实现的__getitem__,会自动创建一个迭代器;
迭代器的
importre
fromdisimportdis
classWordAnalyzer:
reg_word=pile('\w+')
def__init__(self,text):
self.words=self.__class__.reg_word.findall(text)
def__getitem__(self,index):
returnself.words[index]
defiter_word_analyzer():
wa=WordAnalyzer('thisismangowordanalyzer')
print('startforwa')
forwinwa:
print(w)
print('startwhilewa_iter')
wa_iter=iter(wa)
whileTrue:
try:
print(next(wa_iter))
exceptStopIterationase:
break;
iter_word_analyzer()
dis(iter_word_analyzer)
#startforwa
#this
#mango
#word
#analyzer
#startwhilewa_iter
#this
#mango
#word
#analyzer
#150LOAD_GLOBAL0(WordAnalyzer)
#2LOAD_CONST1('thisismangowordanalyzer')
#4CALL_FUNCTION1
#6STORE_FAST0(wa)
#168LOAD_GLOBAL1(print)
#10LOAD_CONST2('startforwa')
#12CALL_FUNCTION1
#14POP_TOP
#1716LOAD_FAST0(wa)
#18GET_ITER
#20FOR_ITER12(to34)
#22STORE_FAST1(w)
#1824LOAD_GLOBAL1(print)
#26LOAD_FAST1(w)
#28CALL_FUNCTION1
#30POP_TOP
#32JUMP_ABSOLUTE20
#2034LOAD_GLOBAL1(print)
#36LOAD_CONST3('startwhilewa_iter')
#38CALL_FUNCTION1
#40POP_TOP
#2142LOAD_GLOBAL2(iter)
#44LOAD_FAST0(wa)
#46CALL_FUNCTION1
#48STORE_FAST2(wa_iter)
#2350SETUP_FINALLY16(to68)
#2452LOAD_GLOBAL1(print)
#54LOAD_GLOBAL3(next)
#56LOAD_FAST2(wa_iter)
#58CALL_FUNCTION1
#60CALL_FUNCTION1
#62POP_TOP
#64POP_BLOCK
#66JUMP_ABSOLUTE50
#2568DUP_TOP
#70LOAD_GLOBAL4(StopIteration)
#72JUMP_IF_NOT_EXC_MATCH114
#74POP_TOP
#76STORE_FAST3(e)
#78POP_TOP
#80SETUP_FINALLY24(to106)
#2682POP_BLOCK
#84POP_EXCEPT
#86LOAD_CONST0(None)
#88STORE_FAST3(e)
#90DELETE_FAST3(e)
#92JUMP_ABSOLUTE118
#94POP_BLOCK
#96POP_EXCEPT
#98LOAD_CONST0(None)
#100STORE_FAST3(e)
#102DELETE_FAST3(e)
#104JUMP_ABSOLUTE50
#106LOAD_CONST0(None)
#108STORE_FAST3(e)
#110DELETE_FAST3(e)
#112RERAISE
#114RERAISE
#116JUMP_ABSOLUTE50
#118LOAD_CONST0(None)
#120RETURN_VALUE
三、经典的迭代器模式
标准的迭代器需要实现两个接口方法,一个可以获取下一个元素的__next__方法和直接返回self的__iter__方法;
迭代器迭代完所有的元素的时候会抛出StopIteration异常,但是python内置的for、列表推到、元组拆包等会自动处理这个异常;
实现__iter__主要为了方便使用迭代器,这样就可以最大限度的方便使用迭代器;
迭代器只能迭代一次,如果需要再次迭代就需要再次调用iter方法获取新的迭代器,这就要求每个迭代器维护自己的内部状态,即一个对象不能既是可迭代对象同时也是迭代器;
从经典的面向对象设计模式来看,可迭代对象可以随时生成自己关联的迭代器,而迭代器负责具体的元素的迭代处理;
importre
fromdisimportdis
classWordAnalyzer:
reg_word=pile('\w+')
def__init__(self,text):
self.words=self.__class__.reg_word.findall(text)
def__iter__(self):
returnWordAnalyzerIterator(self.words)
classWordAnalyzerIterator:
def__init__(self,words):
self.words=words
self.index=0
def__iter__(self):
returnself;
def__next__(self):
try:
word=self.words[self.index]
exceptIndexError:
raiseStopIteration()
self.index+=1
returnword
defiter_word_analyzer():
wa=WordAnalyzer('thisismangowordanalyzer')
print('startforwa')
forwinwa:
print(w)
print('startwhilewa_iter')
wa_iter=iter(wa)
whileTrue:
try:
print(next(wa_iter))
exceptStopIterationase:
break;
iter_word_analyzer()
#startforwa
#this
#mango
#word
#analyzer
#startwhilewa_iter
#this
#mango
#word
#analyzer
四、生成器也是迭代器
生成器是调用生成器函数生成的,生成器函数是含有yield的工厂函数;
生成器本身就是迭代器,其支持使用next函数遍历生成器,同时遍历完也会抛出StopIteration异常;
生成器执行的时候会在yield语句的地方暂停,并返回yield右边的表达式的值;
defgen_func():
print('firstyield')
yield'first'
print('secondyield')
yield'second'
print(gen_func)
g=gen_func()
print(g)
forvaling:
print(val)
g=gen_func()
print(next(g))
print(next(g))
print(next(g))
#functiongen_funcat0x7f1198175040
#generatorobjectgen_funcat0x7f1197fb6cf0
#firstyield
#first
#secondyield
#second
#firstyield
#first
#secondyield
#second
#StopIteration
我们可以将__iter__作为生成器函数
importre
fromdisimportdis
classWordAnalyzer:
reg_word=pile('\w+')
def__init__(self,text):
self.words=self.__class__.reg_word.findall(text)
def__iter__(self):
forwordinself.words:
yieldword
defiter_word_analyzer():
wa=WordAnalyzer('thisismangowordanalyzer')
print('startforwa')
forwinwa:
print(w)
print('startwhilewa_iter')
wa_iter=iter(wa)
whileTrue:
try:
print(next(wa_iter))
exceptStopIterationase:
break;
iter_word_analyzer()
#startforwa
#this
#mango
#word
#analyzer
#startwhilewa_iter
#this
#mango
#word
#analyzer
五、实现惰性迭代器
迭代器的一大亮点就是通过__next__来实现逐个元素的遍历,这个大数据容器的遍历带来了可能性;
我们以前的实现在初始化的时候,直接调用re.findall得到了所有的序列元素,并不是一个很好的实现;我们可以通过re.finditer来在遍历的时候得到数据;
importre
fromdisimportdis
classWordAnalyzer:
reg_word=pile('\w+')
def__init__(self,text):
#self.words=self.__class__.reg_word.findall(text)
self.text=text
def__iter__(self):
g=self.__class__.reg_word.finditer(self.text)
print(g)
formatching:
yieldmatch.group()
defiter_word_analyzer():
wa=WordAnalyzer('thisismangowordanalyzer')
print('startforwa')
forwinwa:
print(w)
print('startwhilewa_iter')
wa_iter=iter(wa)
wa_iter1=iter(wa)
whileTrue:
try:
print(next(wa_iter))
exceptStopIterationase:
break;
iter_word_analyzer()
#startforwa
#callable_iteratorobjectat0x7feed103e040
#this
#mango
#word
#analyzer
#startwhilewa_iter
#callable_iteratorobjectat0x7feed103e040
#this
#mango
#word
#analyzer
六、使用生成器表达式简化惰性迭代器
生成器表达式是生成器的声明性定义,与列表推到的语法类似,只是生成元素是惰性的;
defgen_func():
print('firstyield')
yield'first'
print('secondyield')
yield'second'
l=[xforxingen_func()]
forxinl:
print(x)
print()
ge=(xforxingen_func())
print(ge)
forxinge:
print(x)
#firstyield
#secondyield
#first
#second
#generatorobjectgenexprat0x7f78ff5dfd60
#firstyield
#first
#secondyield
#second
使用生成器表达式实现wordanalyzer
importre
fromdisimportdis
classWordAnalyzer:
reg_word=pile('\w+')
def__init__(self,text):
#self.words=self.__class__.reg_word.findall(text)
self.text=text
def__iter__(self):
#g=self.__class__.reg_word.finditer(self.text)
#print(g)
#formatching:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工艺整合招聘试题及答案
- 2025广西柳州市龙潭公园管理处招聘2人参考题库含答案详解(巩固)
- 2026年新星职业技术学院单招职业技能测试必刷测试卷及答案1套
- 2025广西北海市水资源服务中心招聘1人参考题库及答案详解(名校卷)
- 2026年南充科技职业学院单招职业技能考试题库含答案
- 2026年辽宁轻工职业学院单招职业适应性考试题库汇编
- 2026年安徽绿海商务职业学院单招职业倾向性测试题库新版
- 2025年湖南娄底娄星区青年就业见习单位第十批招募见习人员28人参考题库含答案详解(培优b卷)
- 2026年吉林省长春市单招职业倾向性测试必刷测试卷必考题
- 2026年西藏阿里地区单招职业适应性测试题库汇编
- 2025中国微生物制剂农业应用与市场推广研究报告
- 2025吉林省国资委监管企业集中招考1214人联合考试笔试备考试题及答案解析
- 2025-2030智慧餐饮行业市场分析及投资前景研究报告
- 跑步体能训练讲座
- 别墅物业费代缴合同协议2025年规定
- 2025年妇产科妇科超声检查技巧操作考核试题及答案
- 2025年度江苏省数据集团有限公司社会招聘笔试参考题库附带答案详解
- 前列腺增生患者术后膀胱冲洗的护理查房
- 企业费用明细及科目分类标准
- 2025年神经病学神经系统疾病诊断案例分析试卷答案及解析
- 红色电影影视鉴赏课件
评论
0/150
提交评论