Хватит использовать range() в Python для циклов

Цикл for. Это краеугольный камень программирования - техника, которой вы научитесь, будучи новичком, и которую вы пронесете через весь свой путь программиста.

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

// JavaScript Example
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, он просто совпадает с каждым необходимым значением индекса.

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

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

В результате вы могли обнаружить функцию 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 в том, что он не очень "питонический". На самом деле мы не итерируем сам список, а используем i в качестве прокси-индекса.

На самом деле, даже в JavaScript есть методы прямого итерации над массивами (forEach() и for…of).

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

Если вы хотите правильно отслеживать "значение индекса" в цикле Python for, то ответ заключается в использовании функции 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
"""

Надеюсь, этот учебник был полезен. Какие еще способы использования функции enumerate() вы нашли? Считаете ли вы синтаксис более легким для чтения, чем range(len())? Поделитесь своими мыслями и опытом ниже!

Вернуться на верх