迭代函数列表时首先不是没有响应

时间:2016-12-12 19:14:10

标签: python lambda

我有一个功能列表,每个功能都可以返回None或有效值。我想获取第一个not None响应的结果:

funcs = (lambda: None, lambda: None, lambda: True)
result = next((f() for f in funcs if f()), None)  # result = True

这样可行,但我不喜欢我必须执行该功能两次才能执行测试并生成结果。有没有办法只执行一次f()并维护解决方案?

PS。我知道我可以在for或传统循环中执行此操作(代码目前是如何),我正在寻找一个漂亮的内容:)

1 个答案:

答案 0 :(得分:4)

在迭代时使用filter() function删除任何虚假结果(包括None):

try:
    # Forward compatibility for Python 2
    from future_builtins import filter
except ImportError:
    pass

result = next(filter(None, (f() for f in funcs)), None)  

为了确保您在Python 2中使用{em> iterator 版本的filter(),我还使用了filter function from the future_builtins module

只是一个演示,表明这不会执行超出需要的功能:

>>> import sys
>>> from future_builtins import filter
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=12, releaselevel='final', serial=0)
>>> funcs = (lambda: None, lambda: None, lambda: True, lambda: 1/0)  # last one throws an exception!
>>> next(filter(None, (f() for f in funcs)), None)
True