我有一个功能列表,每个功能都可以返回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
或传统循环中执行此操作(代码目前是如何),我正在寻找一个漂亮的内容:)
答案 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