enumerate вместо range(len(...))
Как получить и номер, и сам элемент, не обращаясь по индексу.
Как обычно пишут
for i in range(len(spisok)):
print(i, spisok[i])
Работает. Но индекс здесь нужен только чтобы достать элемент, а не сам по себе.
enumerate
for i, znachenie in enumerate(spisok):
print(i, znachenie)
Он выдаёт пару: номер и сам элемент. Обращение по индексу исчезает, а вместе с ним — возможность промахнуться мимо границы.
Нумерация с единицы
Второй довод задаёт, с чего начинать счёт:
for nomer, stroka in enumerate(stroki, start=1):
print(f"строка {nomer}: {stroka}")
Это важнее, чем кажется. Номера строк, пунктов и позиций человек считает с единицы: в текстовом редакторе первая строка первая, а не нулевая. Отдать номера с нуля значит отправить человека искать не туда.
Когда индекс всё-таки нужен
Если по ходу цикла надо смотреть на соседей:
for i in range(1, len(zamery)):
raznica = zamery[i] - zamery[i - 1]
Здесь range уместен: индекс используется по-настоящему, а не только
для доступа. Но и тут есть способ обойтись без него — zip со
сдвигом:
for prezhniy, tekushchiy in zip(zamery, zamery[1:]):
raznica = tekushchiy - prezhniy
Какой вариант читается лучше — вопрос вкуса. Какой безопаснее — второй: в нём нет ни одного индекса, а значит и ошибки на единицу.