假设我有一个函数来查询一些外部有状态服务并从中返回一个值,为简单起见,我们假设该值是一个整数:
i = 10
def foo():
global i
i -= 1
return i
很明显,我可以在它返回一个假值之前调用这个函数9次(第10次调用将返回0,在布尔上下文中它将被评估为false)。有了一些以这种方式工作的函数,我现在可以通过将它包装在生成器中来“迭代”它:
def take_while_truthy(func):
while True:
nextval = func()
if not nextval:
break
yield nextval
然后:
for x in take_while_truthy(foo):
print x
给了我:
9
8
[...]
2
1
我的问题是:标准库中的某个地方是否有高阶函数可以执行此操作或类似的操作?我浏览了itertools和functools,但没有找到任何与我想做的事情相似的内容。我错过了什么吗?
答案 0 :(得分:8)
这实际上可以使用内置的iter()
来完成,如果你提供两个参数而不是一个,那么第一个应该是一个将被重复调用的函数,直到函数的返回值达到哨兵价值:
for x in iter(foo, 0):
print x
这是itertools解决方案的样子,iter()
绝对更清晰,但这可以让你测试任何错误的回报:
from itertools import takewhile, imap, repeat
for x in takewhile(bool, imap(lambda f: f(), repeat(foo))):
print x