Python 函数进阶-迭代器(python培训)

网友投稿 246 2022-09-07


Python 函数进阶-迭代器(python培训)

迭代器

什么是迭代器

能被 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__方法# 存在__iter__方法,说明确实是一个可迭代对象res = '__iter__' in res_lstprint(res) # True

定义迭代器

迭代器的表示方式是​​iterator​​。

使用iter函数

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

lst = [1, 2, 3]print(type(lst)) # it = iter(lst)print(type(it)) #

使用\__iter__方法

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

lst = [1, 2, 3]print(type(lst)) # it = lst.__iter__()print(type(it)) #

生成器

见 ​​生成器​​详细说明。

判断迭代器

检查内置方法

存在​​__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模块中的​​Iterator​​​和​​Iterable​​​类型可以判断是否是可迭代对象或者是迭代器。​​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) # StopIterationprint(res)

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

lst = [1, 2, 3]lst_it = iter(lst)# 迭代器中一次只会取出一个数据print(next(lst_it)) # 1print(next(lst_it)) # 2print(next(lst_it)) # 3# 超出迭代器中的元素个数,就会报错print(next(lst_it)) # StopIteration# 迭代器中的数据是一次性的,不能重复使用# 如果需要重复使用迭代器,可以重置迭代器(重新定义一遍迭代器)lst_it = lst.__iter__() # 使用内置方法__iter__()也可以# 然后再次取出数据,也可以使用内置方法__next__()取值print(lst_it.__next__()) # 1print(lst_it.__next__()) # 2print(lst_it.__next__()) # 3

总结

使用next函数调用使用for循环遍历强转成为其它的数据类型(实测容器都可以转成迭代器,但是迭代器只有转成列表才会有内容)next函数配合循环遍历


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python图像处理丨OpenCV+Numpy库读取与修改像素
下一篇:硬货分享
相关文章

 发表评论

暂时没有评论,来抢沙发吧~