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 遇到文件末尾也返回 '')。不过更常见的是用非空哨兵,例如:
明仔PHP零基础(一日通)教程都是PHP基础,全部带详细注释,能让新接触者很容易看懂,和几个基础例子,包括登陆,数组,函数,分页的详解。
338 立即学习“”;
- 读取用户输入直到输入
'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 或生成器表达式使用。不复杂但容易忽略。
以上就是Python基础:iter函数的两个参数的详细内容,更多请关注php中文网其它相关文章!
微信扫一扫打赏
支付宝扫一扫打赏
