Скажем, у меня есть список элементов, и я хочу перебирать их по нескольким из них:
items = list(range(10)) # I mean this to represent any kind of iterable.
limit = 5
Наивная реализация
Python naïf, исходящий из других языков, вероятно, написал бы этот вполне исправный и эффективный (если бы унииоматический) код:
index = 0
for item in items: # Python `for` loop is a for-each.
print(item) # or whatever function of that item.
index += 1
if index == limit:
break
Более идиоматическая реализация
Но Python имеет перечисление, которое приблизительно составляет примерно половину этого кода:
for index, item in enumerate(items):
print(item)
if index == limit: # There gotta be a better way.
break
Итак, мы о сокращении дополнительного кода пополам. Но должен быть лучший способ.
Можно ли приблизить поведение псевдокода ниже?
Если enumerate взял еще один необязательный аргумент stop
(например, он принимает аргумент start
следующим образом: enumerate(items, start=1)
), который, я думаю, был бы идеальным, но ниже не существует (см. документация по перечислению здесь):
# hypothetical code, not implemented:
for _, item in enumerate(items, start=0, stop=limit): # `stop` not implemented
print(item)
Обратите внимание, что нет необходимости указывать index
, потому что нет необходимости ссылаться на него.
Есть ли идиоматический способ написать выше? Как?
Второй вопрос: почему это не встроено в перечисление?