- 什么是可迭代对象?
一个对象如果实现了__iter__这个魔术方法就是一个可迭代对象。
- 什么是迭代器?
一个对象如果实现了__iter__与__next__这个两个魔术方法就是一个迭代器。
- 用代码来论证以上说法
# 首先我们定义两个类。一个没有实现__next__方法, 一个实现。 class Myiter1(object): def __init__(self): ... def __iter__(self): return self class Myiter2(object): def __init__(self): ... def __iter__(self): return self def __next__(self): return 1 # 我们导入collections中的Iterable, Iterator from collections import Iterable, Iterator # 判断 Myiter1 是不是可迭代对象 print(isinstance(Myiter1(), Iterable)) 结果:True # 判断 Myiter1 是不是迭代器 print(isinstance(Myiter1(), Iterator)) 结果:False # 判断 Myiter2 是不是可迭代对象 print(isinstance(Myiter2(), Iterable)) 结果:True # 判断 Myiter2 是不是迭代器 print(isinstance(Myiter2(), Iterator)) 结果:True ------------------------------------------------------------------------------------------------- # 我们再使用一种论证方法 # 我们使用for循环去遍历一个没有实现__next__方法的对象 for i in Myiter1(): print(i) 结果: Traceback (most recent call last): File ".\000.py", line 50, in <module> for i in Myiter1(): TypeError: iter() returned non-iterator of type 'Myiter1' 它给我们报了一个错误! 错误翻译过来就是:TypeError: iter()返回类型为“Myiter1”的非迭代器 # 我们使用for循环去遍历一个实现了__next__方法的对象 for i in Myiter2(): print(i) 结果为 1
经上述代码得出结论:
- 如果只实现了__iter__方法,但是没有实现__next__方法,那么它只是一个可迭代对象。而不是一个迭代器。
- 如果即实现了__iter__方法,又实现了__next__方法,那么它既是一个迭代器,也是一个可迭代对象。