本文介绍两种简

在编写需要交互输入的脚本(如算法题、CLI工具或教学示例)时,我们常需在测试阶段绕过真实用户输入,改用一组预设值进行自动化验证。虽然可以用全局变量+闭包模拟,但更优雅、符合Python风格的做法是利用迭代器协议——因为 input() 本质是一个无参、单次调用即返回一个值的函数,这与迭代器的 __next__() 方法行为高度一致。
# 将 input 重定义为从列表顺序取值的迭代器
raw_inputs = ['8', '2', '1']
input = iter(raw_inputs).__next__
# 此后所有 input() 调用将依次返回 '8' → '2' → '1'
for _ in range(3):
print(input()) # 输出: 8, 2, 1✅ 优势:
⚠️ 注意:若调用次数超过列表长度,会触发 StopIteration 异常。如需静默忽略或提供默认值,可简单封装:
from itertools import chain input = chain(['8', '2', '1'], ['']).__next__ # 超出后返回空字符串
# 注意:pop 默认从末尾移除,因此需倒序初始化或使用 pop(0)
inputs = ['1', '2', '8'] # 倒序写,或用 inputs = ['8','2','1'][::-1]
input = inputs.pop
for _ in range(3):
print(input()) # 输出: 1 → 2 → 8(若 inputs 为 ['1','2','8'])⚠️ 注意:此方式会原地修改列表,且 pop() 不是纯函数;若需多次运行测试,每次需重新初始化列表。
实际刷题或解析输入块时,常遇到多行文本。此时可结合 str.splitlines() 构建迭代器:
# 模拟标准输入中的多行数据 input_data = '''\ 8 2 1 ''' input = iter(input_data.splitlines()).__next__ print(input()) # '8' print(input()) # '2' print(input()) # '1'
? 提示:splitlines(keepends=False) 自动处理 \n, \r\n, \r 等换行符,比手动 split('\n') 更健壮。