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...来遍历迭代对象是最常用的方式