使用pycharm,查看可迭代对象(iterable)和迭代器(iterator)的源码
from collections import Iterable, Iterator
Iterable源码如下:
class Iterable(metaclass=ABCMeta):
__slots__ = ()
@abstractmethod
def __iter__(self):
while False:
yield None
@classmethod
def __subclasshook__(cls, C):
if cls is Iterable:
return _check_methods(C, "__iter__")
return NotImplemented
iterator源码如下:
class Iterator(Iterable):
__slots__ = ()
@abstractmethod
def __next__(self):
'Return the next item from the iterator. When exhausted, raise StopIteration'
raise StopIteration
def __iter__(self):
return self
@classmethod
def __subclasshook__(cls, C):
if cls is Iterator:
return _check_methods(C, '__iter__', '__next__')
return NotImplemented
Iterator.register(bytes_iterator)
Iterator.register(bytearray_iterator)
#Iterator.register(callable_iterator)
Iterator.register(dict_keyiterator)
Iterator.register(dict_valueiterator)
Iterator.register(dict_itemiterator)
Iterator.register(list_iterator)
Iterator.register(list_reverseiterator)
Iterator.register(range_iterator)
Iterator.register(longrange_iterator)
Iterator.register(set_iterator)
Iterator.register(str_iterator)
Iterator.register(tuple_iterator)
Iterator.register(zip_iterator)
可以对比出两者的源码,得出结论如下:
(1)可迭代对象包含迭代器,因为迭代器继承自可迭代对象
(2)如果一个对象拥有__iter__
方法,其是可迭代对象;如果一个对象拥有__next__
方法,其是迭代器。
(3)定义可迭代对象,必须实现__iter__
方法;定义迭代器,必须实现__iter__
和__next__
方法。