Python浅析迭代器Iterator的使用

 更新时间:2022年07月22日 11:12:55   作者:Flyme awei  
这篇文章主要介绍了Python 迭代器Iterator详情,迭代器可以帮助我们解决面对复杂的数据场景时,快速简便的获取数据,下文关于其详细介绍,需要的小伙伴可以参考一下

前言

当我们需要对列表(list)、元组(tuple)、字典(dictionary)和集合(set)的元素进行遍历时,其实Python内部都是启动迭代器来完成操作的。

迭代器(Iterator)并非Python独有的,在C++和Java中也出现了此概念。迭代器可以帮助我们解决面对复杂的数据场景时,快速简便的获取数据。

迭代器是什么

迭代器是访问集合的一种方式。

迭代器是一个可以记住遍历位置的对象。

迭代器从集合的第一个元素开始访问,直到所有的元素被访问完才结束。

迭代器只能往往前,不能后退。

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型:如:list,tuple,dict,set,str等;

一类是generator,包括生成器和yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable.

那么怎么判断一组数据是不是Iterable对象呢?

可以使用instance()判断一个对象是否是Iterable对象。

from collections.abc import Iterable 
print(isinstance([1], Iterable))  # True
print(isinstance({0, 1}, Iterable))  # True
print(isinstance((1, ''), Iterable))  # True
print(isinstance({1: 10}, Iterable))  # True
print(isinstance((i for i in range(10)), Iterable))  # True
print(isinstance(10, Iterable))  # False
'''

⽣成器不但可以作⽤于 for 循环,还可以被 next() 函数不断调⽤并返回下⼀个值,直到最后抛出 StopIteration 错 误表示⽆法继续返回下⼀个值了。

可以被next()函数调⽤并不断返回下⼀个值的对象称为迭代器:Iterator。

可以使⽤ isinstance() 判断⼀个对象是 否是Iterator 对象,这里就产生一个疑问了,生成器都是 Iterator 对象, list 、 dict 、 str 是不是 Iterator ?为什么?。

list 、 dict 、 str 不是 Iterator ,因为Python的 Iterator 对象表示的是一个数据流,Iterator对象可以 被 next() 函数调用并不断返回下一个数据,直到没有数据时抛出 StopIteration 错误。

可以把这个数据流看做 是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过 next() 函数实现按需计算下一个数据,所以Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator 甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的 那我们还可以通过 isinstance() 来判断是否是 Iterator 对象

注意 Iterator 对象和 Iterable 对象,一个是迭代器,一个是可迭代对象

from collections.abc import Iterator
print(isinstance((i for i in range(10) if i % 2 == 0), Iterator))  # True
print(isinstance([], Iterator))  # False
print(isinstance({}, Iterator))  # False
print(isinstance('abc', Iterator))  # False

但是可以将 list 、 dict 、 str 等 Iterable 变成 Iterator,这里我们可以使用 iter() 函数

代码:

print(isinstance(iter([]), Iterator))  # True
print(isinstance(iter({}), Iterator))  # True
print(isinstance(iter('abc'), Iterator))  # True

所有可以作用于for循环的对象都是Iterable类型;

可以作用于next()函数的对象都是Ttreator类型,他们表示一个惰性计算序列;

集合数据类型list,dict,str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

自定义迭代器

class Myiter:
    def __init__(self,times):
        self.times = times
    def __iter__(self):
        self.n = 0
        return self
    def __next__(self):
        if self.n <= self.times:
           result = 3 ** self.n
            self.n += 1
            return result
        else:
            raise StopIteration
data = Myiter(4)
it = iter(data)
# 第1次
print(next(it))
# 第2次
print(next(it))
# 第3次
print(next(it))
# 第4次
print(next(it))
# 第5次
print(next(it))
# 第6次,超出范围触发StopIteration
print(next(it))
...
1
3
9
27
81
Traceback (most recent call last):
  File "E:\workspace\uiat\cookbooks\tester.py", line 67, in <module>
    print(next(it))
  File "E:\workspace\uiat\cookbooks\tester.py", line 51, in __next__
    raise StopIteration
StopIteration
...
  • 创建的对象/类需要实现 __iter__() 和 __next__()两个方法即可作为迭代器
  • 迭代器中__iter__()返回迭代器本身方法
  • 迭代器中__next__()方法允许进行其他操作,但是必须返回迭代器的下一项
  • 为了防止迭代永远进行下去,Python提供stopIterator语句,终止迭代

到此这篇关于Python浅析迭代器Iterator的使用的文章就介绍到这了,更多相关Python Iterator内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现图书借阅系统

    python实现图书借阅系统

    这篇文章主要为大家详细介绍了python实现图书借阅系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • python中函数的返回值及类型详解

    python中函数的返回值及类型详解

    这篇文章主要为大家介绍了python中函数的返回值及类型详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Python删除windows垃圾文件的方法

    Python删除windows垃圾文件的方法

    这篇文章主要介绍了Python删除windows垃圾文件的方法,涉及Python针对系统垃圾文件的查找与清理技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Python中Numpy的深拷贝和浅拷贝

    Python中Numpy的深拷贝和浅拷贝

    这篇文章主要介绍了Python中Numpy的深拷贝和浅拷贝,通过讲解Python中对Numpy数组操作的浅拷贝和深拷贝的概念和背后的原理展开全文,需要的小伙伴可以参考一下
    2022-05-05
  • Python字典及字典基本操作方法详解

    Python字典及字典基本操作方法详解

    这篇文章主要介绍了Python字典及字典基本操作方法,结合实例形式详细分析了Python字典的概念、创建、格式化及常用操作方法与相关注意事项,需要的朋友可以参考下
    2018-01-01
  • Python matplotlib绘图可视化知识点整理(小结)

    Python matplotlib绘图可视化知识点整理(小结)

    这篇文章主要介绍了Python matplotlib绘图可视化知识点整理(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • python设置代理和添加镜像源的方法

    python设置代理和添加镜像源的方法

    这篇文章主要介绍了python设置代理和添加镜像源介绍,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Python爬虫入门教程01之爬取豆瓣Top电影

    Python爬虫入门教程01之爬取豆瓣Top电影

    这篇文章主要介绍了Python爬虫入门教程01:豆瓣Top电影爬取的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 关于python pygame游戏进行声音添加的技巧

    关于python pygame游戏进行声音添加的技巧

    这篇文章主要给大家分享的是pygame游戏进行声音添加的方法,这文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
    2021-10-10
  • python进行OpenCV实战之画图(直线、矩形、圆形)

    python进行OpenCV实战之画图(直线、矩形、圆形)

    这篇文章主要为大家详细介绍了python进行OpenCV实战之画图功能,画出直线、矩形、圆形,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08

最新评论