Python:迭代器

在Python中,迭代器是一个很重要的东西。良好的迭代器定义,能让代码更加清晰。

定义一个迭代器需要实现两个方法__iter____next__

__iter__返回迭代器对象本身。它是必需的,以允许容器和迭代器在for .. in ..语句中使用。
__next__返回下一个元素。当没有元素可返回时,应抛出StopIteration

class X2:
    def __init__(self, n: int):
        self.list = [x*x for x in range(n)]
        self.__count = -1

    def __iter__(self):
        return self

    def __next__(self):
        self.__count += 1
        try:
            return self.list[self.__count]
        except IndexError:
            raise StopIteration


if __name__ == "__main__":
    for each in X2(10):
        print(each)

但这样定义似乎有些太麻烦了,Python提供了一个更加简略的方法:

def X2(n: int):
    for i in range(n):
        yield i*i


if __name__ == "__main__":
    for each in X2(10):
        print(each)

事实上,如下代码

    for each in X2(10):
        print(each)

    t = X2(10)
    while True:
        try:
            each = t.__next__()
        except StopIteration:
            break
        print(each)

是等价的。

能看出,for .. in ..的运行机制,就是不断地调用被迭代对象的.__next__()方法,直到捕获到StopIteration异常。

明白了这一点,很容易就能知道,Python的死循环写法至少有两种:while True:和使用for .. in ..迭代一个拥有__iter____next__方法的对象,并且这个对象的__next__方法永远不会抛出StopIteration异常。

附:next(g)g.__next__()都是调用了g__next__()方法,只不过next(g)可能看起来更友好一点。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转载自:深入讲解Python中的迭代器和生成器 在Python中,很多对象都是可以通过for语句来直接遍历的,例如...
    bobobe阅读 4,655评论 2 4
  • 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有...
    youngkun阅读 3,698评论 0 0
  • 住的这个小区也建好几年了,怎么周围一直在装修,钻啊钻啊。于是开大音乐,挡住钻的声音,周期性重复的声音实在是乱人心绪...
    KevinCool阅读 4,260评论 1 1
  • 一些基本概念 1 容器 可以询问某个元素是否包含其中,如list,set,tuples,dict等都是容器 2 迭...
    和黑黑阅读 3,933评论 0 5
  • https://zhuanlan.zhihu.com/p/26123333 要完全理解透生成器,需要我们先掌握三个...
    Lauzanhing阅读 3,118评论 0 0

友情链接更多精彩内容