Если вы хотите избежать итерации по всему списку, вы можете использовать генераторное понимание вместо списка.Например:
next(i for i in range(0, 2**1000) if i % 2 == 1)
Итерация по всему диапазону займет некоторое время, но при использовании понимания генератора это происходит мгновенно.
Обратите внимание, что если он не находит предмет, вы получаете StopIteration
исключение вместо IndexError
.Вы действительно должны поймать это и обернуть его в другое исключение, потому что паразит StopIteration
, распространяющийся по стеку, может вызвать странное поведение.
Обтекание StopIteration
выглядит следующим образом:
>>> try:
... next(i for i in range(0, 100) if i % 2 == 3 )
... except StopIteration:
... raise IndexError("Couldn't find item")
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
StopIteration
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
IndexError: Couldn't find item
Обратите внимание, что вместо значения StopIteration
:
>>> print(next((i for i in range(0, 100) if i % 2 == 3), None))
None
вы можете задать для
next
значение по умолчанию, которое будет возвращаться по умолчанию.