异常-如何获取Python生成器以返回None而不是StopIteration?
我正在使用生成器在类似于以下简单示例的列表中执行搜索:
>>> a = [1,2,3,4]
>>> (i for i, v in enumerate(a) if v == 4).next()
3
(仅举例说明一下,与上面的列表相比,我使用的列表要长得多,并且条目比None
还要复杂一些。我这样做是为了避免每次遍历整个列表 我搜索他们)
现在,如果我改为将其更改为None
,它将返回try ... except
,因为在a
中找不到任何666
条目。
如何使它返回None
? 我当然可以将其包装在try ... except
子句中,但是还有更多的Python方式可以做到这一点吗?
c00kiemonster asked 2020-07-21T06:14:22Z
2个解决方案
117 votes
如果您使用的是Python 2.6+,则应使用next
内置函数,而不要使用next
方法(在3.x中已被__next__
方法取代)。 内置的next
接受一个可选的默认参数以在迭代器耗尽时返回,而不是引发StopIteration
:
next((i for i, v in enumerate(a) if i == 666), None)
7 votes
您可以将生成器与(None,)链接:
from itertools import chain
a = [1,2,3,4]
print chain((i for i, v in enumerate(a) if v == 6), (None,)).next()
但是我认为a.index(2)不会遍历整个列表,当找到2时,搜索完成。 您可以测试一下:
>>> timeit.timeit("a.index(0)", "a=range(10)")
0.19335955439601094
>>> timeit.timeit("a.index(99)", "a=range(100)")
2.1938486138533335