作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数列表,每个函数都可以返回 None
或一个有效值。我想获取第一个 not None
响应的结果:
funcs = (lambda: None, lambda: None, lambda: True)
result = next((f() for f in funcs if f()), None) # result = True
这行得通,但我不喜欢我必须执行该函数两次才能执行测试并生成结果。有没有办法只执行一次f()
并保持解决方案?
附言。我知道我可以在 for
或传统循环中执行此操作(目前的代码就是这样),我正在寻找一个不错的单行代码:)
最佳答案
使用 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 中也使用 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
关于python - 遍历函数列表时首先不是没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41107900/
我是一名优秀的程序员,十分优秀!