前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python可迭代的对象与迭代器的对比

Python可迭代的对象与迭代器的对比

作者头像
dongfanger
发布2021-11-30 21:55:45
1.6K0
发布2021-11-30 21:55:45
举报
文章被收录于专栏:dongfanger

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

可迭代的对象

iter()函数的作用如下:

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

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

迭代器

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

  1. 如果对象本身是可迭代的,就调用__iter__方法获取一个迭代器。
  2. 如果对象不可迭代但是实现了__getitem__方法,那么就会创建一个迭代器。

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

代码语言:javascript
复制
>>> test_list = [1, 2, 3]
>>> print(type(test_list))
<class 'list'>

>>> test_iter = iter(test_list)
>>> print(type(test_iter))
<class 'list_iterator'>

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

代码语言:javascript
复制
for x in test_iter:
    print(x)

也可以使用while循环遍历:

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

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

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

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

代码语言:javascript
复制
def __iter__(self):
    return SentenceIterator(self.words)

迭代器__iter__返回的是self:

代码语言:javascript
复制
class SentenceIterator:
    def __iter__(self):
        return self

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

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

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

参考资料: 《流畅的Python》第14章 可迭代的对象、迭代器和生成器 https://www.runoob.com/python3/python3-iterator-generator.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 可迭代的对象
  • 迭代器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档