Python可迭代的对象与迭代器的对比
2023-03-20 15:29:09 时间
什么是迭代?迭代是指按需一次获取一个数据。是否可以迭代,可以通过是否可以使用for循环取值来进行简单的判断。更准确的判断是使用iter()
函数,这是一个Python内置函数。
可迭代的对象
iter()
函数的作用如下:
可迭代的对象,就是使用iter()
函数判断,满足前面2点的对象。
任何Python序列都是可以迭代的,因为它们都实现了__getitem__
方法。
迭代器
从前面iter()
函数的作用可以发现,迭代器是从可迭代的对象中获取的。
- 如果对象本身是可迭代的,就调用
__iter__
方法获取一个迭代器。 - 如果对象不可迭代但是实现了
__getitem__
方法,那么就会创建一个迭代器。
比如可以使用iter()
函数把列表转换为迭代器:
>>> test_list = [1, 2, 3]
>>> print(type(test_list))
<class 'list'>
>>> test_iter = iter(test_list)
>>> print(type(test_iter))
<class 'list_iterator'>
迭代器可以使用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__
方法,返回序列中的下一个元素;如果没有元素了,那么抛出StopIteration异常。Python中的迭代器还实现了__iter__
方法,因此迭代器也是可以迭代的。
最后,通过对比可以发现,可迭代对象的__iter__
返回的是迭代器:
def __iter__(self):
return SentenceIterator(self.words)
迭代器的__iter__
返回的是self:
class SentenceIterator:
def __iter__(self):
return self
而且迭代器还需要有__next__
方法。
从这一点就能清楚看出它们的区别了。
需要特别注意的是,可迭代的对象一定不能是自身的迭代器,也就是说,可迭代对象必须实现__iter__
方法,但是不能实现__next__
方法。否则会让设计模式变得混乱不堪。
参考资料: 《流畅的Python》第14章 可迭代的对象、迭代器和生成器 https://www.runoob.com/python3/python3-iterator-generator.html
相关文章
- Python中的函数与方法 以及Bound Method和Unbound Method
- 一文贯通python文件读取
- Python 中的异步编程:Asyncio
- 7个你现在就该学习Python的理由
- 提高Python运行效率的六个窍门
- Python数据科学:神经网络
- 一篇文章看懂大数据分析就业前景及职能定位
- R和Python中的文本挖掘:8个入门小贴士
- 告诉你为什么Python有点慢,但我却无所谓?
- 专注学习DevOps编程语言Top 5推荐
- Python发送邮件脚本
- Python多进程并行编程实践: mpi4py 的使用
- Python语言在未来的发展前景
- Python vs Ruby: 谁是最好的 web 开发语言?
- Python对Ruby:谁在Web开发领域更胜一筹?
- Python一行代码完成并行任务
- Python开发者2017应该关注的七个类库
- python爬虫入门基本知识
- 在终端中优雅地编写Python
- Python机器学习实战:信用卡欺诈检测