1. 生成器 generator
1. 定义
可作用于 for循环
,也可以被 next()
函数不断调用
形式一:列表生成式的 []
改为 ()
l = [x * x for x in range(10)] # 列表生成式
g = (x * x for x in range(10)) # 生成器
形式二:函数定义中包含 yield
关键字
def func():
b = 1
yield b
b += 1
2. 输出方式
形式一:next()
一个一个输出,最后报 StopIteration
的错误。使用这种方式需要捕获异常,异常返回值包含在 StopIteration
的 value
中
except StopIteration as e:
e.value
形式二:for循环
一次性输出
3. 工作原理
for循环 :在 for循环
的过程中不断算出下一个元素,并在适当的条件结束for循环
函数改成的生成器:遇到return或执行到函数最后一行就是结束生成器的指令,for循环随之结束
2. 可迭代对象 iterable
1. 定义
list
、tuple
等可用 for循环
遍历,这种遍历称为迭代(iteration),list、tuple等称为可迭代对象(iterable)
for i in [1,2,3]:
print(i)
2. 类型
集合数据类型:list、tuple、str、dict、set
generator:生成器和带 yield
的生成器函数
3. 说明
python中的迭代是用 for...in
来完成的
判断一个对象是否是可迭代对象:
>>> from collections.abc import Iterable
>>> isinstance([], Iterable)
True
3. 迭代器 iterator
1. 定义
可以被 next()
函数调用并不断返回下一个值的对象。
2. 说明
- 生成器都是迭代器对象,但 list、dict、str 虽然是可迭代的,但不是迭代器。
- 把 list、dict、str等可迭代对象变成迭代器可使用
iter()
函数
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
小结
- 可作用于
for循环
的对象都是 可迭代类型 - 可作用于
next()
的对象都是 迭代器类型,它们表示一个惰性计算的序列 - 集合数据类型如
list
、dict
、str
等是可迭代的,但不是迭代器,可通过iter()函数
获得一个迭代器对象 - Python的
for循环
本质上是通过不断调用next()函数
实现的。- 例如:
for i in [1,2,3]:
print(i)
# 完全等价于:
it = iter([1,2,3])
while True:
try:
i = next(it)
except StopIteration:
break