假设我有一个函数来查询一些外部有状态服务并从中返回一个值,为简单起见,我们假设该值是一个整数:
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)
我的问题是:标准库中的某个地方是否有高阶函数可以执行此操作或类似的操作?我浏览了itertools和functools,但没有发现任何我想做的事情.我错过了什么吗?
这实际上可以使用内置函数来完成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)
归档时间: |
|
查看次数: |
184 次 |
最近记录: |