共计 2816 个字符,预计需要花费 8 分钟才能阅读完成。
迭代器
什么是迭代器
能被 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 函数将一个一般的可迭代对象转成迭代器。
应用 \__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 模块中的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) # 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 技术大本营,获取更多技能与教程。