Цикл for. Краеугольный камень программирования. Технологический приём, который вы осваиваете, ещё будучи новичком, и продолжаете использовать в течение всей своей карьеры программиста. 

Если вы использовали другие популярные языка, например PHP или JavaScript, вы знакомы с использованием переменной для отслеживания текущего индекса.

// Пример на JavaScript
let scores = [54,67,48,99,27];
for(const i=0; i < scores.length; i++) {
   console.log(i, scores[i]);
}
/*
0 54
1 67
2 48
3 99
4 27
*/

Важно понимать, что эти циклы for фактически не выполняют итерацию по массиву. Они перебирают выражение, которое служит посредником для ссылки на каждое значение массива.

В примере выше i не имеет явного отношения к scores, просто оно совпадает с каждым необходимым значением индекса.

Старый (плохой) способ

В Python традиционный цикл for в показанном выше виде не существует. Однако, почему бы не адаптировать любимый способ под язык?

В результате быстро обнаруживается функция range() и получается подобный код:

scores = [54,67,48,99,27]
for i in range(len(scores)):
   print(i, scores[i])
"""
0 54
1 67
2 48
3 99
4 27
"""

Проблема с этим циклом for состоит в том, что он не очень в стиле Python. То есть мы не перебираем список, а используем i в качестве предварительного индекса. 

На самом деле даже в JavaScript существуют методы прямого перебора массива (forEach() и for…of).

Использование функции enumerate() 

Если вы хотите правильно отслеживать “значение индекса” в цикле for в Python, используйте функцию enumerate(), которая “считает” итерируемое. Её можно использовать для других типов данных: строк, кортежей и словарей. 

Функция принимает два аргумента: итерируемое и необязательный аргумент начала отсчёта. 

Если начало отсчёта не задано, по умолчанию оно будет 0. Затем функция будет возвращать кортежи с текущим порядковым номером и соответствующим значением итерируемого. 

scores = [54,67,48,99,27]

for i, score in enumerate(scores):
print(i, score)

Этот код намного чище! Мы избегаем работы со списками индексов, перебираем фактические значения и явно видим каждое значение в определении цикла for.

В качестве бонуса: обычно, если нужно напечатать нумерованный список, приходится добавлять i + 1 из-за того, что первый индекс 0. Просто передайте значение 1 в enumerate() и наслаждайтесь магией!

scores = [54,67,48,99,27]
for i, score in enumerate(scores, 1):
   print(i, score)
"""
1 54
2 67
3 48
4 99
5 27
"""

Надеюсь, статья была вам полезна. Другие полезные рекомендации вы можете найти в моей статье 4 простых способа рефакторинга кода.

Читайте также:


Перевод статьи Jonathan Hsu: Stop Using range() in Your Python for Loops

Предыдущая статья10 шаблонов поведения для UX-дизайна
Следующая статьяПлохие практики Angular