迭代器原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器原理相关的知识,希望对你有一定的参考价值。

python中的迭代器是由iternext组成的,
知道了原理我们也可以自己来写个迭代器
我们可以用next()或是用循环去对一个可迭代对象做处理

class Foo:
    pass

f1= Foo()

for i in  f1:
    print(i)

技术分享图片
由这个报错我们可以看出,Foo这个对象不是可迭代的,要变成可迭代的,iter必须要返回一个可迭代的形式

我们把它变成可迭代器:

class Foo:
    def __iter__(self):
        return  1

f1= Foo()

for i in  f1:
    print(i)

技术分享图片
我们加上了iter就把一个类变成了一个可迭代形式了.
但是报错说我们返回的不是一个迭代器
我们手动写一个迭代器,然后让iter迭代
lt=iter([1,2,3,4])

class Foo:
    def __iter__(self):
        return  lt
print(type(lt))
f1= Foo()
for i in  f1:
    print(i)

技术分享图片

诶,这就是一个迭代器了,但是我们需要的是一个迭代对象,而不是多此一举的一个迭代器传值给另一个迭代器
这个是一个迭代器,但是不是一个可迭代对象,原因是缺少了next
我们加上next把它变成一个可迭代对象

class Foo:
    def __iter__(self):
        return  self
    def __next__(self):
        return 1
f1= Foo()

for i in  f1:
    print(i)

技术分享图片

这样我们就可以把Foo这个类变成了一个可迭代的对象了
我们不用for循环同样可以

对代码优化一下:

class Foo:
    def __init__(self,n):
        self.n=n
    def __iter__(self):
        # print(‘111‘,self.n)
        return  self
    def __next__(self):
        if self.n >9:
            exit()
        self.n+=1
        return self.n
f1= Foo(5)
print(next(f1))
for i in  f1:
    print(i)

输出结果为:
技术分享图片

总结:

1.迭代器一定是迭代对象,迭代对象不一定是迭代器

2.生成器一定是迭代器,迭代器不一定是生成器

3.使用for...in...来遍历迭代对象是最常用的方式

以上是关于迭代器原理的主要内容,如果未能解决你的问题,请参考以下文章

迭代器原理

递归迭代和分治:迭代器原理

13. 迭代器失效问题迭代器失效底层原理及实现

Java--迭代器(Iterator)迭代原理

Java集合框架--Collection接口的使用 & 迭代器(Iterator)遍历原理

Javascript Symbol之迭代器让对象支持for..of遍历