Python3:生成器在UserList应用原理

版权声明:转载 或者复制请标注来源 https://blog.csdn.net/qq_34979346/article/details/83900830

大家一定记得 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
    谢谢大家的浏览,有好的建议或者写错的地方请在下边评论留言 ,谢谢

猜你喜欢

转载自blog.csdn.net/qq_34979346/article/details/83900830