当前位置: 首页 > news >正文

python学习笔记 | 7.5、高级特性-迭代器

一、整体思路(一句话看懂)

  1. 能放进 for 循环里遍历的,叫 可迭代对象(Iterable)

    比如:列表、字符串、字典、元组…

  2. 能被 next () 一个个取数据的,叫 迭代器(Iterator)

    迭代器 = 更高级的可迭代对象,

    惰性计算

    (用到才算,不占内存)

  3. 所有迭代器都是可迭代对象,但可迭代对象不一定是迭代器

  4. 想用next()取普通列表 / 字符串?用iter()转成迭代器就行!


二、具体说明

1. 可迭代对象 Iterable

定义:能直接用for ... in ...循环遍历的东西。

常见例子

  • list 列表[1,2,3]
  • str 字符串"abc"
  • dict 字典{"name":"小明"}
  • tuple 元组(1,2,3)
  • set 集合

不能用 next (),直接用会报错!


2. 迭代器 Iterator

定义

  • 能用for循环
  • 能用next()一个个取值
  • 惰性计算:不一次性生成所有数据,用到才算,省内存

常见例子

  • 生成器(x for x in range(10))
  • iter()转换后的可迭代对象

取到最后没数据了,会抛出StopIteration错误。


3. 关键转换

普通可迭代对象 → 迭代器

迭代器对象 = iter(普通可迭代对象)

三、超简单实例(直接复制运行)

🌰 例子 1:判断是不是可迭代对象

# 导入判断工具 from collections.abc import Iterable # 列表:是 print(isinstance([1,2,3], Iterable)) # True # 字符串:是 print(isinstance("hello", Iterable)) # True # 数字:不是 print(isinstance(123, Iterable)) # False

🌰 例子 2:判断是不是迭代器

from collections.abc import Iterator # 生成器:是迭代器 print(isinstance((x for x in range(5)), Iterator)) # True # 列表:不是迭代器 print(isinstance([1,2,3], Iterator)) # False

🌰 例子 3:把列表变成迭代器(重点!)

# 普通列表(可迭代,但不是迭代器) my_list = [10, 20, 30] # 转成迭代器 it = iter(my_list) # 用 next() 一个个取 print(next(it)) # 10 print(next(it)) # 20 print(next(it)) # 30 # 再取就报错:StopIteration(没数据了) # print(next(it))

🌰 例子 4:for 循环的本质(超重要)

# 我们平时写的 for x in [1,2,3]: print(x) # 它底层等价于: it = iter([1,2,3]) while True: try: x = next(it) print(x) except StopIteration: break

四、终极口诀(记住就够了)

  1. 能 for 循环 → 可迭代对象
  2. 能 next () → 迭代器
  3. 列表 / 字符串 / 字典 → 可迭代,但不是迭代器
  4. iter () 一转 → 立刻变成迭代器
  5. 迭代器惰性计算,省内存,能表示无限数据

总结

你只需要记住:

  • Iterable= 能遍历
  • Iterator= 能一个个取(惰性)
  • iter()= 普通对象变迭代器
  • next()= 手动取迭代器里的值

分割线练习题

一、基础判断题(每题10分,共50分)

判断下列说法是否正确,对的打√,错的打×,并简要说明理由(小白可简单写)。

  1. 列表 [1,2,3] 是可迭代对象(Iterable),也是迭代器(Iterator)。( ❌️)
  2. 生成器 (x for x in range(3)) 可以用 next() 函数取值。( ✅️)
  3. 字符串 “python” 不是可迭代对象,因为它不能用 next() 取值。( ❌️)
  4. 用 iter() 函数可以把字典 {“a”:1} 转换成迭代器。( ✅️)
  5. 所有可迭代对象(Iterable)都可以直接用 next() 函数取值。(❌️ )

二、实操选择题(每题15分,共30分)

请选出正确答案,可先尝试运行代码(小白建议复制到Python里跑一跑)。

  1. 下列代码运行后,输出结果是(C) from collections.abc import Iterable, Iterator a = (x for x in range(2)) print(isinstance(a, Iterable), isinstance(a, Iterator))
    1. A. True False
    2. B. False True
    3. C. True True
    4. D. False False
  2. 下列代码运行后,会输出什么( C❌️A✅️) my_str = “abc” it = iter(my_str) print(next(it), next(it))
    1. A. a b
    2. B. abc
    3. C. 报错
    4. D. a c

三、实操编程题(20分)

请写出代码,完成以下需求(小白可参考之前的实例,一步步写):

  1. 定义一个列表 my_list = [100, 200, 300, 400],判断它是否是可迭代对象、是否是迭代器;
#❌️ my_list = [100, 200, 300, 400] print(my_list,isinstance(my_list,iterators.Iterable))
#✅️ from collections.abc import Iterable, Iterator my_list = [100, 200, 300, 400] print('列表内容',my_list) print('是否是可迭代对象',isinstance(my_list,Iterable)) print('是否是迭代器',isinstance(my_list,Iterator))

2、将这个列表转换成迭代器;

from collections.abc import Iterable, Iterator my_list = [100, 200, 300, 400] print('列表内容',my_list) print('是否是可迭代对象',isinstance(my_list,Iterable)) print('是否是迭代器',isinstance(my_list,Iterator)) # #❌️ # x for x in my_list: # print(x) it = iter(my_list) # 这一行就是转换! print("\n转换后,是不是迭代器?", isinstance(it, Iterator))

3、用 next() 函数依次取出迭代器中的所有值(注意处理 StopIteration 错误,可选做)。

# 1. 定义一个列表 my_list = [100, 200, 300, 400],判断它是否是可迭代对象、是否是迭代器; from collections.abc import Iterable, Iterator my_list = [100, 200, 300, 400] print('列表内容',my_list) print('是否是可迭代对象',isinstance(my_list,Iterable)) print('是否是迭代器',isinstance(my_list,Iterator)) # 2. 将这个列表转换成迭代器; # #❌️ # x for x in my_list: # print(x) #✅️ it = iter(my_list) # 这一行就是转换! print("\n转换后,是不是迭代器?", isinstance(it, Iterator)) # 3. 用 next() 函数依次取出迭代器中的所有值(注意处理 StopIteration 错误,可选做)。 # ❌️ # try: # print(x for x in next(it)) # except StopIteration: # print('结束') #✅️ while True: try: print(next(it)) except StopIteration: print('结束') break

四、答案与解析

一、基础判断题答案

  1. × 解析:列表 [1,2,3] 是可迭代对象(能for循环),但不是迭代器(不能直接用next()取值)。
  2. √ 解析:生成器是迭代器,迭代器可以用next()一个个取值。
  3. × 解析:字符串 “python” 是可迭代对象(能for循环遍历),只是不能直接用next(),转成迭代器后才可以。
  4. √ 解析:iter() 函数的作用就是把可迭代对象(字典是可迭代对象)转换成迭代器。
  5. × 解析:只有迭代器能直接用next(),普通可迭代对象(比如列表、字符串)不能直接用。

二、实操选择题答案

  1. C 解析:生成器既是可迭代对象(能for循环),也是迭代器(能next()),所以两个判断都是True。
  2. A 解析:iter(my_str) 把字符串转成迭代器,next(it) 依次取第一个、第二个字符,就是 a 和 b。

三、实操编程题答案(两种写法,小白选第一种即可)

基础写法(不处理报错,适合小白):

# 1. 定义列表并判断fromcollections.abcimportIterable,Iterator my_list=[100,200,300,400]print("是否是可迭代对象:",isinstance(my_list,Iterable))# 输出Trueprint("是否是迭代器:",isinstance(my_list,Iterator))# 输出False# 2. 转换成迭代器it=iter(my_list)# 3. 用next()取值print(next(it))# 100print(next(it))# 200print(next(it))# 300print(next(it))# 400# 再写一次next(it)会报错,因为没有数据了

进阶写法(处理报错,更规范):

fromcollections.abcimportIterable,Iterator my_list=[100,200,300,400]# 判断print("是否是可迭代对象:",isinstance(my_list,Iterable))print("是否是迭代器:",isinstance(my_list,Iterator))# 转换迭代器it=iter(my_list)# 循环取所有值,处理报错whileTrue:try:print(next(it))exceptStopIteration:print("没有更多数据了")break

总结

做错的题目,对应回去看之前的总结: - 判断题错了 → 再记“可迭代=能for,迭代器=能next”; - 选择题错了 → 复制代码到Python里运行,看实际结果; - 编程题不会 → 参考实例,先写判断,再转迭代器,最后用next()取值,一步步来。

分割线=collections.abc是什么

. 逐部分拆解(核心)

  • from collections.abc import ...:固定写法,意思是 “从 Python 自带的collections.abc模块里,拿出我们需要的工具”
  • 类比:就像从家里的工具箱(collections.abc模块)里,拿出尺子和剪刀(需要的工具)。
  • Iterable:是 “可迭代对象” 的判断工具,用来判断一个对象(比如列表、字符串)能不能用for循环遍历。
  • Iterator:是 “迭代器” 的判断工具,用来判断一个对象能不能用next()函数一个个取值。

2. 为什么必须写这行代码?

没有这行代码,直接用isinstance(my_list, Iterable)isinstance(my_list, Iterator),Python 会报错(不认识IterableIterator)。

分割线巩固练习题

巩固练习题(迭代器专属,2 道基础 + 1 道实操)

题目 1 判断对错

  1. list、str、dict 都是 Iterable,但不是 Iterator。(❌️)答错了,应该是✅️

​ 解析:

​ 列表、字符串、字典、元组、集合

​ 👉 全都能 for 循环= 是Iterable

​ 👉 全都不能直接 next ()= 不是Iterator

  1. iter(字符串)可以把字符串转为迭代器。(✅️)
  2. 迭代器取完所有元素后,继续next()不会报错。(❌️)

题目 2 选择题

下列哪一个天生就是迭代器 Iterator? C

A. [1,2,3]

B. “hello”

C. (x for x in range(5))

D. {“a”:1}

解析—答对了

  • A 列表、B 字符串、D 字典:

    都是

    可迭代对象 Iterable

    ,但

    不是迭代器

  • C(x for x in range(5))生成器

    生成器 = 天生的迭代器 Iterator,可以直接用

    next()

题目 3 实操编程

按步骤写代码:

  1. 定义字符串 s = “python”
  2. 判断 s 是否为 Iterable、是否为 Iterator
  3. iter()转为迭代器
  4. 循环 + try-except + next () 取出所有字符,最后打印「取值完毕」
## 题目 3 实操编程 from collections.abc import Iterable, Iterator # 按步骤写代码: # 1. 定义字符串 s = "python" s = "python" # 2. 判断 s 是否为 Iterable、是否为 Iterator print(s,isinstance(s,Iterable)) print(s,isinstance(s,Iterator)) # 3. 用 `iter()` 转为迭代器 it = iter(s) # 4. 循环 + try-except + next () 取出所有字符,最后打印「取值完毕」 while True: try: print(next(it)) except StopIteration: print('取值完毕') #补充 break

分割线生成器和迭代器关系

生成器一共就两种形式,小白牢牢记住

第一种:生成器表达式(括号写法)

语法:把列表生成式的[]改成()

# 列表生成式 lst = [x for x in range(5)] # 生成器表达式(第二种生成器) g = (x for x in range(5))

特点:

  • 一行写完,简单轻便
  • 天生就是迭代器
  • 惰性取值,省内存

第二种:生成器函数(带 yield)

语法:函数里不写return,写yield

def gen(): yield 1 yield 2 yield 3

特点:

  • 逻辑复杂、多步逻辑用它
  • 遇到yield暂停,下次next()继续执行

一句话总结

生成器两种写法:

  1. 生成器表达式👉(x for x in ...)
  2. yield 生成器函数👉 函数里写 yield

关键关系

  • 两种写法,全部都是生成器
  • 所有生成器,全部都是迭代器

一、生成器两种形式 完整 + 极简示例

形式 1:生成器表达式(小括号)

把列表推导式[]换成(),就是生成器。

# 列表(一次性全部生成,占内存) lst = [x*2 for x in range(4)] # 生成器表达式(惰性,用到才算) g1 = (x*2 for x in range(4)) print(next(g1)) print(next(g1))

形式 2:生成器函数(含 yield)

普通函数用return,生成器函数用yield

def g2(): yield 10 yield 20 yield 30 gen = g2() print(next(gen)) print(next(gen))

二、核心区别

  1. 生成器表达式
  • 适合简单逻辑、一行搞定
  • 临时用、代码短
  1. yield 生成器函数
  • 适合复杂逻辑、循环、判断
  • 可以分段暂停、分步返回数据

三、不变的结论(必背)

  1. 两种写法都是生成器
  2. 所有生成器,都是迭代器,都能用next()
  3. 都具备惰性计算,节省内存

分割线

http://www.jsqmd.com/news/716366/

相关文章:

  • CIMPro孪大师如何实现多源数据融合?
  • 如何将微信聊天记录永久保存?WeChatMsg免费开源工具完全指南
  • 为什么Chrome用户需要这个3合1图片格式转换扩展?
  • 保姆级教程:用Uni-App + Vue + uView UI 从零搭建一个可拖拽的小程序页面编辑器
  • 英雄联盟回放播放器ROFL-Player:终极免费工具完整使用指南
  • 深度精读:Segment Anything(SAM)
  • 揭开光学材料的神秘面纱:3000+材料折射率数据库完全指南
  • Voxtral-4B-TTS-2603可部署:支持企业内网离线部署的多语言TTS解决方案
  • 告别复杂OCR:OpenDataLab MinerU智能文档理解,3步搞定PDF转文本
  • 【收藏级】2026年大模型入门到精通全解析|小白程序员必看,从AI演进到实战就业一站式指南
  • Yokogawa F3BU06-0N 控制器背板
  • 5分钟学会AI实时翻译工具:免费为直播添加多语言字幕
  • 14份精选资源包,每一份都值得收藏健康 · 成长 · AI · 教育 · 英语 · 考公
  • 2026年山东大学软件学院创新项目实训博客-项目博客(一)
  • 深圳压力型白发养黑机构推荐 黑奥秘AI智能检测,白发改善效果可视化 - 美业信息观察
  • 高校科研团队首选:MinerU学术论文解析部署案例分享
  • DeOldify模型Web端交互设计:使用JavaScript实现实时拖拽上色预览
  • 收藏|2026最新AI Agent行业全景解析,程序员小白必学转型必修课
  • 实测分享:Fish-Speech-1.5生成语音效果,自然度超乎想象
  • MediaCreationTool.bat终极指南:5分钟掌握Windows系统部署自动化
  • 打破城通网盘速度限制:ctfileGet如何实现10倍下载加速的技术揭秘
  • 如何高效解决MoviePilot中的115网盘风控问题:STRM方案与智能限流实战指南
  • 标准混合气体供应商怎么选?先看这6项,再判断大特气体是否适合你 - 广州矩阵架构科技公司
  • GHelper技术架构解析:轻量级硬件控制方案与华硕笔记本性能优化实践
  • 设计模式应用
  • 2026成都防水补漏公司权威推荐:屋顶卫生间外墙屋檐地下室飘窗阳台漏水,竞争力排行榜TOP5+优质机构测评 - 资讯焦点
  • Codeforces Round 1091 (Div. 2) and CodeCraft 26
  • NVIDIA Profile Inspector终极指南:解锁显卡隐藏设置,游戏性能飙升200%
  • 从加密压缩包到Wi-Fi握手包:John the Ripper的‘跨界’破解实战指南(含zip2john/aircrack-ng联动)
  • 大脑-身体交互综述:从神经科学原理到脑机接口工程实践