Python3:生成器在UserList应用原理

本文深入探讨Python中迭代器(iter)和可迭代对象的工作原理,解析如何通过__iter__和__getitem__方法使类具备迭代能力,揭示for循环背后的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家一定记得 list 是可以用for循环,具体怎么实现的呢,
这是本节的重点.

例如:

a=[1,2,3]

for i in a:
    print(i)

我在之前的章节也讲到 , 类变成可迭代的对象 需要完成两个方法的任意一个,

  1. iter , 2.getitem

就可以进行for循环进行遍历.

这到底原理是什么呢 ?

我们先看下边的代码:

class  A:
    def __iter__(self):
        pass
    def __getitem__(self, item):
        pass

a=A()

for i  in a:
    print(i)

实际for循环 里暗藏了一个 iter()函数, 会找 class A的 iter, 如果找不到 会退而求其次,
去找 模拟的__iter__函数 ,例如上边的是 getitem

我们会发现 关键点还是在__ iter__ 函数 . 为了追求真理我们必须剖析找个函数.

注意 我们不能直接查看 list源码 ,不信你可以试试,因为它是C 语言写的,同样也不能继承
那怎么办呢,难不倒强大的python
可以用UserList , 它是python 的方式去解释List .
先打开 UserList :

from collections import UserList

打开后我们看到 它继承了MutableSequence ,继续打开MutableSequence

lass UserList(MutableSequence):

MutableSequence 继承 Sequence (序列)

class MutableSequence(Sequence):

继续打开 Sequence ,终于找到了重写的 iter

class Sequence(Reversible, Collection):

    @abstractmethod
    def __getitem__(self, index):
        raise IndexError

    def __iter__(self):
        i = 0
        try:
            while True:
                v = self[i]
                yield v
                i += 1
        except IndexError:
            return

以上的代码很简单,如果你看过我前面的章节,一定能看懂.

那我就再稍微的解释下 .

  1. i代表是 对象的下标(getitem 会返回一个迭代对象)
  2. v代表取到的值
  3. yield v 表示会把值保存在生成器.
  4. 如果报错,会返回生成器.
  5. 当for 循环调用next()的时候就是取到 while 每一次保存的V
    谢谢大家的浏览,有好的建议或者写错的地方请在下边评论留言 ,谢谢
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值