迭代器iterator:
提到迭代器,最典型的就是for
循环
for 变量 in 可迭代:
pass
可迭代对象:
是指可以使用 for
循环进行遍历的对象。除了字符串 (str
)、列表 (list
)、元组 (tuple
)、字典 (dict
)、集合 (set
) 和文件对象 (open()
) 之外,还有其他一些常见的可迭代对象,例如生成器对象、range 对象等。
通常,容器类型的对象都是可迭代的(如字符串、列表、元组、字典、集合等),不是容器类型的对象都不是可迭代的。
不可迭代的对象:
通常是指那些不支持使用 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)
可迭代的数据类型都会提供一个叫迭代器的东西. 这个迭代器可以帮我们把数据类型中的所有数据逐一的拿到
获取迭代器的两种方案:
1. iter()
内置函数可以直接拿到迭代器
2. __iter__()
特殊方法
从迭代器中拿到数据:
1. next()
内置函数
2. __next__()
特殊方法
it = iter("你叫什么名字啊")
print(1,next(it))
print(2,next(it))
print(3,next(it))
print(4,next(it))
print(5,next(it))
print(6,next(it))
print(7,next(it))
print(8,next(it)) # StopIteration: 迭代已经停止了. 不可以再次从迭代器中拿数据了
#运行结果
Traceback (most recent call last):
File "D:\迭代器.py", line 11, in <module>
print(8,next(it))
^^^^^^^^
StopIteration
1 你
2 叫
3 什
4 么
5 名
6 字
7 啊
for
里面一定是要拿迭代器的. 所以所有不可迭代的东西不能用for循环for
循环里面一定有__next__
出现
总结: 迭代器统一了不同数据类型的遍历工作
迭代器本身也是可迭代的
迭代器本身的特性:
1. 只能向前不能反复
2. 特别节省内存
3. 惰性机制
案例1:
it = iter("你叫什么名字啊")
print(1,next(it))
print(2,next(it))
print(3,next(it))
print(4,next(it))
print(5,next(it))
print(6,next(it))
print(7,next(it))
print(8,next(it)) # StopIteration: 迭代已经停止了. 不可以再次从迭代器中拿数据了
#运行结果
Traceback (most recent call last):
File "D:\迭代器.py", line 11, in <module>
print(8,next(it))
^^^^^^^^
StopIteration
1 你
2 叫
3 什
4 么
5 名
6 字
7 啊
迭代器的特性