阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Python可迭代的对象与迭代器

33次阅读
没有评论

共计 1364 个字符,预计需要花费 4 分钟才能阅读完成。

导读 什么是迭代? 迭代是指按需一次获取一个数据。是否可以迭代,可以通过是否可以使用 for 循环取值来进行简单的判断。更准确的判断是使用 iter() 函数,这是一个 Python 内置函数。

Python 可迭代的对象与迭代器

可迭代的对象

iter() 函数的作用如下:

如果对象实现了__iter__方法,那么就调用它,获取一个迭代器。比如:

def __iter__(self): 
 
return SentenceIterator(self.words)

如果对象没有实现__iter__但是实现了__getitem__方法,那么就创建一个迭代器,尝试从索引 0 开始获取元素。

如果尝试获取元素失败,就会抛出 TypeError 异常。

可迭代的对象,就是使用 iter() 函数判断,满足前面 2 点的对象。

任何 Python 序列都是可以迭代的,因为它们都实现了__getitem__方法。

迭代器

从前面 iter() 函数的作用可以发现,迭代器是从可迭代的对象中获取的。

如果对象本身是可迭代的,就调用__iter__方法获取一个迭代器。

如果对象不可迭代但是实现了__getitem__方法,那么就会创建一个迭代器。

比如可以使用 iter() 函数把列表转换为迭代器:

>>> test_list = [1, 2, 3] 
>>> print(type(test_list)) 
&ltclass 'list'&gt
 
>>> test_iter = iter(test_list) 
>>> print(type(test_iter)) 
&ltclass 'list_iterator'&gt

迭代器可以使用 for 循环遍历:

for x in test_iter: 
 
print(x)

也可以使用 while 循环遍历:

while True: 
 
try: 
 
print(next(test_iter)) 
 
except StopIteration: 
 
del test_iter 
 
break
  • next() 函数用于获取迭代器下一个元素。
  • 没有元素了,迭代器会抛出 StopIteration 异常。

标准的迭代器接口有两个方法:

  • __next__返回下一个元素。
  • __iter__返回 self,以便在应该使用可迭代对象的地方使用迭代器,比如 for 循环中。
def __iter__(self): 
 
return self

迭代器的准确定义是:迭代器是这样的对象,它实现了无参数的__next__方法,返回序列中的下一个元素; 如果没有元素了,那么抛出 StopIteration 异常。Python 中的迭代器还实现了__iter__方法,因此迭代器也是可以迭代的。

最后,通过对比可以发现,可迭代对象的__iter__返回的是迭代器:

def __iter__(self): 
 
return SentenceIterator(self.words)

迭代器的__iter__返回的是 self:

class SentenceIterator: 
 def __iter__(self): 
 
return self

而且迭代器还需要有__next__方法。

从这一点就能清楚看出它们的区别了。

需要特别注意的是,可迭代的对象一定不能是自身的迭代器,也就是说,可迭代对象必须实现__iter__方法,但是不能实现__next__方法。否则会让设计模式变得混乱不堪。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1364字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中