Хватит использовать 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())
? Поделитесь своими мыслями и опытом ниже!