Цикл 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
).
Если вы хотите правильно отслеживать “значение индекса” в цикле 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
Комментарии