首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

可迭代对象,迭代器,生成器

对于许多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编程中如此重要且受欢迎

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180606G0QPK000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券