Программирование на Python

Алла Тамбовцева, НИУ ВШЭ

Функция range() и цикл for

В C# есть два варианта реализации цикла for:

  • конструкция с оператором for;
  • конструкция с оператором foreach.

Пример первой конструкции (отсюда):

for (int i = 0; i < 5; i++) 
{
  Console.WriteLine(i);
}

0
1
2
3
4

Пример второй конструкции:

string[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
foreach (string i in cars) 
{
  Console.WriteLine(i);
}

Volvo
BMW
Ford
Mazda

В Python цикл for работает в логике второй конструкции с foreach: он выполняет набор операций для каждого элемента в некотором перечне. Первая конструкция в Python представлена циклом while. Для того чтобы решить задачу из первого примера – вывести на экран целые числа от 0 до 4 включительно – с помощью цикла for, нам вдобавок понадобится функция range().

Функция range() создаёт последовательности из целых чисел на некотором отрезке, правый конец отрезка исключается. У этой функции есть важная особенность – она создаёт не список из целых чисел, а именно неизменяемую последовательность, отдельный тип range. Эта функция производит все числа за один раз, в этом её минус (если чисел много, большие затраты памяти), но в сочетании с циклом for она работает гораздо быстрее, чем код с увеличением на 1 на каждой итерации цикла (если чисел не очень много).

In [1]:
range(0, 5)
Out[1]:
range(0, 5)

Последовательность можно преобразовать в список, чтобы увидеть, что внутри (исходная последовательность от нас скрыта):

In [2]:
list(range(0, 5))
Out[2]:
[0, 1, 2, 3, 4]

Соединим цикл for и функцию range() и выведем на экран все числа от 0 до 4:

In [3]:
for i in range(0, 5):
    print(i)
0
1
2
3
4

По умолчанию функция range() создаёт последовательности с шагом 1. Но шаг можно изменить, добавив необязательный аргумент step – название можно опустить:

In [5]:
list(range(0, 10, 2))
Out[5]:
[0, 2, 4, 6, 8]

Шаг может быть отрицательным, тогда мы получим последовательность, отсортированную по убыванию. В таком случае сначала нужно указывать правый конец интервала, а потом – левый:

In [6]:
list(range(10, 2, -2))
Out[6]:
[10, 8, 6, 4]

Если сначала указать меньшее значение, то мы получим пустой список. Это происходит потому, что мы даём Python противоречивые указания – range() двигается всегда слева направо, а отрицательный шаг предполагает движение справа налево:

In [7]:
list(range(2, 10, -2))
Out[7]:
[]

Теперь рассмотрим задачу из второго примера – вывод на экран элемента списка. Здесь всё просто:

In [8]:
cars = ["Volvo", "BMW", "Ford", "Mazda"]

for car in cars:
    print(car)
Volvo
BMW
Ford
Mazda

Цикл for умеет двигаться не только по спискам и range, он работает с любыми последовательностями, например, со строками:

In [9]:
for letter in "abcde":
    print(letter.upper())
A
B
C
D
E