python 小知识 -rethinking python 迭代器
python 中的所有集合对象(如 str list dict set tuple)都是可迭代的对象,通过 iter()函数都可以变成一个迭代器。
迭代器就是可以通过序列方式顺序访问可迭代对象中的元素
实现了
__iter__
和__next__
的对象就是一个迭代对象
1.如何判断可迭代对象和迭代器
从上可知,可以通过Iterable
来判断是否可迭代, 通过Iterator
来判断是否是迭代器; 也可以通判断是否实现了__iter__
和__next__
来判断是否是迭代器和可迭代对象。
2.如何使用迭代器
可迭代对象和迭代器可以通过 for 循环访问对象中的元素;另外迭代器还可以通过 next()函数依次获取对象中的元素,如果没有元素时会抛出异常。其实 for 循环访问迭代器时内置了异常控制。
3.如何构建自己的迭代器和可迭代对象
可以通过实现__getitem__
函数和 iter 使得对象变成迭代器, pytorch 中的 dataloder 的输入基本上就是这么写的。__getitem__
要求迭代对象的 index。
标准的迭代器对象是需要实现__iter__
和__next__
两个功能,重要的是__next__来实现对你所需要迭代的对象进行元素访问。__next__
并不需要迭代器的索引,也可认为是无状态下访问迭代对象(只与前一个状态有关)。
4.python 内置的迭代器方法
python 中有许多好用的迭代器,主要是内置和在
itertools
包中accumulate:累积函数
enumerate: 提供迭代器的索引,十分有用
map: 映射函数
zip: 组合函数
chain:合并函数
reversed: 反转函数
条件判断函数:all 和 any
5.总结
这里和大家一起回顾了下 python 中的迭代器,总结如下:
实现了
__iter__
和__next__
的对象就是一个迭代对象通过 next()访问迭代器的下一个元素,直到抛出 StopIteration
通过实现
__getitem__
函数和 iter()使得对象变成迭代器通过 isinstance 判断是否是 Iterable 还是 Iterator
迭代器的好处就是可以迭代访问对象的元素,而不需要关注其索引位置,也就是在访问完当前元素之后这部分的内存损耗可以 del 掉,节省内存
有用的参考:https://nvie.com/posts/iterators-vs-generators/
版权声明: 本文为 InfoQ 作者【AIWeker】的原创文章。
原文链接:【http://xie.infoq.cn/article/6bfa8ca3dfc99ffe2ea81692d】。文章转载请联系作者。
评论