迭代器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 循环进行遍历的对象(不是容器类型的对象)。例如:

  1. 整数 (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 iterable

    iterable: 可迭代的

  2. 布尔值 (bool): 布尔值也是不可迭代的。
    # 不可迭代的例子
    bool_value = True
    for b in bool_value:
    print(b)
  3. 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)

总结: 迭代器统一了不同数据类型的遍历工作

迭代器本身的特性:

  1. 只能向前不能向后,也不能反复
  2. 迭代器是一次性的,全部执行过后变成StopIteration,再次使用需要再次iter()
  3. 特别节省内存(可以用很少的内存,去循环遍历很庞大数据体)
  4. 惰性机制(迭代器一旦创建出来,不主动去访问__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)的更多相关文章

  1. 简学Python第四章__装饰器、迭代器、列表生成式

    Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群  群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...

  2. Python第四章-字典

    第四章 字典-当索引不好用时 4.0     字典可以理解成是C++里的map,可以映射任何类型.字典这种结构类型称为映射(mapping).   字典是Python中唯一内建的映射类型,字典中的值并 ...

  3. 【笔记】Python基础四:迭代器和生成器

    一,迭代器协议和for循环工作机制 (一),迭代器协议 1,迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能往 ...

  4. Python第四章实验报告

    一.实验项目名称:<零基础学Python>第四章的14道实例和4道实战 二.实验环境:IDLE(Python 3.9 64-bit) 三.实验目的和要求:熟练掌握Python序列的应用 四 ...

  5. 《Python 学习手册4th》 第十四章 迭代器和解析

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...

  6. 流畅的python第四章文本和字节序列学习记录

    字符问题 把码位转化成字节序列的过程是编码,把字节序列转化成码位的过程是解码 把unicode字符串当成人类可读的文本,码位当成机器可读的, 将字节序列编程人类可读是解码,把字符串编码成字节序列是编码 ...

  7. python3-cookbook笔记:第四章 迭代器与生成器

    python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...

  8. Python第四章(北理国家精品课 嵩天等)

    一.程序的分支结构 二.身体质量指数BMI #CalBIv1.py height,weight = eval((input("请输入身高(米)和体重\(公斤)[逗号隔开]:"))) ...

  9. python第四章:函数--小白博客

    Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  10. Python第四章-流程控制

    流程控制 在以前的代码中,所有的代码都是交由 Python 忠实地从头执行到结束.但是这些远远不够.很多时候需要根据不同的情况执行不同的代码. 如果你想改变这一工作流程,应该怎么做? 就像这样的情况: ...

随机推荐

  1. Solution Set -「CF 1486」

    「CF 1486A」Shifting Stacks Link. 考虑最少需要操作多少次后判断. #include<map> #include<cstdio> using nam ...

  2. 【matplotlib 实战】--平行坐标系

    平行坐标系是一种统计图表,它包含多个垂直平行的坐标轴,每个轴表示一个字段,并用刻度标明范围.通过在每个轴上找到数据点的落点,并将它们连接起来形成折线,可以很容易地展示多维数据.随着数据增多,折线会堆叠 ...

  3. 记录一次gcc的编译

    在deepin23上编译gcc13.2 deepin20素以软件版本过老被人诟病,换成最新的deepin23之后情况大有好转,但是gcc版本为11.2,鄙人对此仍有意见,所以特意研究了如何编译一份较新 ...

  4. MySQL系列之——MySQL体系结构、基础管理(用户、权限管理、连接管理、多种启动方式介绍、初始化配置、多实例的应用)

    文章目录 一 体系结构 1.1 C/S(客户端/服务端)模型介绍 1.2 实例介绍 1.3 mysqld程序运行原理 1.3.1 mysqld程序结构 1.3.2 一条SQL语句的执行过程 1.3.2 ...

  5. python第6章code

    01条件判断语句 # 条件判断语句(if语句)# 语法:if 条件表达式 : # 代码块# 执行的流程:if语句在执行时,会先对条件表达式进行求值判断,# 如果为True,则执行if后的语句# 如果为 ...

  6. 在 Mac 上撰写和格式化备忘录-添加提醒-添加日历

    在 Mac 上撰写和格式化备忘录 您可以撰写备忘录以及更改备忘录的格式,例如,更改字体大小或对齐方式,或者使文本变为粗体.如果您使用的是升级后的 iCloud 备忘录或者储存在您 Mac 上的备忘录, ...

  7. Redis 6 学习笔记 3 —— 用SpringBoot整合Redis的踩坑,了解事务、乐观锁、悲观锁

    SpringBoot整合Redis时踩到的坑 jdk1.8环境,用idea的Spring Initializr创建spring boot项目,版本我选的2.7.6.pom文件添加的依赖如下,仅供参考. ...

  8. 从windows到linux,图形化操作到命令行操作讲解

    作为一个后端开发人员,刚开始进入到职场中,linux还不是必备项.但是随着开发经验的提升,慢慢就会接触到linux,所以就有了那句:开发必须要会linux.一开始我也不知道linux是干嘛的,学那些命 ...

  9. 实现MyBatisPlus自定义sql注入器

    目标:新增mysql下的 插入更新的语法 INSERT INTO %s %s VALUES %s ON DUPLICATE KEY UPDATE %s 新增方法类,新增的方法名称为insertOrUp ...

  10. reverse_re3

    main函数 点击重要函数 对if里面的数字按r键,使其从ASCII码转为字符 发现wasd四个关键的移动方向键,判断为迷宫问题 判断应该是要次数为2,即次数++3(从0开始计数)次才会有flag 点 ...