“Iterate” a function's return values
假设我有一个函数,它查询一些外部有状态服务并从中返回一个值,为了简单起见,让我们假设该值是一个整数:
1 2 3 4 5 | i = 10 def foo(): global i i -= 1 return i |
很明显,我可以在这个函数返回一个错误值之前9次调用它(第10次调用将返回0,在布尔上下文中,它的值将为false)。通过一些这样工作的函数,我现在可以通过将其包装在生成器中来"迭代"它:
1 2 3 4 5 6 | def take_while_truthy(func): while True: nextval = func() if not nextval: break yield nextval |
然后:
1 2 | for x in take_while_truthy(foo): print x |
给我:
1 2 3 4 5 | 9 8 [...] 2 1 |
我的问题是:在标准库中,是否有一个更高阶的函数,它是这个函数还是类似的函数?我浏览了itertools和functools,但没有找到我想要做的事情。我错过什么了吗?
这实际上可以使用内置的
1 2 | for x in iter(foo, 0): print x |
下面是Itertools解决方案的外观,
1 2 3 | from itertools import takewhile, imap, repeat for x in takewhile(bool, imap(lambda f: f(), repeat(foo))): print x |