for语句的iterator protocol

2021年6月10日 / 16次阅读 / Last Modified 2021年6月10日

Python提供的for语句,清晰简洁方便,在python代码中很通用,所有内置的container对象,都可以用for语句来遍历。本文简述for语句背后的机制:iterator protocol

for... in...,首先用iter函数,基于container对象创建一个iterator(迭代器),然后通过next函数调用此迭代器,直到迭代器抛出StopIteration,for循环停止。

iter和next函数,都是python内置函数。迭代器对象有__next__魔法函数,因此可以用next来调用。

了解了for循环的机制,我们就可以自己写一个可以被for循环遍历的某种container对象。

class Reverse:
    """Iterator for looping over a sequence backwards."""
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]

iter函数调用__iter__,next调用__next__,这样以上这个类定义的对象,就可以用for来遍历。

>>> rev = Reverse('spam')
>>> for char in rev:
...     print(char)
...
m
a
p
s

用这种方式写“可迭代对象”,与生成器效果是一样的。生成器是可迭代的函数,这里是对象。生成器更智能,它会自动记录代码的执行状态,并且自动抛出StopIteration异常!

-- EOF --

本文链接:https://www.pynote.net/archives/3716

相关文章

    留言区

    您的电子邮箱地址不会被公开。 必填项已用*标注


    前一篇:
    后一篇:

    More


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top