广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python函数进阶之迭代器的原理与使用详解
  • 886
分享到

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

2024-04-02 19:04:59 886人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是迭代器概念特征惰性序列检查可迭代对象定义迭代器使用iter函数使用__iter__方法判断迭代器检查内置方法使用collections模块调用迭代器使用next方法和函数什

什么是迭代器

能被 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迭代器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python函数进阶之迭代器的原理与使用详解

本文链接: https://www.lsjlt.com/news/117450.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python函数进阶之迭代器的原理与使用详解
    目录什么是迭代器概念特征惰性序列检查可迭代对象定义迭代器使用iter函数使用__iter__方法判断迭代器检查内置方法使用collections模块调用迭代器使用next方法和函数什...
    99+
    2022-11-10
  • 详解Python中迭代器和生成器的原理与使用
    目录1.可迭代对象、迭代器1.1概念简介1.2可迭代对象1.3迭代器1.4区分可迭代对象和迭代器1.5可迭代对象和迭代器的关系1.6可迭代对象和迭代器的工作机制1.7自己动手创建可迭...
    99+
    2022-11-11
  • 详解Python中递归函数的原理与使用
    目录什么是递归函数递归函数的条件定义一个简单的递归函数代码解析内存栈区堆区死递归尾递归实例什么是递归函数 如果一个函数,可以自己调用自己,那么这个函数就是一个递归函数。 递归,递就是...
    99+
    2022-11-10
  • Python教程之无限迭代器的使用详解
    目录无限迭代器计数(开始,步骤)循环(可迭代)重复(值、数)Python的Itetool是一个模块,它提供了各种函数,这些函数在迭代器上工作以产生复杂的迭代器。该模块作为一个快速,内...
    99+
    2022-11-11
  • Python学习之迭代器的使用教程详解
    目录Python 迭代器迭代器 VS 可迭代对象(Iterable)遍历迭代器创建迭代器StopIterationPython 迭代器 迭代器是一种对象,该对象包含值的可计数数字。 ...
    99+
    2023-03-06
    Python迭代器使用 Python迭代器
  • Python学习之函数的定义与使用详解
    目录函数的定义函数的分类函数的创建方法-def函数的返回值-returnreturn与print的区别函数的传参必传参数默认参数不确定参数(可变参数)参数规则函数小练习函数的参数类型...
    99+
    2022-11-13
  • 一文详解Python中生成器的原理与使用
    目录什么是生成器迭代器和生成器的区别创建方式生成器表达式基本语法生成器函数yield关键字yield和returnyield的使用方法生成器函数的基本使用send的使用可迭代对象的优...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作