版权声明:转载 或者复制请标注来源 https://blog.csdn.net/qq_34979346/article/details/83900830
大家一定记得 list 是可以用for循环,具体怎么实现的呢,
这是本节的重点.
例如:
a=[1,2,3]
for i in a:
print(i)
我在之前的章节也讲到 , 类变成可迭代的对象 需要完成两个方法的任意一个,
- 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
以上的代码很简单,如果你看过我前面的章节,一定能看懂.
那我就再稍微的解释下 .
- i代表是 对象的下标(getitem 会返回一个迭代对象)
- v代表取到的值
- yield v 表示会把值保存在生成器.
- 如果报错,会返回生成器.
- 当for 循环调用next()的时候就是取到 while 每一次保存的V
谢谢大家的浏览,有好的建议或者写错的地方请在下边评论留言 ,谢谢