Цикл for и перебор объектов

Цикл for, также называемый циклом с параметром, в языке Питон богат возможностями. В цикле for указывается переменная и множество значений, по которому будет пробегать переменная. Множество значений может быть задано списком, кортежем, строкой или диапазоном.

Вот простейший пример использования цикла, где в качестве множества значений используется кортеж:

i = 1
for color in 'red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'violet':
    print(i,'-th color of rainbow is ', color, sep='')
    i += 1

В этом примере переменная color последовательно принимает значения 'red', 'orange' и т.д. В теле цикла выводится сообщение, которое содержит название цвета, то есть значение переменной color, а также номер итерации цикла число, которое сначала равно 1, а потом увеличивается на один (инструкцией i += 1 с каждым проходом цикла).

В списке значений могут быть выражения различных типов, например:

for i in 1, 2, 3, 'one', 'two', 'three':
    print(i)

При первых трёх итерациях цикла переменная i будет принимать значение типа int, при последующих трёх — типа str.

Функция enumerate

Вернёмся к первому примеру. В случаях, когда вместе с элементами нужны также и их индексы, идеоматический подход в питоне выглядит так:

for i, color in enumerate(('red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'violet')):
    print(i+1, '-th color of rainbow is ', color, sep='')
Функция enumerate возвращает пары из порядкового номера элемента начиная с нуля и собственно самого элемента. В данном примере ещё лучше воспользоваться параметром start, тогда нумерация начнётся не с нуля, а с указанного в параметре start значения:
for i, color in enumerate(('red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'violet'), start=1):
    print(i, '-th color of rainbow is ', color, sep='')

Функция range (перебор членов арифметической прогрессии)

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

Для повторения цикла некоторое заданное число раз n можно использовать цикл for вместе с функцией range:

for i in range(n):
    Тело цикла
Например:
sum = 0
sum_sq = 0
for i in range(3):
    sq_i = i * i
    print(i, sq_i)
    sum += i
    sum_sq += sq_i
print(sum, sum_sq)

В качестве n может использоваться числовая константа, переменная или произвольное арифметическое выражение (например, 2 ** 10). Если значение n равно нулю или отрицательное, то тело цикла не выполнится ни разу.

Код выше эквивалентен такому:

sum = 0
sum_sq = 0
i = 0
sq_i = i * i
print(i, sq_i)
sum += i
sum_sq += sq_i
i = 1
sq_i = i * i
print(i, sq_i)
sum += i
sum_sq += sq_i
i = 2
sq_i = i * i
print(i, sq_i)
sum += i
sum_sq += sq_i
print(sum, sum_sq)

В этом примере можно «пощупать» эту конструкцию по шагам.

Если задать цикл таким образом:

for i in range(a, b):
    Тело цикла

то индексная переменная i будет принимать значения от a до b - 1, то есть первый параметр функции range, вызываемой с двумя параметрами, задаёт начальное значение индексной переменной, а второй параметр — значение, которая индексная переменная принимать не будет. Если же ab, то цикл не будет выполнен ни разу. Например, для того, чтобы просуммировать значения чисел от 1 до n можно воспользоваться следующей программой:

sum = 0
for i in range(1, n + 1):
    sum += i

В этом примере переменная i принимает значения 1, 2, ..., n, и значение переменной sum последовательно увеличивается на указанные значения.

Наконец, чтобы организовать цикл, в котором индексная переменная будет уменьшаться, необходимо использовать функцию range с тремя параметрами. Первый параметр задаёт начальное значение индексной переменной, второй параметр — значение, до которого будет изменяться индексная переменная (не включая его!), а третий параметр — величину изменения индексной переменной. Например, сделать цикл по всем нечётным числам от 1 до 99 можно при помощи функции range(1, 100, 2), а сделать цикл по всем числам от 100 до 1 можно при помощи range(100, 0, -1).

Более формально, цикл for i in range(a, b, d) при d > 0 задаёт значения индексной переменной i = a, i = a + d, i = a + 2 * d и так для всех значений, для которых i < b. Если же d < 0, то переменная цикла принимает все значения i > b.

Упражнения

A: Ряд

Дано натуральное число n. Напечатайте все n-значные нечётные натуральные числа в порядке убывания.

1
9 7 5 3 1
IDE

B: Сумма кубов

По данному натуральному n вычислите явным суммированием число \(1^3+2^3+3^3+...+n^3\).

3
36
★★
Это число можно вычислить и без суммирования. Напишите в комментариях чему она равна и почему.
IDE

C: Факториал

По данному целому неотрицательному n вычислите значение n!.

5
120
★★★
Напишите программу, которая вычисляет 1,000,000! за одну минуту. Не пытайтесь вывести это число (в нём около 5565709 десятичных цифр, и попытка вывода может занять больше 20 минут). Чтобы проверить правильность ответа посмотрите на длину в двоичной записи. Если ответ хранится в переменной x, то x.bit_length() = 18488885.
★★★★★
Напишите программу, которая вычисляет 1,000,000! за одну... секунду!. Ну ладно, можно за пять :).
IDE

D: Число сочетаний

По данным целым неотрицательным \(n\) и \(k\) вычислите значение числа сочетаний из \(n\) элементов по \(k\), то есть \(\frac{n!}{k!(n-k)!}\).

5 3
10
★★
Напишите программу, которая вычисляет \(C_{1,000,000}^{100,000}\) за одну минуту. Чтобы проверить правильность ответа посмотрите на длину в двоичной записи. Если ответ хранится в переменной x, то x.bit_length() = 468987. Первые пять цифр числа равны 73331.
★★★
Напишите программу, которая вычисляет \(C_{1,000,000}^{100,000}\) за одну секунду. Ну ладно, можно за четыре :).
IDE

E: Пингвины

Напишите программу, которая по данному числу n от 1 до 9 выводит на экран n пингвинов. Изображение одного пингвина имеет размер 5×9 символов, между двумя соседними пингвинами также имеется пустой (из пробелов) столбец. Разрешается вывести пустой столбец после последнего пингвина. Для упрощения рисования скопируйте пингвина из примера в среду разработки.

Учтите, что вывод данных на экран производится построчно, а не попингвинно.

Символ обратного слэша «\» в текстовых строках имеет специальное значение. Чтобы включить в состав текстовой строки такой символ, его нужно повторить дважды. Например, для вывода на экран одного такого символа можно использовать такой код: print("\\").

3
_~_ _~_ _~_ (o o) (o o) (o o) / V \ / V \ / V \ /( _ )\ /( _ )\ /( _ )\ ^^ ^^ ^^ ^^ ^^ ^^
1
_~_ (o o) / V \ /( _ )\ ^^ ^^
IDE

F: Флаги

Напишите программу, которая по данному числу n от 1 до 9 выводит на экран n флагов. Изображение одного флага имеет размер 4×4 символов, между двумя соседними флагами также имеется пустой (из пробелов) столбец. Разрешается вывести пустой столбец после последнего флага. Внутри каждого флага должен быть записан его номер — число от 1 до n.

3
+___ +___ +___ |1 / |2 / |3 / |__\ |__\ |__\ | | |
1
+___ |1 / |__\ |
IDE

G: Сумма произведений соседних чисел

По данному натуральному n⩾2 вычислите сумму 1×2+2×3+...+(n-1)×n. Ответ выведите в виде вычисленного выражение и его значения в точности, как показано в примере.

4
1*2+2*3+3*4=20
2
1*2=2
IDE

H: Чётные числа

По данным двум натуральным числам A и B (A⩽B) выведите все чётные числа на отрезке от A до B. В этой задаче нельзя использовать инструкцию if.

1 10
2 4 6 8 10
IDE

I: Сумма N чисел

Дано несколько чисел. Вычислите их сумму. Сначала вводите количество чисел N, затем вводится ровно N целых чисел.

3 1 20 300
321
Какое наименьшее число переменных нужно для решения этой задачи (если не использовать никаких хаков)? Напишите в комментариях сколько и почему.
IDE

J: Количество нулей

Дано N чисел: сначала вводится число N, затем вводится ровно N целых чисел. Подсчитайте количество нулей среди введённых чисел и выведите это количество.

5 0 7 0 2 2
2
IDE

K: Диофантово уравнение - 1

Даны числа a, b, c, d. Выведите в порядке возрастания все целые числа от 0 до 1000, которые являются корнями уравнения ax3+bx2+cx+d=0.

-1 1 -1 1
1
1 1 1 1
IDE

L: Диофантово уравнение - 2

Даны числа a, b, c, d, e. Подсчитайте количество таких целых чисел от 0 до 1000, которые являются корнями уравнения (ax3+bx2+cx+d)/(x-e)=0, и выведите их количество.

1 -2 1 0 1
1
1 1 1 1 1
0
IDE

M: Замечательные числа - 1

Найдите и выведите все двузначные числа, которые равны удвоенному произведению своих цифр.

Программа не требует ввода данных с клавиатуры, просто выводит список искомых чисел.

IDE

N: Замечательные числа - 2

Квадрат трёхзначного числа оканчивается тремя цифрами, равными этому числу. Найдите и выведите все такие числа.

Программа не требует ввода данных с клавиатуры, просто выводит список искомых чисел.

IDE

O: Замечательные числа - 3

Дано натуральное число n. Выведите в порядке возрастания все трёхзначные числа, сумма цифр которых равна n.

3
102 111 120 201 210 300
IDE

P: Лесенка

По данному натуральному n⩽9 выведите лесенку из n ступенек, i-я ступенька состоит из чисел от 1 до i без пробелов.

3
1 12 123
IDE

Q: Замечательные числа - 4

Даны два четырёхзначных числа A и B. Выведите все четырёхзначные числа на отрезке от A до B, запись которых является палиндромом.

1600 2100
1661 1771 1881 1991 2002
IDE

R: Замечательные числа - 5

Даны два четырёхзначных числа A и B. Выведите в порядке возрастания все четырёхзначные числа на отрезке от A до B, запись которых содержит ровно три одинаковые цифры.

1900 2100
1911 1999 2000 2022
IDE

S: Остатки

Даны целые неотрицательные числа a, b, c, d, при этом 0⩽c<d. Выведите в порядке возрастания все числа от a до b, которые дают остаток c при делении на d.

В этой задаче нельзя использовать инструкцию if, операторы сравнения (< и т.д.), должен быть только один цикл.

1 4 1 2
1 3
1 5 0 4
4
IDE

T: Сумма факториалов

По данному натуральному \(n\) вычислите сумму \(1!+2!+3!+...+n!\). В решении этой задачи можно использовать только один цикл.

3
9
IDE

U: Треугольная последовательность

Дана монотонная последовательность, в которой каждое натуральное число k встречается ровно k раз: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, ...

По данному натуральному n выведите первые n членов этой последовательности.

2
1 2
5
1 2 2 3 3
★★
Попробуйте обойтись только одним циклом for и целочисленной арифметикой.
IDE

V: Потерянная карточка

Для настольной игры используются карточки с номерами от 1 до N. Одна карточка потерялась. Найдите её, зная номера оставшихся карточек.

Дано число N, далее N-1 номер оставшихся карточек (различные числа от 1 до N). Программа должна вывести номер потерянной карточки.

Для самых умных — массивами и аналогичными структурами данных пользоваться нельзя.

5 1 2 3 4
5
4 3 2 4
1
IDE

W: Домино

Рассмотрим \(N\)-домино. В таком домино каждая костяшка состоит из двух половинок, на каждой из которых нарисовано от 0 до \(N\) точек. Полный комплект костяшек такого домино содержит все возможные костяшки, каждую по одному разу. Например, для \(N=2\) в комплект войдут следующие костяшки: (0,0), (0,1), (0,2), (1,1), (1,2) и (2,2). По заданному \(N\) (\(1\le N \le 30\)) определите, сколько всего точек изображено на всех костяшках полного комплекта \(N\)-домино.

2
12
IDE

X: Кинотеатр

\(X\) мальчиков и \(Y\) девочек пошли в кинотеатр и купили билеты на подряд идущие места в одном ряду. Напишите программу, которая выдаст, как нужно сесть мальчикам и девочкам, чтобы рядом с каждым мальчиком сидела хотя бы одна девочка, а рядом с каждой девочкой — хотя бы один мальчик.

Программа получает на вход два числа \(X\) и \(Y\) (оба числа натуральные, не превосходящие 100).

Выведите какую-нибудь строку, в которой будет ровно \(X\) символов B (обозначающих мальчиков) и \(Y\) символов G (обозначающих девочек), удовлетворяющую условию задачи. Пробелы между символами выводить не нужно.

Если рассадить мальчиков и девочек согласно условию задачи невозможно, выведите строку NO SOLUTION.

5 5
BGBGBGBGBG
5 3
BGBGBBGB
100 1
NO SOLUTION
IDE

Y: Транспортные расходы

Необходимо заказать транспорт для перевозки \(N\) человек. Заказывать можно автобусы и такси. В каждый автобус можно посадить не более 50 человек, в каждое такси — не более 4 человек. Стоимость заказа автобуса составляет \(A\) рублей, такси — \(B\) рублей (разумеется, \(A\gt B\)).

Определите, какое количество автобусов и такси нужно заказать, чтобы потратить как можно меньшую сумму денег.

Программа получает на вход три целых числа: \(N\), \(A\), \(B\) (\(1\le N\le10^5\), \(1\le B\lt A\le1000\)).

Выведите два числа — количество автобусов и количество такси для заказа в оптимальном случае. Если возможных ответов несколько, выведите любой.

4 3 2
0 1
IDE

Z★★: Скорая помощь

Бригада скорой помощи выехала по вызову в один из отделённых районов. К сожалению, когда диспетчер получил вызов, он успел записать только адрес дома и номер квартиры \(K_1\), а затем связь прервалась. Однако он вспомнил, что по этому же адресу дома некоторое время назад скорая помощь выезжала в квартиру \(K_2\), которая расположена в подъезде \(P_2\) на этаже \(N_2\). Известно, что в доме \(M\) этажей и количество квартир на каждой лестничной площадке одинаково. Напишите программу, которая вычисляет номер подъезда \(P_1\) и номер этажа \(N_1\) квартиры \(K_1\).

Программа получает на вход пять положительных целых чисел \(K_1\), \(M\), \(K_2\), \(P_2\), \(N_2\). Все числа не превосходят 1000.

Выведите два числа \(P_1\) и \(N_1\). Если входные данные не позволяют однозначно определить \(P_1\) или \(N_1\), вместо соответствующего числа напечатайте 0. Если входные данные противоречивы, напечатайте два числа –1 (минус один).

89 20 41 1 11
2 3
11 1 1 1 1
0 1
3 2 2 2 1
-1 -1
IDE