我们在 Python 中使用 for 循环迭代时到底做了什么
发布日期:2021-05-07 17:48:53 浏览次数:18 分类:技术文章

本文共 1158 字,大约阅读时间需要 3 分钟。

我们在 Python 中使用 for 循环迭代时到底做了什么

转载请注明出处:https://blog.csdn.net/jpch89/article/details/85532979


  • 使用 for 循环迭代一般写成:for i in x: ...

  • 首先看 x 是否实现了 __iter__ 方法,这个方法的返回值是一个迭代器。

    • 如果 x 实现了 x.__iter__() 方法,那么使用 iter(x) 得到 x 的迭代器 it_x
    • 然后对迭代器 it_x 不断地调用 next(it_x),把每次返回的元素给 i
    • 最终迭代器元素耗尽,捕获到 StopIteration 异常,终止迭代。
  • 如果 x 没有实现 __iter__ 方法,那么看它是否实现了 __getitem__ 方法。

    (序列类型 Sequence 都实现了 __len____getitem__ 方法,所以序列类型的对象都是可以用于 for 循环的。)

    • 如果实现了 __getitem__ 方法,那么开始把 x[0]x[1]x[2] 一直到 x[len(x) - 1] 不断地赋值给 i
    • 这里实际上执行的是 x.__getitem__(0)x.__getitem__(1)x.__getitem__(2) 一直到 x.__getitem__(len(x) - 1)
    • 最后执行到 x.__getitem__(len(x)) 时,在 __getitem__ 方法内部要抛出一个 IndexError 异常(StopIteration 也可以),从而终止迭代。
  • 举个例子,该类实现了 __getitem__ 方法,就可以用于 for 循环迭代:

class Test:    def __init__(self):        self.val = [1, 2, 3]    def __getitem__(self, i):        if i < len(self.val):            return self.val[i]        else:            raise IndexErrorx = Test()for i in x:    print(i)"""123"""
  • 如果 __iter____getitem__ 两个方法都实现了,会优先调用 x.__iter__() 方法。
  • 如果两个方法都没有实现,会抛出 TypeError 异常,提示:TypeError: '类名' object is not iterable

补充说明

从技术上讲,for 循环内部的调用情况等价于 it_x.__next__,而不是 next(it_x),尽管二者非常相似。


完成于 2019.1.1

上一篇:如何记忆和巩固大量编程知识和技巧
下一篇:Vim 实用技巧(持续更新中!)

发表评论

最新留言

很好
[***.229.124.182]2025年03月31日 18时10分00秒