『无为则无心』Python基础 — 61、Python中的迭代器
1、迭代的概念
(1)什么是迭代
迭代就是单向地、逐个地访问某个容器中的元素的行为。 简单说迭代就是循环。
(2)迭代和遍历的区别
迭代是遍历的一种特例,遍历(traverse)是可以在数据结构上来回的游走,不仅可以往前,还可以往后,同时还能保证不重不漏的,迭代是单向的,逐个的,而且只来一次。
2、迭代器的概念
(1)概念
在Python中常见的序列有list、tuple、set、dict、str,我们也称之为容器。
我们之前在遍历这些容器的时候,针对不同的容器,每次写的代码还都有所差别。于是我们想能不能写一个工具,当我们需要对一个容器中的元素,进行单向的,一个接一个的取出来的时候,就调用这个工具。
这个工具可以帮我们把不同容器遍历细节上的不同屏蔽掉,当我们需要这个操作的时候,就把容器直接传给这个工具就好了,而这个工具就叫迭代器。
(2)优点
- 从序列类型中一个一个的取值,会把所有的值都取到。
- 节省内存空间,迭代器并不会在内存中占用一大块内存,面是随着循环每次生成一个,每调用一次
next方法就会返回给我一个元素。
3、可迭代的对象(Iterable)
(1)什么是可迭代的对象
简单的说,一个对象只要实现了只要实现了__iter__()方法,就是一个可迭代的对象。
可以使用isinstance()判断一个对象是否是Iterable对象:
(2)Python中常见的可迭代数据类型
- 集合或序列类型(如
list、tuple、set、dict、str) - 文件对象(以后扩展)
- 在类中定义了
__iter__()方法的对象,可以被认为是Iterable对象,
示例:
from collections.abc import Iterable
print(isinstance('', Iterable)) # true 字符串是可迭代的
print(isinstance([], Iterable)) # true 列表是可迭代的
print(isinstance((), Iterable)) # true 元组是可迭代的
print(isinstance({}, Iterable)) # true 字典是可迭代的
print(isinstance(set(), Iterable)) # true 集合是可迭代的
说明:
这些内置集合或序列对象都有
__iter__方法,即他们都实现了同名方法。我们可以随便定义一个序列,如下:
testList = list()
在PyCharm中按住
ctrl键点击list()就可以查看list类的源码。源码中我们就能够看到
list类中定义了__iter__函数。其他的可迭代序列同理。
像int数据类型,按住
ctrl键点击查看。int类中并没有定义__iter__函数。1 = int()
4、迭代器对象(Iterator)
序列类型(如list、tuple、set、dict、str等)都是可迭代对象,但是他们并不是迭代器对象。
可以使用iter()函数把可迭代对象(Iterable)变成迭代器对象(Iterator):
验证:
from collections.abc import Iterable, Iterator
print(isinstance('', Iterator)) # False 字符串不是迭代器对象
print(isinstance([], Iterator)) # False 列表不是迭代器对象
print(isinstance((), Iterator)) # False 元组不是迭代器对象
print(isinstance({}, Iterator)) # False 字典是不是迭代器对象
print(isinstance(set(), Iterator)) # False 集合不是迭代器对象
# iter()可把对应的可迭代对象转换成迭代器对象
print(isinstance(iter(""), Iterator)) # True 迭代器对象
print(isinstance(iter([]), Iterator)) # True 迭代器对象
print(isinstance(iter(()), Iterator)) # True 迭代器对象
print(isinstance(iter({}), Iterator)) # True 迭代器对象
print(isinstance(iter(set()), Iterator)) # True 迭代器对象
说明:
可迭代对象支持内置函数
iter,通过对可迭代对象调用iter函数,会返回一个迭代器。而“迭代器”支持内置函数next(),通过不断对其调用next()方法,会依次前进到序列中的下一个元素并将其返回,最后到达序列的末尾时,会引发StopIteration异常。补充说明一点,对迭代器调用
iter方法,则会返回迭代器自身。示例如下:
# 定义一个列表
testList = [1, 2, 3, 4] # 把列表转变成一个迭代器对象
it = iter(testList) # 迭代器对象调用__iter__,返回迭代器对象本身
# <list_iterator object at 0x0000000002674B88>
print(it.__iter__())
5、迭代器的使用体验
(1)基本用法
# 定义一个列表
testList = [1, 2, 3, 4]
# 把列表转变成一个迭代器对象
it = iter(testList)
# 使用迭代器
# 从迭代器中取出一个接着一个的元素
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
print(next(it)) # 4
# 当迭代完存储的所有元素之后,如果继续迭代,
# # 则 __next__() 方法会抛出 StopIteration 异常。
print(next(it)) # StopIterable 异常
(2)实际应用
# 示例1
# 用迭代器来访问列表中的元素
# 定义一个列表
testList = [1, 2, 3, 4]
# 把裂变转变成一个迭代器对象
it = iter(testList)
# 使用迭代器取值
while True:
try:
# 调用next函数,获取下一个字符
result = next(it)
print(result)
except StopIteration:
# 释放对it的引用,即废弃迭代器对象
del it
# 不推出循环会成为私循环
break
# 示例2
# 用迭代器来访问列表中的元素
# 定义一个字符串
testStr = "Python"
# 把裂变转变成一个迭代器对象
it = iter(testStr)
# 使用迭代器取值
for str in it:
print(str)
参考:
『无为则无心』Python基础 — 61、Python中的迭代器的更多相关文章
- 『无为则无心』Python基础 — 3、搭建Python开发环境
目录 1.Python开发环境介绍 2.Python解释器的分类 3.下载Python解释器 4.安装Python解释器 5.Python解释器验证 1.Python开发环境介绍 所谓"工欲 ...
- 『无为则无心』Python基础 — 4、Python代码常用调试工具
目录 1.Python的交互模式 2.IDLE工具使用说明 3.Sublime3工具的安装与配置 (1)Sublime3的安装 (2)Sublime3的配置 4.使用Sublime编写并调试Pytho ...
- 『无为则无心』Python基础 — 6、Python的注释
目录 1.注释的作用 2.注释的分类 单行注释 多行注释 3.注释的注意事项 4.什么时候需要使用注释 5.总结 提示:完成了前面的准备工作,之后的文章开始介绍Python的基本语法了. Python ...
- 『无为则无心』Python基础 — 7、Python的变量
目录 1.变量的定义 2.Python变量说明 3.Python中定义变量 (1)定义语法 (2)标识符定义规则 (3)内置关键字 (4)标识符命名习惯 4.使用变量 1.变量的定义 程序中,数据都是 ...
- 『无为则无心』Python基础 — 10、Python字符串的格式化输出
目录 1.什么是格式化输出 2.Python格式化输出的五种方式 方式一:字符串之间用+号拼接 方式二:print()函数可同时输出多个字符串 方式三:占位符方式 方式四:f格式化方式(推荐) 方式五 ...
- 『无为则无心』Python基础 — 12、Python运算符详细介绍
目录 1.表达式介绍 2.运算符 (1)运算符的分类 (2)算数运算符 (3)赋值运算符 (4)复合赋值运算符 (5)比较运算符 3.逻辑运算符 拓展1:数字之间的逻辑运算 拓展2:Python中逻辑 ...
- 『无为则无心』Python基础 — 44、对文件和文件夹的操作
目录 1.os模块介绍 2.查看os模块相关文档 3.os模块常用方法 (1)文件重命名 (2)删除文件 (3)创建文件夹 (4)删除文件夹 (5)获取当前目录 (6)改变默认目录 (7)获取目录列表 ...
- 『无为则无心』Python序列 — 24、Python序列的推导式
目录 1.列表推导式 (1)快速体验 (2)带if的列表推导式 (3)多个for循环实现列表推导式 2.字典推导式 (1)创建一个字典 (2)将两个列表合并为一个字典 (3)提取字典中目标数据 3.集 ...
- 『无为则无心』Python函数 — 29、Python变量和参数传递
目录 1.Python的变量 (1)Python变量不能独立存在 (2)变量是内存中数据的引用 (3)注意点 2.了解变量的引用 3.Python的参数传递(重点) (1)示例 (2)结论 (3)总结 ...
随机推荐
- Cesium源码剖析---Post Processing之物体描边(Silhouette)
Cesium在1.46版本中新增了对整个场景的后期处理(Post Processing)功能,包括模型描边.黑白图.明亮度调整.夜视效果.环境光遮蔽等.对于这么炫酷的功能,我们绝不犹豫,先去翻一翻它的 ...
- Cesium入门9 - Loading and Styling Entities - 加载和样式化实体
Cesium入门9 - Loading and Styling Entities - 加载和样式化实体 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://c ...
- C++11多线程之future(一)
// ConsoleApplication5.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include<random> #in ...
- 在build中配置resources,来防止我们资源导出失败的问题
<!--在build中配置resources,来防止我们资源导出失败的问题--> <build> <resources> <resource> < ...
- 信奥题库(OI题库)8月月赛T1题解 幂次数
0.前置知识 分解质因数 快速幂(不必要) 1.思路 首先,我们知道一个正整数(设它为 \(a\) )一定能分解成这样的形式: \[a= \prod_{i\in N^*} p_i^{c_i} \] 其 ...
- JavaScript之 函数节流(Throttling) 与 防抖(Debounce)
Throttling:在监听鼠标移动事件.盒子滚动事件等使用节流技术能节省性能消耗 /** * 节流函数(每隔t执行一次) */ function Throttling(fn, t) { const ...
- 在windows、widfly环境下,远程debug
最近:一直想弄一个远程debug模式,奈何没有接触过,导致畏首畏尾,不过,两天时间终于搞出来了雏形,真的是一个坑一个坑踩过来的. widfly环境:widfly8 准备工作:远程运行环境:省略,前面一 ...
- 【JS】函数提升变量提升以及函数声明和函数表达式的区别
今天看js的变量提升问题,里面提到了函数提升.然后发现自己之前一直把函数声明和函数表达式弄错,导致函数提升出错 一.变量提升 console.log(a) var a=100 //undefined ...
- SharedPreferences介绍
sharedPreferences是通过xml文件来做数据存储的. 一般用来存放一些标记性的数据,一些设置信息. 使用sharedPreferences存储数据 ...
- kali切换桌面环境
感谢大佬:https://blog.csdn.net/tao546377318/article/details/52353018 kali 是基于Debian的发行版,兼容性和软件支持都很好,默认使用 ...