整体说明
- 本文记录一个非常有用的特别函数,可用于将有限的迭代器包装变成无限的迭代器(不停重复)
Python 生成器回顾
- 斐波那契数列生成器定义和使用示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 以后调用这个函数不能再简单的理解为函数调用,要理解为创建生成器
def fibonacci_generator(n):
a, b = 0, 1
count = 0
while count < n:
yield a # 返回当前值,并暂停函数执行
a, b = b, a + b
count += 1
# 使用生成器
fib_gen = fibonacci_generator(10) # 创建生成器对象
for num in fib_gen: # for 循环访问 fib_gen即可,不需要再访问原始函数,原始函数调用一次足以
print(num, end=" ")
print("\n")
# 0 1 1 2 3 5 8 13 21 34
代码外简单解释
- 下面的程序定义了一个函数
infinite_iterator,可以对任意有限迭代器(如列表)无限次循环遍历 - 每遍历一轮,先输出 “this”,再依次输出迭代器的所有元素
- 整个过程是无限循环,除非手动终止
- 代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28from itertools import repeat
def infinite_iterator(finite_iterator):
"""
实现对有限迭代器的无限循环遍历
每次循环开始时,先打印 "this",然后依次输出迭代器的所有元素
参数:
finite_iterator: 任意可迭代对象(如列表、元组等)
实现原理:
1. 使用 itertools.repeat(finite_iterator) 实现对同一个迭代器对象的无限重复
2. 外层 for 循环每次进入时,先打印 "this"
3. 使用 yield from finite_iterator,将 finite_iterator 的所有元素依次生成,finite_iterator 被访问完以后,才会进入下一个 yield(即下个 for 迭代)
4. 这样,每次完整遍历 finite_iterator 后,又会重新开始新一轮遍历,整个过程无限循环
注意:
如果 finite_iterator 是可迭代但不可重复遍历的(如生成器),第二轮开始时将不再有元素
"""
for _ in repeat(finite_iterator): # 无限循环
print("this") # 每轮遍历前打印
yield from finite_iterator # 依次输出所有元素
# 创建生成器,循环遍历 [1, 2, 4]
iter_x = infinite_iterator([1, 2, 4])
# 无限输出 "this, 1, 2, 4, this, 1, 2, 4, this, ...",直到手动终止
for i in iter_x:
print(i)