? 优质资源分享 ?
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
? Python实战微信订餐小程序 ? | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
?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\_\_方法
res = '\_\_iter\_\_' in res_lst
print(res) # True
# 存在\_\_iter\_\_方法,说明确实是一个可迭代对象
定义迭代器
迭代器的表示方式是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) # 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函数配合循环遍历
转载请注明:xuhss » Python 函数进阶-迭代器