如果迭代器为空,Python迭代器中下一个元素的默认值?

时间:2013-01-10 03:03:35

标签: python iterator

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

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

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

特别是,用pattern有条件的方式来处理这种情况似乎更干净,所以我想知道是否有办法扩展我对None的定义以提供一个迭代器为空时的{{1}}值 - 或者是否有更多的Pythonic方法来处理整体问题!

1 个答案:

答案 0 :(得分:37)

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