异常-如何获取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方式可以做到这一点吗?

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)
zeekay answered 2020-07-21T06:14:50Z
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
HYRY answered 2020-07-21T06:15:14Z
translate from https://stackoverflow.com:/questions/7102050/how-can-i-get-a-python-generator-to-return-none-rather-than-stopiteration