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 忠实地从头执行到结束.但是这些远远不够.很多时候需要根据不同的情况执行不同的代码. 如果你想改变这一工作流程,应该怎么做? 就像这样的情况: ...
随机推荐
- 使用TorchLens可视化一个简单的神经网络
TorchLens:可用于可视化任何PyTorch模型,一个包用于在一行代码中提取和映射PyTorch模型中每个张量运算的结果.TorchLens功能非常强大,如果能够熟练掌握,算是可视化PyTo ...
- 路由器与交换机:Access/Trunk,Wan/Lan
转载请注明出处: 1.交换机与路由器 交换机与路由器的特点: 交换机(Switch): 用于在局域网中传输数据帧 基于MAC地址进行转发和过滤 工作在数据链路层(第二层) 具有多个端口,可以连接多台计 ...
- 基于 Wiki.js 搭建知识库系统
前言 本文介绍如何使用 Wiki.js 搭建知识库系统. Wiki.js 官网 安装 前提准备 Wiki.js 几乎可以在任何支持 Node.js 的系统上运行.它可以运行在 Linux .Windo ...
- Avalonia开发(二)项目结构解析
一.前言 在Avalonia开发(一)环境搭建 文章中介绍了Avalonia的介绍.开发环境的搭建.项目创建,以及项目FirstAvaloniaApp项目结构的介绍.本篇文章将介绍各平台的项目介绍. ...
- .NET周刊【9月第4期 2023-09-24】
国内文章 有趣的"可扩展近似计数"算法 https://zhuanlan.zhihu.com/p/656817283 在编程的世界里看见数学的身影,会让我充满好奇和兴奋.这不,在一 ...
- How to start with Gradle?
How to start with Gradle? Download the latest Gradle release from http://www.gradle.org/downloads Se ...
- csps区间dp
加分二叉树 我们可以枚举中间这个 k 的位置,然后分别递归计算左右子树,这就让我们想到这是一个和区间有关的,我们可以用区间dp来解决. \(f[i][j]\) 表示 i, j 这个区间的最大分值.用一 ...
- jmeter生成随机英文的几种方法
第一种:用BeanShell后置处理程序 1.写脚本 import java.util.Random; String random(int s_length) { strings= &qu ...
- js数据结构--集合
<!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...
- 长程 Transformer 模型
Tay 等人的 Efficient Transformers taxonomy from Efficient Transformers: a Survey 论文 本文由 Teven Le Scao.P ...