码迷,mamicode.com
首页 > 其他好文 > 详细

迭代器原理

时间:2018-07-09 19:21:47      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:class   pre   foo   ini   自己   log   text   技术   blog   

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

迭代器原理

标签:class   pre   foo   ini   自己   log   text   技术   blog   

原文地址:http://blog.51cto.com/853056088/2139409

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!