Python——第四章:迭代器(Iterators)
迭代器iterator:
提到迭代器,最典型的就是for循环
for 变量 in 可迭代:
pass
可迭代对象iterable:
是指可以使用 for 循环进行遍历的对象。除了字符串 (str)、列表 (list)、元组 (tuple)、字典 (dict)、集合 (set) 和文件对象 (open()) 之外,还有其他一些常见的可迭代对象,例如生成器对象、range 对象等。
通常,容器类型的对象都是可迭代的(如字符串、列表、元组、字典、集合等),不是容器类型的对象都不是可迭代的。
it = iter("你好啊朋友")
print(it)
#运行结果:
<str_iterator object at 0x000001A9B79F9390>
不可迭代的对象not iterable:
通常是指那些不支持使用 for 循环进行遍历的对象(不是容器类型的对象)。例如:
- 整数 (int) 和浮点数 (float): 直接的数字类型是不可迭代的。
for c in 123456:
print(c) #运行结果
Traceback (most recent call last):
File "D:\装饰器.py", line 1, in <module>
for c in 123456:
TypeError: 'int' object is not iterableiterable: 可迭代的 - 布尔值 (bool): 布尔值也是不可迭代的。
# 不可迭代的例子
bool_value = True
for b in bool_value:
print(b) - NoneType (None):
None也不可迭代。# 不可迭代的例子
none_value = None
for n in none_value:
print(n)
迭代器(Iterator)的概念
它允许你按需逐个访问集合中的元素,而不需要提前获取整个集合。迭代器协议是指实现了 __iter__() 和 __next__() 方法的对象,其中 __iter__() 返回迭代器对象本身,而 __next__() 返回集合中的下一个元素。
获取迭代器的两种方案:
1. iter() 内置函数可以直接拿到迭代器
2. __iter__() 特殊方法
从迭代器中拿到数据:
1. next() 内置函数
2. __next__() 特殊方法
it = iter("你好啊") # 或者 it = "你好啊".__iter__()
print(1,it.__next__())
print(2,next(it))
print(3,it.__next__())
#运行结果
1 你
2 好
3 啊
for里面一定是要拿迭代器的. 所以所有不可迭代的东西不能用for循环for循环里面一定有__next__出现
模拟for循环工作原理:
s = "我是数据"
it = s.__iter__() # 拿到迭代器
while 1:
try:
data = it.__next__()
print(data) # for循环的循环体
except StopIteration:
break
print(123456)
总结: 迭代器统一了不同数据类型的遍历工作
迭代器本身的特性:
- 只能向前不能向后,也不能反复
- 迭代器是一次性的,全部执行过后变成
StopIteration,再次使用需要再次iter() - 特别节省内存(可以用很少的内存,去循环遍历很庞大数据体)
- 惰性机制(迭代器一旦创建出来,不主动去访问__next__,就不会自动向前遍历。什么时候调用一次,指针才会挪动一次。)(类似于医院的叫号机制)
it = iter("你好啊") # 或者 it = "你好啊".__iter__()
print(1,it.__next__())
print(2,next(it))
print(3,it.__next__())
print(4,next(it)) # StopIteration: 迭代已经停止了. 不可以再次从迭代器中继续拿数据了
print(5,it.__next__())
#运行结果
Traceback (most recent call last):
File "D:\生成器.py", line 6, in <module>
print(4,next(it)) # StopIteration: 迭代已经停止了. 不可以再次从迭代器中拿数据了
^^^^^^^^
StopIteration
1 你
2 好
3 啊
迭代器本身也是可迭代的:
s = "你好啊, 我叫赛利亚"
it = s.__iter__() #拿字符串s的迭代器
for mm in it:
print(mm)
循环就是迭代的代表,循环it就能证明迭代器本身it可以被迭代
Python——第四章:迭代器(Iterators)的更多相关文章
- 简学Python第四章__装饰器、迭代器、列表生成式
Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群 群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...
- Python第四章-字典
第四章 字典-当索引不好用时 4.0 字典可以理解成是C++里的map,可以映射任何类型.字典这种结构类型称为映射(mapping). 字典是Python中唯一内建的映射类型,字典中的值并 ...
- 【笔记】Python基础四:迭代器和生成器
一,迭代器协议和for循环工作机制 (一),迭代器协议 1,迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能往 ...
- Python第四章实验报告
一.实验项目名称:<零基础学Python>第四章的14道实例和4道实战 二.实验环境:IDLE(Python 3.9 64-bit) 三.实验目的和要求:熟练掌握Python序列的应用 四 ...
- 《Python 学习手册4th》 第十四章 迭代器和解析
''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...
- 流畅的python第四章文本和字节序列学习记录
字符问题 把码位转化成字节序列的过程是编码,把字节序列转化成码位的过程是解码 把unicode字符串当成人类可读的文本,码位当成机器可读的, 将字节序列编程人类可读是解码,把字符串编码成字节序列是编码 ...
- python3-cookbook笔记:第四章 迭代器与生成器
python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...
- Python第四章(北理国家精品课 嵩天等)
一.程序的分支结构 二.身体质量指数BMI #CalBIv1.py height,weight = eval((input("请输入身高(米)和体重\(公斤)[逗号隔开]:"))) ...
- python第四章:函数--小白博客
Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...
- Python第四章-流程控制
流程控制 在以前的代码中,所有的代码都是交由 Python 忠实地从头执行到结束.但是这些远远不够.很多时候需要根据不同的情况执行不同的代码. 如果你想改变这一工作流程,应该怎么做? 就像这样的情况: ...
随机推荐
- Solution Set -「CF 1486」
「CF 1486A」Shifting Stacks Link. 考虑最少需要操作多少次后判断. #include<map> #include<cstdio> using nam ...
- 【matplotlib 实战】--平行坐标系
平行坐标系是一种统计图表,它包含多个垂直平行的坐标轴,每个轴表示一个字段,并用刻度标明范围.通过在每个轴上找到数据点的落点,并将它们连接起来形成折线,可以很容易地展示多维数据.随着数据增多,折线会堆叠 ...
- 记录一次gcc的编译
在deepin23上编译gcc13.2 deepin20素以软件版本过老被人诟病,换成最新的deepin23之后情况大有好转,但是gcc版本为11.2,鄙人对此仍有意见,所以特意研究了如何编译一份较新 ...
- MySQL系列之——MySQL体系结构、基础管理(用户、权限管理、连接管理、多种启动方式介绍、初始化配置、多实例的应用)
文章目录 一 体系结构 1.1 C/S(客户端/服务端)模型介绍 1.2 实例介绍 1.3 mysqld程序运行原理 1.3.1 mysqld程序结构 1.3.2 一条SQL语句的执行过程 1.3.2 ...
- python第6章code
01条件判断语句 # 条件判断语句(if语句)# 语法:if 条件表达式 : # 代码块# 执行的流程:if语句在执行时,会先对条件表达式进行求值判断,# 如果为True,则执行if后的语句# 如果为 ...
- 在 Mac 上撰写和格式化备忘录-添加提醒-添加日历
在 Mac 上撰写和格式化备忘录 您可以撰写备忘录以及更改备忘录的格式,例如,更改字体大小或对齐方式,或者使文本变为粗体.如果您使用的是升级后的 iCloud 备忘录或者储存在您 Mac 上的备忘录, ...
- Redis 6 学习笔记 3 —— 用SpringBoot整合Redis的踩坑,了解事务、乐观锁、悲观锁
SpringBoot整合Redis时踩到的坑 jdk1.8环境,用idea的Spring Initializr创建spring boot项目,版本我选的2.7.6.pom文件添加的依赖如下,仅供参考. ...
- 从windows到linux,图形化操作到命令行操作讲解
作为一个后端开发人员,刚开始进入到职场中,linux还不是必备项.但是随着开发经验的提升,慢慢就会接触到linux,所以就有了那句:开发必须要会linux.一开始我也不知道linux是干嘛的,学那些命 ...
- 实现MyBatisPlus自定义sql注入器
目标:新增mysql下的 插入更新的语法 INSERT INTO %s %s VALUES %s ON DUPLICATE KEY UPDATE %s 新增方法类,新增的方法名称为insertOrUp ...
- reverse_re3
main函数 点击重要函数 对if里面的数字按r键,使其从ASCII码转为字符 发现wasd四个关键的移动方向键,判断为迷宫问题 判断应该是要次数为2,即次数++3(从0开始计数)次才会有flag 点 ...