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_lst
print(res)  # True

定义迭代器

迭代器的表示方式是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

调用迭代器

调用迭代器的几种方法

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

使用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 = lst.__iter__()  # 使用内置方法__iter__()也可以


# 然后再次取出数据,也可以使用内置方法__next__()取值
print(lst_it.__next__())  # 1
print(lst_it.__next__())  # 2
print(lst_it.__next__())  # 3

总结

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

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 函数进阶-迭代器 - Python技术站

(0)
上一篇 2023年4月2日 下午5:44
下一篇 2023年4月2日

相关文章

  • Python 函数进阶-递归函数

    递归函数 什么是递归函数 如果一个函数,可以自己调用自己,那么这个函数就是一个递归函数。 递归,递就是去,归就是回,递归就是一去一回的过程。 递归函数的条件 一般来说,递归需要边界条件,整个递归的结构中要有递归前进段和递归返回段。当边界条件不满足,递归前进,反之递归返回。就是说递归函数一定需要有边界条件来控制递归函数的前进和返回。 定义一个简单的递归函数 #…

    Python开发 2023年4月2日
    00
  • Python 函数进阶-lambda匿名函数和三元运算符

    匿名函数 什么是匿名函数 用一句话表达只有返回值的函数就是匿名函数。 匿名函数只用来实现一些简单的函数功能,所以追求代码的简洁和高效。 使用关键字 lambda 定义,所以匿名函数又称之为lambda表达式。 分类 无参数的 lambda 表达式 # 普通函数 def func(): return ‘hello motherland’ # 调用 res = …

    Python开发 2023年4月2日
    00
  • python 函数进阶-闭包函数

    闭包函数 什么是闭包函数 如果内函数使用了外函数的局部变量,并且外函数把内函数返回出来的过程叫做闭包,里面的内函数是闭包函数。 # 外函数 outer def outer(): # 外函数变量 num var = ‘外函数局部变量’ # 内函数 inner def inner(): # 内函数使用了外函数的变量 num print(‘内函数使用了:’ + v…

    Python开发 2023年4月2日
    00
  • python常用标准库(压缩包模块zipfile和tarfile)

    常用的标准库 在我们常用的系统windows和Linux系统中有很多支持的压缩包格式,包括但不限于以下种类:rar、zip、tar,以下的标准库的作用就是用于压缩解压缩其中一些格式的压缩包。 zip格式 import zipfile zipfile模块操作压缩包使用ZipFile类进行操作,使用方法和open的使用方法很相似,也是使用r、w、x、a四种操作模…

    Python开发 2023年4月2日
    00
  • Python 函数进阶-全局空间和局部空间

    全局空间和局部空间 命名空间 命名空间的概念的提出是为了划分和控制变量是否可见,以及生存周期的长短;命名空间的作用范围叫做作用域。 划分一块区域保存所有数据,以字典的方式存储(变量与值形成映射关系)。一共三种。 内建命名空间: 解释器启动时创建,直到解释器运行结束,生存周期最长; 全局命名空间: 文件运行时创建,直到解释器运行结束,生存周期较长; 局部命名空…

    Python开发 2023年4月2日
    00
  • python常用内置函数和关键字

    常用内置方法 在Python中有许许多多的内置方法,就是一些Python内置的函数,它们是我们日常中经常可以使用的到的一些基础的工具,可以方便我们的工作。 查看所有的内置类和内置方法 # 方法一 built_list = dir(__builtins__) # 方法二 import builtins built_list = dir(builtins) 其中…

    Python开发 2023年4月2日
    00
  • python常用标准库(os系统模块、shutil文件操作模块)

    常用的标准库 系统模块 import os 系统模块用于对系统进行操作。 常用方法 os模块的常用方法有数十种之多,本文中只选出最常用的几种,其余的还有权限操作、文件的删除创建等详细资料可以参考官方文档。 system — 执行系统命令 参数的数据类型是字符串格式,内容是系统指令。执行时,直接返回系统输出。 import os os.system(‘ifc…

    Python开发 2023年4月2日
    00
  • Python常用标准库(pickle序列化和JSON序列化)

    常用的标准库 序列化模块 import pickle 序列化和反序列化 把不能直接存储的数据变得可存储,这个过程叫做序列化。把文件中的数据拿出来,回复称原来的数据类型,这个过程叫做反序列化。 在文件中存储的数据只能是字符串,或者是字节流,不能是其它的数据类型,但是如果想要将其存储就需要序列化。 Python中的序列化模块叫做 pickle,PHP等其它的一些…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部