• python序列可以支持迭代的原因


    解释器需要迭代对象x时,会自动调用iter(x)

    1.检查对象是否实现了__iter__方法,实现了就调用它,获取一个迭代器。

    2.没有实现__iter__方法,实现了__getitem__方法。Python会创建一个迭代器,按顺序获取元素。

    3.都没有实现,就会抛出TypeError异常。

    所有什么是可迭代对象?

    Python可以从可迭代对象中获取迭代器。

    比如迭代一个字符串

    >>>s='ABC'
    >>>for char in s:
                print(char)
    A
    B
    C

    使用while

    s='ABC'
    it=iter(s)#it为一个迭代器,s为可迭代对象
    while True:
        try:
            print(next(it))#在迭代器上调用next函数获取下一个元素
        except StopIteration:#没有单词,迭代器抛出StopIteration异常
        del it 
        
    break

     两种方式实现“句子类”的迭代:

    更符合python习惯的方式,生成器函数——————调用它时,会返回一个生成器对象

    import re
    import reprlib
    
    RE_WORD=re.compile('w+')
    
    class Sentence:
        def __init__(self,text):
            self.text=text
            self.words=RE_WORD.findall(text)
       def __repr__(self):
         return 'Sentence(%s)'%reprlib.repr(self.text)
       def __iter__(self):
         for word in self.words:
            yield word#生成全部值之后直接退出
         return

        

     Sentence实例为可迭代对象,SentenceIterrator实例为迭代器

    import re
    import reprlib
    RE_WORD=re.compile('w+')
    
    class Sentence:
        def __init__(self,text):
            self.text=text
            self.words=RE_WORD.findall(text)
        def __repr__(self):
            return 'Sentence(%s)'% reprlib.repr(self.text)
        def __iter__(self):
            return SentenceIterator(self.words)#返回一个迭代器
    class SentenceIterator:
        def __init__(self,words):
            self.words=words
            self.index=0
        def __next__(self):
            try:
                word=self.words[self.index]
            except IndexError:
                raise StopIteration()
            self.index+=1
            return word
        def __iter__(self):
            return self
  • 相关阅读:
    Git_创建版本库
    Git_安装Git
    Git_集中式vs分布式
    Git_git的诞生
    echartShow
    微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的
    vue2.0 $router和$route的区别
    vue移动端开发全家桶
    干货分享:vue2.0做移动端开发用到的相关插件和经验总结
    优秀的基于VUE移动端UI框架合集
  • 原文地址:https://www.cnblogs.com/liuguangshou123/p/13515772.html
Copyright © 2020-2023  润新知