迭代函数列表时,第一个不是无响应

2024-04-27 00:56:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

这是可行的,但我不喜欢我不得不执行两次函数来执行测试并生成结果。有没有办法只执行f()一次并维护解决方案?你知道吗

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


Tags: lambda函数innonetrue列表forif
1条回答
网友
1楼 · 发布于 2024-04-27 00:56:21

在迭代时使用^{} 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)  

为了确保在python2中使用迭代器版本的filter(),我还使用了^{} function from the ^{} 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

相关问题 更多 >