详解Python之可迭代对象,迭代器和生成器_第1页
详解Python之可迭代对象,迭代器和生成器_第2页
详解Python之可迭代对象,迭代器和生成器_第3页
详解Python之可迭代对象,迭代器和生成器_第4页
详解Python之可迭代对象,迭代器和生成器_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第详解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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论