Значение по умолчанию для следующего элемента в итераторе Python, если итератор пуст?
У меня есть список объектов, и я бы хотел найти первый, для которого данный метод возвращает true для некоторого входного значения. Это относительно легко сделать в Python:
pattern = next(p for p in pattern_list if p.method(input))
Однако в моем приложении обычно нет такого p
, для которого p.method(input)
истинно, и поэтому это приведет к возникновению исключения StopIteration
. Есть ли идиоматический способ справиться с этим без написания блока try/catch?
В частности, кажется, что было бы проще обрабатывать этот случай с чем-то вроде условного if pattern is not None
, поэтому мне интересно, есть ли способ расширить мое определение pattern
, чтобы обеспечить значение None
когда итератор пуст - или если есть более Pythonic способ справиться с общей проблемой!
Ответы
Ответ 1
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
Обратите внимание, что вы должны обернуть ген xp в дополнительных круглых скобках по синтаксическим причинам, иначе:
>>> 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