程序员我爱编程

python迭代器

2018-05-27  本文已影响36人  lvyz0207

迭代器用于从集合中取元素,生成器“凭空”生成元素

流畅的Python中这样定义:迭代器是实现了无参数的 'next'方法,返回序列的下一个元素,;如果没有元素了,那么抛出StopIteration异常。python迭代器还实现了,'iter '方法,因此迭代器也可以迭代。

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 SentenceIteration(self.words)    # 实现实例化,并返回一个迭代器


class SentenceIteration:


    def __iter__(self, words):
        self.words = words  # 实例引用单词列表
        self.index = 0  # self.index 由于确定下一个要获取的

    def __next__(self):
        try:
            word = self.words[self.index]   # 获得self.index索引位的单词
        except IndexError:
            raise  StopIteration()  # 如果索引位没有单词,则抛出StopInteration异常
        self.index += 1   # 递增
        return word  # 返回单词

        def __iter__(self):  # 实现self.__iter__方法
            return self

迭代器和可迭代对象的区别
可迭代对象有一个iter方法,每次实例化一个新的迭代器,而迭代器要实现next方法,返回单个元素此外还要实现iter方法,返回迭代器本身。

例一

it = iter(range(4))
try:
    while 1:
        print(next(it))
except StopIteration:
    pass

it = iter(range(4))
try:
    while 1:
        print(next(it))
except StopIteration:
    pass
​
0
1
2
3

例二:

__doc__="""python 迭代器 设计模式 """

class Number():
    def __init__(self,number):
        self.number = number

    def __iter__(self):
        return NumberIter(self.number)

class NumberIter():

    def __init__(self,number):
        self.number = number
        self.index = 1

    def __next__(self):
        value = int(self.number/self.index)%10
        self.index *= 10
        if value < 1 :
            raise StopIteration
        return value


if __name__=="__main__":
    n = Number(1234)
    for i in n:
        print(i)
image.png
上一篇 下一篇

猜你喜欢

热点阅读