"迭代"函数的返回值

dcr*_*sta 3 python

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

i = 10
def foo():
    global i
    i -= 1
    return i
Run Code Online (Sandbox Code Playgroud)

很明显,我可以在它返回一个假值之前调用这个函数9次(第10次调用将返回0,它将在布尔上下文中计算为false).有了一些以这种方式工作的函数,我现在可以通过将它包装在生成器中来"迭代"它:

def take_while_truthy(func):
    while True:
        nextval = func()
        if not nextval: 
            break
        yield nextval
Run Code Online (Sandbox Code Playgroud)

然后:

for x in take_while_truthy(foo):
    print x
Run Code Online (Sandbox Code Playgroud)

给我:

9
8
[...]
2
1
Run Code Online (Sandbox Code Playgroud)

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

And*_*ark 8

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

for x in iter(foo, 0):
    print x
Run Code Online (Sandbox Code Playgroud)

这是itertools解决方案可能看起来的样子,iter()绝对更清晰,但这允许您测试任何错误的返回:

from itertools import takewhile, imap, repeat
for x in takewhile(bool, imap(lambda f: f(), repeat(foo))):
    print x
Run Code Online (Sandbox Code Playgroud)