range
Например, дана задача: в массиве чисел к каждому элементу прибавить его индекс. Можно эту задачу решить через цикл while, но всё же хотелось бы через for.
Вот пример решения через цикл for:
array = [1, 5, -2, 8, 0, 2]
index = 0
for element in array:
print(element + index)
index = index + 1
Нам понадобилась дополнительная переменная для хранения текущего индекса. Но хочется иметь способ сделать наоборот: брать индексы, а по ним иметь доступ к элементам. И желательно без дополнительной переменной.
В Python так можно. А чтобы брать индексы, и в принципе последовательности чисел, есть функция range:
array = [1, 5, -2, 8, 0, 2]
for index in range(len(array)):
print(index + array[index])
Что же делает функция range? Она, будучи вызвана с одним аргументом, возвращает объект, поддерживающий протокол итерирования, который "пробегает" значения от нуля до этого аргумента (не включая значение самого аргумента), с шагом 1.
Что такое "объект, поддерживающий протокол итерирования"? Это как список, или массив, но только для нужд цикла for. Если попробовать распечатать range, то мы увидим не список значений:
>>> print(range(10))
range(0, 10)
Но в цикле for этот объект ведёт себя также, как и массив с числами от 0 до 10. И объект занимает меньше места в памяти, чем массив.
Если она вызвана с двумя аргументами, то возвращаемый объект "пробегает" значения от первого аргумента до второго.
>>> for i in range(5, 8):
... print(i)
...
5
6
7
Если же функция range вызвана с тремя аргументами, то третий аргумент - это шаг изменения значения. Он может быть и отрицательным:
>>> for i in range(8, 5, -2):
... print(i)
...
8
6