iter(callable, sentinel)反复调用callable直至其返回值==sentinel,此时停止迭代且不包含哨兵;callable须为无参可调用对象,常用于流式读取如iter(f.readline, '')或iter(input, 'quit')。

Python 中的 iter() 函数通常接收一个参数(可迭代对象),但其实它支持**两个参数的用法**:第一个是**可调用对象(callable)**,第二个是**哨兵值(sentinel)**。这种用法常用于按需读取流式数据(比如文件、网络响应或自定义生成逻辑),直到遇到特定值为止。
两个参数的 iter 是怎么工作的?
当传入两个参数时,iter(callable, sentinel) 会反复调用 callable(),直到其返回值等于 sentinel(注意:用 == 比较,不是 is),此时迭代停止,不包含哨兵值本身。
关键要求:
- 第一个参数必须是**无参 callable**(如函数、lambda、方法绑定等);
- 每次调用它应返回一个值;
- 第二个参数是用于终止的“结束标记”。
典型应用场景:逐行读文件直到空行
比如读取一个配置文件,只处理到第一个空行为止:
with open('config.txt') as f:
for line in iter(f.readline, ''):
if line.strip() == '':
break
print(line.rstrip())
这里 f.readline 是无参 callable,'' 是哨兵(readline 遇到文件末尾也返回 '')。不过更常见的是用非空哨兵,例如:
技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作
立即学习“Python免费学习笔记(深入)”;
- 读取用户输入直到输入
'quit':iter(input, 'quit')(注意 Python 3 中input是函数) - 从队列中持续取值直到收到
None:iter(queue.get, None)(需确保队列不阻塞,或配合 timeout)
注意事项和常见错误
容易出错的地方:
- 第一个参数带括号就错了,比如
iter(f.readline(), sentinel)—— 这会立即执行并传入返回值,不是 callable - callable 每次必须能被安全调用;如果抛异常,迭代直接中断(不会捕获)
- 哨兵值必须是可比较的;若 callable 返回自定义对象,需实现
__eq__ - 无法用于已知长度的容器(如 list、tuple),因为它们不是 callable
本质上,双参数 iter 提供了一种简洁的“条件循环迭代”语法,把 while 循环 + break 的逻辑封装成迭代器,方便配合 for、itertools 或生成器表达式使用。不复杂但容易忽略。









