Python函数进阶之迭代器的原理与使用详解

 更新时间:2022年04月21日 15:06:47   作者:小小垂髫  
能被 next 指针调用,并不断返回下一个值的对象,叫做迭代器。表示为Iterator,迭代器是一个对象类型数据。本文将详细为大家讲讲迭代器的原理及使用,感兴趣的可以学习一下

什么是迭代器

能被 next 指针调用,并不断返回下一个值的对象,叫做迭代器。表示为Iterator,迭代器是一个对象类型数据。

概念

迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代。

特征

迭代器并不依赖索引,而通过 next 指针迭代所有数据,一次只取一个值,大大节省空间。

惰性序列

惰性序列是指没有一次性的把所有数据都放在序列中,而是遍历一个放一个这样的序列,range对象和迭代器能够产生惰性序列。

检查可迭代对象

for循环的用于遍历可迭代对象,简单粗暴的来说,可以被for循环遍历的元素都是可迭代对象。for 循环能够遍历一切可迭代性数据的原因在于,底层调用了迭代器,通过next方法中的指针实现数据的获取。所以普通的非迭代器可迭代对象和迭代器之间的区别就是,一个不能直接使用next调用,一个可以被next指针调用。

再次重复一遍,可迭代对象不一定是迭代器,迭代器一定是一个可迭代对象

使用dir()函数可以查看一个数据中的所有的对象成员,如果包含有__iter__方法,说明就是一个可迭代对象。换句话说,__iter__方法的作用就是返回一个可迭代对象。

# 定义一个列表,列表是可迭代对象
lst = [1, 2, 3, 4, 5]

# 获取列表的所有成员
res_lst = dir(lst)

print(res_lst)
'''
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
'''

# 查看是否存在__iter__方法
res = '__iter__' in res_lst

print(res)  # True

# 存在__iter__方法,说明确实是一个可迭代对象

定义迭代器

迭代器的表示方式是iterator

使用iter函数

使用 iter 函数将一个普通的可迭代对象转成迭代器。

lst = [1, 2, 3]
print(type(lst))    # <class 'list'>
it = iter(lst)
print(type(it))     # <class 'list_iterator'>

使用__iter__方法

使用 __iter__ 内置方法实现可迭代对象转成迭代器。

lst = [1, 2, 3]
print(type(lst))    # <class 'list'>
it = lst.__iter__()
print(type(it))     # <class 'list_iterator'>

判断迭代器

检查内置方法

存在__iter__方法说明是可迭代对象。存在 __next__ 方法说明是迭代器,因为迭代器可以使用next指针获取元素。

迭代器中,__iter____next__都存在。

产卡是可迭代对象。

# 列表
lst = list()

# 迭代器
lst_it = iter(lst)

# 迭代器中的所有成员
res_lst = dir(lst_it)

# 判断
if '__iter__' in res_lst:
	print('lst_it是一个可迭代对象')

if '__next__' in res_lst:
	print('lst_it是一个迭代器')

'''
结果:
lst_it是一个可迭代对象
lst_it是一个迭代器
'''

使用collections模块

导入collections模块中的IteratorIterable类型可以判断是否是可迭代对象或者是迭代器。Iterator是迭代器类型数据。Iterable是可迭代对象类型数据。利用导入的数据类型配合isinstance函数就可以判断数据的类型。

lst = list()

lst_it = iter(lst)

# 判断是否是迭代器
res = isinstance(lst_it, Iterator)
print(res)  # True

# 判断是否是可迭代对象
res = isinstance(lst_it, Iterable)
print(res)  # True

调用迭代器

调用迭代器的几种方法

  • 使用next函数或者是__next__内置方法一个一个、一遍一遍的获取其中的数据;
  • 使用for循环遍历出来;
  • 使用while循环配合next函数或者是__next__内置方法;
  • 强转成为其它的数据类型;

使用next方法和函数

调用迭代器使用next函数才可以取出其中的内容,next 在调用迭代器中的数据时单向不可逆的,是一条路走到黑的过程,如果调用超出迭代器中的元素个数,会报错StopIteration ,意为停止迭代。

# 因为lst本没有数据,所以无法取出数据
lst = list()
lst_it = iter(lst)
res = next(lst_it)  # StopIteration
print(res)

取出迭代器中的数据,如果数据全部取出要重置迭代器才能再次取出。

lst = [1, 2, 3]

lst_it = iter(lst)

# 迭代器中一次只会取出一个数据
print(next(lst_it))  # 1
print(next(lst_it))  # 2
print(next(lst_it))  # 3

# 超出迭代器中的元素个数,就会报错
print(next(lst_it))  # StopIteration

# 如果要重新取出数据,就重置迭代器,重新定义一边迭代器就是重置迭代器
lst_it = iter(lst)

# 再次取出数据,使用__next__方法
print(lst_it.__iter__())  # 1
print(lst_it.__iter__())  # 2
print(lst_it.__iter__())  # 3

总结

使用next函数调用

使用for循环遍历

强转成为其它的数据类型(实测容器都可以转成迭代器,但是迭代器只有转成列表才会有内容)

next函数配合循环遍历

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

相关文章

  • Python时间获取及转换知识汇总

    Python时间获取及转换知识汇总

    这篇文章主要介绍了Python时间获取及转换知识汇总的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • python3+PyQt5实现文档打印功能

    python3+PyQt5实现文档打印功能

    这篇文章主要为大家详细介绍了python3+PyQt5实现文档打印功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Python 解决中文写入Excel时抛异常的问题

    Python 解决中文写入Excel时抛异常的问题

    下面小编就为大家分享一篇Python 解决中文写入Excel时抛异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 深入浅析python 中的self和cls的区别

    深入浅析python 中的self和cls的区别

    这篇文章主要介绍了python 中的self和cls的实例代码及区别讲解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • conda安装tensorflow和conda常用命令小结

    conda安装tensorflow和conda常用命令小结

    这篇文章主要介绍了conda安装tensorflow和conda常用命令小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Python利用多线程优化for循环的技巧分享

    Python利用多线程优化for循环的技巧分享

    多线程可以让程序同时执行多个任务,从而提高整体运行效率,这篇文章将详细介绍如何在Python中使用多线程来优化for循环,感兴趣的可以了解下
    2025-02-02
  • Python提示[Errno 32]Broken pipe导致线程crash错误解决方法

    Python提示[Errno 32]Broken pipe导致线程crash错误解决方法

    这篇文章主要介绍了Python提示[Errno 32]Broken pipe导致线程crash错误解决方法,是ThreadingHTTPServer实现http服务中经常会遇到的问题,需要的朋友可以参考下
    2014-11-11
  • Python利用reportlab实现制作pdf报告

    Python利用reportlab实现制作pdf报告

    这篇文章主要为大家详细介绍了reportlab生成流文件格式、reportlab分页和图片流文件写入reportlab等内容,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-12-12
  • Python对口红进行数据分析来选定情人节礼物

    Python对口红进行数据分析来选定情人节礼物

    情人节送小仙女什么礼物?让我们来用Python对口红进行数据分析,那个女孩子会拒绝这样精心挑选的礼物,感兴趣的小伙伴快来看看吧
    2022-02-02
  • django框架使用方法详解

    django框架使用方法详解

    这篇文章主要介绍了django框架使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论