理解迭代器与可迭代对象

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__()方法来获取列表里的值,这就是字符串,列表,字典遍历的原理。

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

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

经验分享 程序员 微信小程序 职场和发展