理解迭代器与可迭代对象

1.迭代器

迭代器中必须包含__iter__()和__next__()方法。

下面我们来创建一个迭代器类。

class IT(object):
    # __init__()方法在类实例化时被执行,创建一个count变量,并且值为0    
    def __init__(self):        
        self.count = 0
     
    # __iter__()方法返回实例化类的对象
    def __iter__(self):        
        return self
       
    # __next__()方法,执行一个count的值加1,当count=3时抛出StopIteration异常并返回count
    def __next__(self):
        self.count += 1
        if self.count == 3:
            raise StopIteration
        return self.count

对IT这个类进行实例化

it = IT()

此时这个it就是迭代器对象。

print(it.count)       

 打印count的值,为__init__()方法中设置的0,说明在对IT类实例化时,默认执行了__init__()方法。

print(it.__next__())
print(it.__next__())
print(it.__next__())

可以看到执行第三次__next__()方法时报错,是一个StopIteration异常,原因是IT类中__next__()方法中当count==3时就抛出StopIteration异常。

———————————————————————————————————————————

下面重新创建一个类

class ITer:

        def __init__(self):

               self.count = 0

        def __iter__(self):

                return IT()

对比此处的与上面IT类中的

IT类是一个迭代器类,return self是返回类的实例化对象,也就是一个迭代器对象,而在ITer类中,返回IT(),也是返回一个IT类的实例化对象,也就是一个迭代器对象。所以本质上不管在何处,__iter__()都是返回一个迭代器对象。

给ITer类实例化一个对象itt = ITer(),此时itt就是一个可迭代对象,调用dir(itt)结果如下:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'count']

可以看到只有__iter__()方法,没有__next__()方法。说明可迭代对象只有__iter__()方法。

 再执行itt.__iter__()

itter = itt.__iter__(),调用dir(itter)结果如下:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'count']

此时itter中有__iter__()和__next__(),说明itter是一个迭代器对象。

由此可以总结出可迭代对象只要只要执行了__iter__()方法,就会生成一个迭代器对象。

那什么时候可迭代对象会执行__iter__()方法呢?

我们创建一个字符串,一个列表,一个字典。

str = 'kuailexuepython'
print(dir(str))
li = [1, 2, 3, 'python']
print(dir(li))       
dic = {'name': 'zhangsan', 'age': 19}
print(dir(dic))

通过dir()方法可以看到只有__iter__(),没有__next__(),(这里就不贴图片了,可以自己运行下是否一致)。

说明字符串,列表,字典都是可迭代对象。

这里用列表举例,在使用for循环进行遍历列表时,首先执行列表的__iter__()方法来获取一个迭代器对象,然后不断的执行迭代器对象的__next__()方法来获取列表里的值,这就是字符串,列表,字典遍历的原理。

---------------------------------------------------------------------------------------------------------------------------------

本文是本人在学习可迭代对象与迭代器时的一些个人理解,如有错误之处欢迎留言指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值