随笔 - 13,  文章 - 0,  评论 - 6,  阅读 - 16510

一、什么是迭代器

我是这样理解:如果你的某个对象可以用for循环去遍历出里面的所有的值,那么他就可以作为迭代器。当然你也可以使用collections库里面的Iterable,使用isinstance([],Iterable)判断该对象是否是迭代,代码放在下端

1
2
3
from collections import Iterable
# 输出true为可迭代,false为不可迭代对象
print(isinstance([], Iterable))

二、可迭代对象的本质

分析:对可迭代对象进行迭代使用的过程,每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。那么,在这个过程中就应该有一个“人”去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据。我们把这个能帮助我们进行数据迭代的“人”称为迭代器(Iterator)。

三、类中如何实现迭代器

首先我们要理解迭代器,迭代器就是能够使用循环的方式,获取你对象中的所有值。例如再python中list、tuple、str类型都可以称为可迭代对象。可迭代对过程其实也很简单,我们用list举个栗子。

1
2
3
4
5
6
7
8
# 创建一个对象
lists = list[1,2,3,4,5,6]
# 创建一个索引值
index = 0
# 遍历对象内的所有制,被称为迭代过程
while True:
    print(list[index])
    index += 1

  那么如果在类中我们是否可以这样实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from collections import Iterable
class TestIterable:
    def __init__(self):
        self.lists = [1, 2, 3, 4, 5, 6]
        self.index = -1
    def __iter__(self):
        return self
 
    def __next__(self):
        self.index +=1
        if self.index < len(self.lists):
            return self.lists[self.index]
        else:
            raise StopIteration
 
s = TestIterable()
print(isinstance(s,Iterable))
for i in s:
    print(i)

现在开始解释为什么要这样实现。首先在迭代器使用过程中,类的方法里面有默认的魔术方法 __iter__和__next__两种。

  __iter__表示让对象变为可迭代对象,然后他的返回值要是一个迭代器,你自身拥有__iter__方法。所以他就是一个迭代器,我们只需要返回他自身即可。

  __next__对象是对访问对象的值,每次迭代过程都会获取__next__的值。所以我们把需要迭代的值,用index去控制他的索引位置。那么我们就可以是这个类变为可迭代的对象。当然你也可以试过之后尝试,使用__next__返回其他的类,这样或有意想不到的结果。最后万物皆对象。

 

  

posted on   归雁  阅读(80)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Live2D
点击右上角即可分享
微信分享提示