对于许多python初学者来说,可迭代对象,迭代器,生成器三者往往容易混淆,最简单判断的方法可以借助collections.abc模块和isinstance()进行判断
fromcollections.abcimportIterable, Iterator, Generator
L = [1,2,3]
print(isinstance(L, Iterable))#True
print(isinstance(L, Iterator))#False
print(isinstance(L, Generator))#False
上述示例说明列表是可迭代对象,但不是生成器和迭代器,python内置的字符串,字典,元组等都是可迭代对象,可迭代对象的特点就是可以用for循环取值遍历
实际上,可迭代对象是因为内部实现了__iter__方法,我们可以简单认为这个方法是一个协议,签署了这个协议的对象就可以被迭代,否则不行,可通过dir()函数查看对象是否拥有这个协议
迭代器其实就是在可迭代对象的基础上增加了__next__()方法,除了可以使用for循环取值还可以使用next()方法进行取值,迭代器是在可迭代对象的基础上实现的,也就是说迭代器一定是可迭代对象,接下来我们看一个简单的示例以及如何实现一个可迭代对象,并以可迭代对象为基础创建一个迭代器
fromcollections.abcimportIterator
aStr ='abcd'# 创建字符串,它是可迭代对象
aIterator = iter(aStr)# 通过iter(),将可迭代对象转换为一个迭代器
print(isinstance(aIterator, Iterator))# True
next(aIterator)# a
next(aIterator)# b
next(aIterator)# c
next(aIterator)# d
实现一个可迭代类并创建迭代器
fromcollections.abcimportIterable, Iterator, Generator
classMyList(object):# 定义可迭代对象类
def__init__(self, num):
self.end = num# 上边界
# 返回一个实现了__iter__和__next__的迭代器类的实例
def__iter__(self):
returnMyListIterator(self.end)
classMyListIterator():# 定义迭代器类
def__init__(self, end):
self.data = end# 上边界
self.start =
# 返回该对象的迭代器类的实例;因为自己就是迭代器,所以返回self
def__iter__(self):
returnself
# 迭代器类必须实现的方法
def__next__(self):
whileself.start
self.start +=1
returnself.start -1
raiseStopIteration
if__name__ =='__main__':
my_list = MyList(5)# 得到一个可迭代对象
print(isinstance(my_list, Iterable))# True
print(isinstance(my_list, Iterator))# False
# 迭代
foriinmy_list:
print(i)#1 2 3 4 5
my_iterator = MylistIterator()# 得到一个迭代器
print(isinstance(my_iterator, Iterable))# True
print(isinstance(my_iterator, Iterator))# True
# 迭代
print(next(my_iterator))# 0
print(next(my_iterator))# 1
print(next(my_iterator))# 2
print(next(my_iterator))# 3
print(next(my_iterator))# 4
迭代器是内部实现了__next__()方法,所以,我们可以通过dir()查看是否有__next__判读一个对象是否为迭代器
明天,我们继续研究在迭代器基础上实现的生成器,并且解释为何生成器可以在python编程中如此重要且受欢迎
领取专属 10元无门槛券
私享最新 技术干货