“迭代”函数的返回值

时间:2011-12-20 20:52:03

标签: python

假设我有一个函数来查询一些外部有状态服务并从中返回一个值,为简单起见,我们假设该值是一个整数:

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

我的问题是:标准库中的某个地方是否有高阶函数可以执行此操作或类似的操作?我浏览了itertoolsfunctools,但没有找到任何与我想做的事情相似的内容。我错过了什么吗?

1 个答案:

答案 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