为什么所有Iterator都是Iterable,但并非所有Iterable都是Iterator?
我一直试图理解这句话:
所有迭代器(Iterator)都是可迭代对象(Iterable),但并非所有可迭代对象都是迭代器。
我理解Iterator和Iterable之间的区别,也明白后半句“并非所有可迭代对象都是迭代器”的含义。
可迭代对象是可被遍历的序列,迭代器是用于遍历可迭代对象的对象。
可迭代对象通过__iter__()方法生成迭代器对象。
那么,如果迭代器本身就是用来遍历事物的,它怎么能是可迭代对象呢?
更新1:找到核心答案
首先,感谢所有回复我的人。尽管这些回复有用、信息量丰富且有见地,但并没有完全回答我的问题。
答案与解释1:
首先,“所有Iterator都是Iterable”这句话中的“Iterable”并非指Iterator是像列表(list)、字典(dictionary)或集合(set)那样的可迭代对象,而是指Iterator也包含__iter__()方法。
我的下一个问题是:迭代器对象为什么要有__iter__()方法?迭代器对象的唯一用途就是使用它的__next__()方法。
后来我找到了答案:
“因为有时你会直接得到迭代器,例如打开的文件或生成器函数。”
我们要记住,循环首先必须调用给定对象的__iter__()方法,以获取用于遍历的迭代器对象。
但有些情况下,你会直接得到一个迭代器对象。为了能在循环中使用这个迭代器对象进行遍历,我们需要让循环的逻辑兼容这种情况。因此,迭代器对象内置了自己的__iter__()方法,该方法会返回自身。
这样就解决了问题!迭代器就能像可迭代对象一样直接用于循环遍历。
更新2:补充完整解读
有用户希望我完成对原语句的完整解读。
答案与解释2:
语句的第一部分:
Every Iterator is an Iterable...
解读:
所有Iterator都拥有
__iter__()方法
语句的第二部分:
but not every Iterable is an Iterator
解读:
但并非所有Iterable都拥有
__next__()方法
在Python中,有些对象同时拥有__iter__()和__next__()方法,这些对象既是Iterable也是Iterator。在这类对象中,__iter__()方法返回自身,因为它本身就是自己的迭代器。
示例代码:
class MyRange: def __init__(self, start, end): self.value = start self.end = end def __iter__(self): return self def __next__(self): if self.value >= self.end: raise StopIteration current = self.value self.value +=1 return current
用法:
nums = MyRange(1,10) for num in nums: print(num)
而像列表(list)、字典(dictionary)、元组(tuple)和集合(set)这类对象只是Iterable。它们只有__iter__()方法,并且该方法会返回一个独立的、拥有__next__()方法的迭代器对象。
……就是这样!
如果我的解释过于简单或浅显,我深表歉意。我的解释是针对像我这样的初级程序员,他们无法像其他人那样直观地理清其中的逻辑。
无论如何,希望这能帮助到某些人。干杯!
内容的提问来源于stack exchange,提问作者Walter M

