Перестаньте использовать range() в цикле for в Python


Цикл 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


Поделиться статьей:


Вернуться к статьям

Комментарии

    Ничего не найдено.