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)) # <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模块中的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 函数进阶-迭代器的更多相关文章
- 5 Python3 函数进阶&迭代器与生成器
1.函数进阶 1.1.名称空间 又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的 ...
- python函数进阶(函数参数、返回值、递归函数)
函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形 ...
- Python函数系列-迭代器,生成器
一 迭代器 一 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不 ...
- 第六篇:Python函数进阶篇
在了解完了 Python函数基础篇之后,本篇的存在其实是为了整合知识,由于该篇的知识是否杂乱,故大家可以通过点开点连接直接进入其详细介绍,该篇主要大致的介绍一下几个知识点: 一.Python的迭代器 ...
- Python全栈之路----函数进阶----迭代器
我们已经知道,可以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如 list , tuple , dict , set ,str 等: 一类是 generator ,包括生成器和 ...
- Python 函数之迭代器和生成器
1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可 ...
- Python—函数进阶篇
lambda表达式(匿名函数表达式) 作用:创建一个匿名函数对象.同def类似,但不提供函数名. 语法:lambda [形参1,形参2,...] : 表达式 语法说明 lambda 只是一个表达式,它 ...
- Python 函数进阶-高阶函数
高阶函数 什么是高阶函数 高阶函数就是能够把函数当成参数传递的函数就是高阶函数,换句话说如果一个函数的参数是函数,那么这个函数就是一个高阶函数. 高阶函数可以是你使用def关键字自定义的函数,也有Py ...
- python -- 函数进阶
一.函数参数-动态传参 1.形参: * 在形参位置, 表示此参数为不定参数,接受的是位置参数 并且接收到的位置参数的动态传参都是元组 def fu ...
随机推荐
- 三层PetShop架构设计
<解剖 PetShop >系列之一 前言: PetShop 是一个范例,微软用它来展示 .Net 企业系统开发的能力.业界有许多 .Net 与 J2EE 之争,许多数据是从微软的 Pe ...
- loj3161「NOI2019」I 君的探险(随机化,整体二分)
loj3161「NOI2019」I 君的探险(随机化,整体二分) loj Luogu 题解时间 对于 $ N \le 500 $ 的点,毫无疑问可以直接 $ O(n^2) $ 暴力询问解决. 考虑看起 ...
- 在Windows11使用WSA运行Google play会遇到的问题
前提一是要有adb工具 网盘链接:https://pan.baidu.com/s/1MAdq4GsxkW7dqq689d_gQw 提取码:24q2 前提二是会使用 MagiskOnWSA--解决了两个 ...
- Web,RESTful API 在微服务中的作用是什么?
微服务架构基于一个概念,其中所有服务应该能够彼此交互以构建业务功能.因 此,要实现这一点,每个微服务必须具有接口.这使得 Web API 成为微服务的一 个非常重要的推动者.RESTful API 基 ...
- Java动态代理和CGLib代理
本文参考 在上一篇"Netty + Spring + ZooKeeper搭建轻量级RPC框架"文章中涉及到了Java动态代理和CGLib代理,在这篇文章中对这两种代理方式做详解 下 ...
- c源文件中为什么要包含自己对应的头文件
另一篇:.c文件和.h文件的关系 引言: 我们经常在c工程中发现,源文件中要包含自己的头文件.一直以来,都不知道为什么这样做.现在,我知道了. 以前的认知: 我认为,.c文件没有必要包含自己的.h文件 ...
- C语言杂谈
C语言程序处理过程 预处理:宏定义展开.头文件展开.条件编译,这里并不会检查语法 编译:检查语法,将预处理后文件编译生成汇编文件 汇编:将汇编文件生成目标文件(二进制文件) 链接:将目标文件链接为可执 ...
- 顺利通过EMC实验(18)
- 技术架构:IT生存之道
Technical architecture: What IT does for a living (cio.com) Technical architecture: What IT does for ...
- 移动端比1px还小的border
巧用border 在移动端 经常出现border,细边框但有的时候 产品大大1px甚至乎会觉得不够细那么要如何写出比1px还要小的border下面是代码 希望对大家有所帮助 .thinner-bord ...