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__()方法来获取列表里的值,这就是字符串,列表,字典遍历的原理。
---------------------------------------------------------------------------------------------------------------------------------
本文是本人在学习可迭代对象与迭代器时的一些个人理解,如有错误之处欢迎留言指正。