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 iterable
iterable
: 可迭代的 - 布尔值 (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
可以被迭代
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)