При поиске Python Documentation я нашел эквивалентную реализацию Python для создания Pythons zip()
функция.
Вместо того, чтобы ловить StopIteration
исключение, которое сигнализирует о том, что больше нет элементов, созданных итератором , автор ) используйте оператор if
, чтобы проверить, была ли принятая форма значения по умолчанию next()
равна object()
( "sentinel
" ) и остановите генератор:
def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By
sentinel = object()
iterators = [iter(it) for it in iterables]
while iterators:
result = []
for it in iterators:
elem = next(it, sentinel)
if elem is sentinel:
return
result.append(elem)
yield tuple(result)
Интересно, существует ли какая-либо разница между приложением исключения или выражением if
, используемым документами Python?
Или лучше, поскольку главный герой @hiro указал:
Что не так с использованием оператора try
, учитывая EAFP (проще просить прощения, чем разрешение) в Python?
def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By
iterators = [iter(it) for it in iterables]
while iterators:
result = []
for it in iterators:
try:
elem = next(it)
except StopIteration:
return
result.append(elem)
yield tuple(result)
Также как Стоян Деков сказал: "Блок try/except чрезвычайно эффективен , если исключения не подняты. Фактически ловить исключение дорого". (см. документы для получения дополнительной информации)
Но исключение произойдет только один раз, а именно, как только итератор исчерпан. Таким образом, обработка исключений будет лучшим решением в этом случае?