Python函数中创建迭代器

创建于 2024年7月25日修改于 2024年7月25日
Python

今天我(重新)学习到内置函数 iter 有一个带两个参数的变体,它可以让你把任何没有参数的函数变成一个迭代器。iter(function, value) 会创建一个迭代器,该迭代器返回调用函数的连续返回值,直到其中一个返回值与 value 匹配,此时迭代器完成。

例如,使用 input,我们可以创建一个循环,当用户输入内容时运行。当用户输入“exit”时,循环停止:

for user_str in iter(input, "exit"):
    # 处理用户输入...
    print(f"User typed {user_str!r}.")

试着将上面的代码复制并粘贴到终端 REPL 中,输入几行内容,看看循环如何运行。

Python 文档中还展示了另一种 iter 的用法示例,通过这种方式创建一个“块读取器”,例如从套接字读取块:

from functools import partial

for block in iter(partial(sock.recv, 64), b""):
    # 处理 64 字节的块...

上面的循环将从套接字读取 64 字节的块,直到没有内容可读为止。

另一个使用示例是一种现实模拟,当你想运行模拟直到随机数达到特定值。例如,掷骰子直到掷出 6:

from random import randint

def roll():
    return randint(1, 6)

for die_roll in iter(roll, 6):
    # 处理骰子结果。

内置 iter 带两个参数的 Python 模型

内置带两个参数的 iter 大致相当于这个生成器函数:

def iter(func, target_value):
    while target_value != (value := func()):
        yield value

:= 是 Python 3.8 版本引入的可在表达式中赋值的运算符,"the walrus operator"。

原文:https://mathspp.com/blog/til/making-an-iterator-out-of-a-function