迭代器与生成器
# 迭代器
# 介绍
迭代器指的是迭代取值的工具。迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,每次一重复与上一次有关联。
单纯的循环重复并不是迭代。
# 作用
右侧方式取值只适用于有索引的数据类型,例如:列表、字符串、元组。
为了解决索引迭代取值的局限性,Python提供了一种不依赖于索引的取值方式,就是迭代器。
# 可迭代对象
可迭代对象是可以转换为迭代器对象的对象。内置有__iter__
方法的数据类型对象,都可以称之为可迭代对象。
例如:字符串、列表、元组、字典、集合、文件等
调用可迭代对象下的.__iter__()
方法,会将可迭代对象转换为迭代器对象并返回。
# 迭代对象
将可迭代对象转换为迭代器对象后,就可以调用迭代器的内置方法,对迭代器对象进行迭代取值,取出后下次调用同样方法取值会取出下一个,实现不依赖于索引取值。
在一个迭代器的值被取干净的情况下,再去取值就会报错StopIteration
。
# 缺点
迭代器不如索引取值灵活,只能按既定顺序取值,并且迭代器有生命周期,取完即完结。
# 使用
迭代器对象是内置有__next__
、__iter__
方法的对象。
迭代器对象.__next__()
得到迭代器的下一个值。同等于
next(迭代器对象)
迭代器对象.__iter__()
得到迭代器本身。同等于
iter(可迭代对象/迭代器对象)
a = ["a", "b", "c"]
# for循环。
for i in a:
print(i)
# while配合迭代器实现for循环同样的效果。
a_iterator = a.__iter__()
while True:
try:
i = a_iterator.__next__()
print(i)
except StopIteration:
break
2
3
4
5
6
7
8
9
10
11
12
13
14
for循环就是基于迭代器进行迭代取值的,其循环原理是:
调用
__iter__()
的到一个迭代对象。
迭代器对象.__next__()
拿到一个返回值,然后赋值给变量。循环步骤2,直到
__next__()
方法抛出StopIteration
异常,for循环捕捉到异常然后结束循环。
# 生成器
生成器即自定义迭代器。
# 定义生成器
yield 返回值
定义生成器需要使用yield关键字。
在函数内一旦存在yield关键字,那么调用函数时,就不会执行函数体代码,而是返回一个生成器对象。生成器对象可以挂起函数并保存函数的运行状态,能够返回多次值。
在生成器函数被迭代时,每迭代一次就会继续运行直到碰到下一个yield处并返回值,直到没有yield返回值可以返回时,抛出异常
StopIteration
。yield同return一样可以返回值,不过return的返回值只能获取一次,而yield则可以通过迭代来再次获取返回值。
# 通过生成器定义一个range功能
def my_range(start, stop, step=1):
while start < stop:
yield start
start += step
2
3
4
5
# 调用生成器
def my_range(start, stop, step=1):
while start < stop:
yield start
start += step
# 调用生成器函数来创建迭代器
r = my_range(1, 3)
# 对其进行迭代
while True:
try:
i = r.__next__()
print(i)
except StopIteration:
break
2
3
4
5
6
7
8
9
10
11
12
13
14