使用列表推导返回第一个找到的元素或无

RoQ*_*riX 2 python list-comprehension

我想优化我的python代码,我可以通过列表理解来改善以下for循环以提高性能:

for obj in self.objs:
    if obj.is_runnable():
        return obj
return None
Run Code Online (Sandbox Code Playgroud)

我的想法是做这样的事情:

objs = [obj for obj in self.objs if obj.is_runnable()]
return objs[0]
Run Code Online (Sandbox Code Playgroud)

但是我认为这不会更好,因为它不会在第一个找到的元素之后停止迭代,现在它无法处理这种None情况,但这可以通过if-else声明来避免。
我的问题:有没有办法在列表返回第一个元素后使用列表理解功能而中断?

tob*_*s_k 5

使用next默认值:

return next((obj for obj in self.objs if obj.is_runnable()), None)
Run Code Online (Sandbox Code Playgroud)

请注意,我将列表理解更改[...]为一个generator表达式(...),否则您仍将在获取第一个元素之前创建整个列表。使用(...),它将仅测试所需的多个元素。

或使用filter,哪里ClassOfObj是以下类别的占位符obj

return next(filter(ClassOfObj.is_runnable, self.objs), None)
Run Code Online (Sandbox Code Playgroud)