关于python:“迭代”函数的返回值

“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,但没有找到我想要做的事情。我错过什么了吗?


这实际上可以使用内置的iter()来完成,如果您提供两个参数而不是一个,那么第一个参数应该是一个函数,该函数将被反复调用,直到函数的返回值达到sentinel值:

1
2
for x in iter(foo, 0):
    print x

下面是Itertools解决方案的外观,iter()绝对更干净,但这允许您测试任何错误返回:

1
2
3
from itertools import takewhile, imap, repeat
for x in takewhile(bool, imap(lambda f: f(), repeat(foo))):
    print x