42

我有一个对象列表,我想找到给定方法为某个输入值返回 true 的第一个对象。这在 Python 中相对容易做到:

pattern = next(p for p in pattern_list if p.method(input))

但是,在我的应用程序中,通常没有这样pp.method(input)情况为真,因此这将引发StopIteration异常。有没有一种惯用的方法来处理这个而不写一个 try/catch 块?

特别是,用类似条件的东西来处理这种情况似乎会更干净if pattern is not None,所以我想知道是否有一种方法可以扩展我的定义,pattern以便在迭代器为空时提供一个None值——或者是否有更多处理整体问题的 Pythonic 方式!

4

1 回答 1

71

next接受默认值:

next(...)
    next(iterator[, default])

    Return the next item from the iterator. If default is given and the iterator
    is exhausted, it is returned instead of raising StopIteration.

所以

>>> print next(i for i in range(10) if i**2 == 9)
3
>>> print next(i for i in range(10) if i**2 == 17)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> print next((i for i in range(10) if i**2 == 17), None)
None

请注意,出于语法原因,您必须将 genexp 包含在额外的括号中,否则:

>>> print next(i for i in range(10) if i**2 == 17, None)
  File "<stdin>", line 1
SyntaxError: Generator expression must be parenthesized if not sole argument
于 2013-01-10T03:10:39.413 回答