Алла Тамбовцева, НИУ ВШЭ
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 на каждой итерации цикла (если чисел не очень много).
range(0, 5)
range(0, 5)
Последовательность можно преобразовать в список, чтобы увидеть, что внутри (исходная последовательность от нас скрыта):
list(range(0, 5))
[0, 1, 2, 3, 4]
Соединим цикл for
и функцию range()
и выведем на экран все числа от 0 до 4:
for i in range(0, 5):
print(i)
0 1 2 3 4
По умолчанию функция range()
создаёт последовательности с шагом 1. Но шаг можно изменить, добавив необязательный аргумент step
– название можно опустить:
list(range(0, 10, 2))
[0, 2, 4, 6, 8]
Шаг может быть отрицательным, тогда мы получим последовательность, отсортированную по убыванию. В таком случае сначала нужно указывать правый конец интервала, а потом – левый:
list(range(10, 2, -2))
[10, 8, 6, 4]
Если сначала указать меньшее значение, то мы получим пустой список. Это происходит потому, что мы даём Python противоречивые указания – range()
двигается всегда слева направо, а отрицательный шаг предполагает движение справа налево:
list(range(2, 10, -2))
[]
Теперь рассмотрим задачу из второго примера – вывод на экран элемента списка. Здесь всё просто:
cars = ["Volvo", "BMW", "Ford", "Mazda"]
for car in cars:
print(car)
Volvo BMW Ford Mazda
Цикл for
умеет двигаться не только по спискам и range
, он работает с любыми последовательностями, например, со строками:
for letter in "abcde":
print(letter.upper())
A B C D E