Pyhton——有限迭代器转无限迭代器


整体说明

  • 本文记录一个非常有用的特别函数,可用于将有限的迭代器包装变成无限的迭代器(不停重复)

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
    28
    from 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)