zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Win10 安装 Oracle32bit客户端 提示:引用数据不可用于验证此操作系统分发的先决条件
    ORACLE 拆分逗号分隔字符串函数
    PLSQL 中文乱码
    不要把分层当做解耦!
    MySQL 迁移到 PG 怎么做
    在 MySQL 创造类似 PipelineDB 的流视图(continuous view)
    TeamViewer 的替代品 ZeroTier + NoMachine
    所有 HTML attribute
    使用PG的部分索引
    基于 500 份标注数据用深度学习破解验证码
  • 原文地址:https://www.cnblogs.com/liuguangshou123/p/13515772.html
Copyright © 2011-2022 走看看