Python 迭代函数列表时的First not none响应

Python 迭代函数列表时的First not none响应,python,lambda,Python,Lambda,我有一个函数列表,每个函数都可以返回None或有效值。我想获取第一个非None响应的结果: funcs = (lambda: None, lambda: None, lambda: True) result = next((f() for f in funcs if f()), None) # result = True 这是可行的,但我不喜欢这样,我必须执行两次函数才能执行测试并生成结果。有没有办法只执行f()一次并维护解决方案 另外,我知道我可以在for或传统循环(这就是当前的代码)中执

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

funcs = (lambda: None, lambda: None, lambda: True)
result = next((f() for f in funcs if f()), None)  # result = True
这是可行的,但我不喜欢这样,我必须执行两次函数才能执行测试并生成结果。有没有办法只执行
f()
一次并维护解决方案

另外,我知道我可以在
for
或传统循环(这就是当前的代码)中执行此操作,我正在寻找一个很好的一行:)

在迭代时使用删除任何错误结果(包括
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中也使用迭代器版本的
filter()
,我使用了

只是一个演示,表明它不会执行比需要更多的功能:

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

是的,但这将遍历所有的值
func
,这个示例很简单,但我使用的是
next()
,所以它会立即退出,因为在我的实际代码中,每个func都在执行多个数据库调用。@AlexLatchford:不,不会。python3版本的
filter
会懒散地迭代。啊,太棒了,所以如果我使用常规的python2.x版本,它会先迭代所有值,对吗?(只是为了确保我的v2过滤器逻辑正确)@AlexLatchford:是的,Python 2内置的
filter()
函数将返回一个列表,消耗了整个输入迭代器。太棒了,当计时器过期时,答案将在7分钟内被接受!