Цикл 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 obj in 1, 2, 3, 'one', 'two', 'three':
    print(obj)

При первых трёх итерациях цикла переменная 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):
    Тело цикла
Например:
s = 0
for i in range(3):
    print(i, i * i)
    s += i * i
print(s)

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

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

s = 0
# Начали
i = 0
print(i, i * i)
s += i
# Ещё раз
i = 1
print(i, i * i)
s += i
# Ещё раз
i = 2
print(i, i * i)
s += i
# Закончили
print(s)

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

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

то индексная переменная i будет принимать значения от a до b - 1, то есть первый параметр функции range, вызываемой с двумя параметрами, задаёт начальное значение индексной переменной, а второй параметр — значение, которая индексная переменная принимать не будет. Если же a ⩾ b, то цикл не будет выполнен ни разу. Например, для того, чтобы просуммировать значения чисел от 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: Ряд — 1

Даны два целых числа A и B (при этом A≤B). Выведите все числа от A до B включительно.

1 5
1 2 3 4 5

B: Ряд — 2

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

5 1
5 4 3 2 1

C: Ряд — 3

Напечатайте в порядке убывания 100 наименьших квадратов целых положительных чисел. Программа ничего не получает на вход, только выводит нужные числа.

 
10000 9801 ... 4 1

D: Ряд — 4

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

1
9 7 5 3 1

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

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

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

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

По данному натуральному $n$ вычислите сумму $1\times2+2\times3+...+(n-1)\times n$.

4
20
2
2

G: Факториал

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

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

H: Сумма чисел от 1 до n

По данному натуральному $n\ge1$ вычислите сумму $1+2+...+n$. Ответ выведите в виде вычисленного выражение и его значения в точности, как показано в примере.

В этой задаче нельзя использовать if.

4
1+2+3+4=10
1
1=1

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

По данному натуральному $n\ge2$ вычислите сумму $1\times2+2\times3+...+(n-1)\times n$. Ответ выведите в виде вычисленного выражение и его значения в точности, как показано в примере.

В этой задаче нельзя использовать if.

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

J: Четные числа

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

1 10
2 4 6 8 10

K: Флаги

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

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

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

L: Звездочки

Дано 10 целых чисел. Считайте каждое из этих чисел и выведите столько символов “*” чему равно это число. Выводите число сразу же после считывания числа.

1 2 3 4 5 6 7 8 9 10
* ** *** **** ***** ****** ******* ******** ********* **********

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

Дано несколько чисел. Вычислите их сумму. Сначала вводите количество чисел N, затем вводится ровно N целых чисел. Какое наименьшее число переменных нужно для решения этой задачи?

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

N: Делители

По данному натуральному числу \(n\le 1000\) выведите все натуральные делители числа \(n\) в порядке возрастания. Числа нужно выводить в одной строке через пробел (вспомните про параметры функции print).

10
1 2 5 10

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

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

5 0 7 0 2 2
2

P: Цифры числа

Дано 10-значное число. Выведите все цифры этого числа в обратном порядке по одной, без разделителей.

1234567890
0987654321

Q: Замечательные числа — 1

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

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

R: Замечательные числа — 2

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

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

S: Замечательные числа — 3

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

3
102 111 120 201 210 300

T: Лесенка

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

3
1 12 123

U: Замечательные числа — 4

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

1600 2100
1661 1771 1881 1991 2002

V: Замечательные числа — 5

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

1900 2100
1911 1999 2000 2022

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

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

3
9

X: Домино

Рассмотрим \(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

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

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

По данному натуральному $n$ выведите первые $n$ членов этой последовательности. Решите задачу при помощи одного цикла for. Операция умножения строки на число также не допускается.

2
1 2
5
1 2 2 3 3

Z: Остатки

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

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

1 4 1 2
1 3
1 5 0 4
4

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

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

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

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

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

Тесты к этой задаче закрытые.

4 3 2
0 1

ZB★: Кривая дракона

Кривая дракона — один из наиболее известных фракталов. Она строится так: на первом шаге проводится отрезок из начала координатной плоскости в точку (0; 1). Далее на каждом шаге из конца фрактала повторяется уже нарисованная часть фигуры, повернутая на 90 градусов против часовой стрелки

dragon

По данному числу \(N\ge 1\) определите конец кривой дракона после выполнения \(N\) шагов.

Тесты к этой задаче закрытые.

2
1 1
4
2 -2

ZC★: Магический квадрат

Магический квадрат — это таблица 3×3, в каждой из ячеек которой находятся числа от 0 до 9, числа могут повторяться, но сумма чисел в каждой строке и каждом столбце равна одному числу \(N\).

Определите по данному \(N\) сколько существует различных магических квадратов с суммой чисел в каждой строки и каждом столбце, равной \(N\).

Программа получает на вход одно целое неотрицательное число \(N\) и должна вывести искомое число вариантов.

0
1
1
6

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

Бригада скорой помощи выехала по вызову в один из отделенных районов. К сожалению, когда диспетчер получил вызов, он успел записать только адрес дома и номер квартиры \(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

ZE★: Страусиная ферма

На страусиной ферме есть \(N\times M\) птиц. Каждому страусу соорудили по загону, установив перегородки так, чтобы они образовывали прямоугольник из \(N\) строк и \(M\) столбцов. Тем самым образуется ровно \(N\times M\) квадратных загонов \(1\times 1\).

В один прекрасный осенний день страус Чак, находившийся в нижнем левом загоне, почувствовал острую необходимость отправиться по важным и неотложным страусиным делам. Он начал пробивать себе путь на волю, ломая перегородки. Сначала он сломал правую перегородку и переместился загоном правее. Потом он сломал верхнюю перегородку и переместился вверх. Далее он прокладывал себе путь по такому же принципу: ломая попеременно то правую, то верхнюю перегородку, пока, наконец, не оказался на свободе.

Хозяин, увидев разгром, учиненный Чаком, сильно расстроился. Но делать нечего —надо приводить все в порядок. Он отправил письмо на ближайшую лесопилку, указав, сколько у него осталось перегородок, но забыв при этом указать, сколько ему требуется.

Помогите работникам лесопилки: зная, сколько у хозяина осталось перегородок, определите, каких размеров могла быть ферма.

Программа получает на вход одно число \(X\), \(1\le X\le 10^9\) — количество оставшихся перегородок.

Программа должна вывести все возможные варианты размеров фермы, в виде чисел \(N\) и \(M\), по одному варианту в строке. Порядок вывода вариантов не важен.

9
3 1 2 2