Цикл for в языке Питон позволяет перебирать... почти всё, что угодно: объекты из списка, числа из арифметической прогрессии, элементы
списков, буквы слов и т.п.
В цикле for указывается переменная и множество значений, по которому будет пробегать переменная.
Множество значений может быть задано списком, кортежем, строкой или диапазоном.
Вот простейший пример использования цикла, где в качестве множества значений используется кортеж:
i = 1for 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 in1, 2, 3, 'one', 'two', 'three':
print(obj)
При первых трёх итерациях цикла переменная i будет принимать значение типа int,
при последующих трёх — типа str.
Вернёмся к первому примеру.
В случаях, когда вместе с элементами нужны также и их индексы, идеоматический подход в питоне выглядит так:
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 = 0for 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 = 0for 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.
По данному целому неотрицательному n вычислите значение n!.
5
120
★★★
Напишите программу, которая вычисляет 1,000,000! за одну минуту.
Не пытайтесь вывести это число (в нём около 5565709 десятичных цифр, и попытка вывода может занять больше 20 минут).
Чтобы проверить правильность ответа посмотрите на длину в двоичной записи.
Если ответ хранится в переменной x, то x.bit_length() = 18488885.
PS. Функцию factorial из модуля math разумеется нельзя использовать.
★★★★★
Напишите программу, которая вычисляет 1,000,000! за одну... секунду!.
Ну ладно, можно за пять :).
По данному натуральному n≥2 вычислите сумму
1×2+2×3+...+(n−1)×n. Ответ выведите в виде
вычисленного выражение и его значения в точности, как показано в примере.
Напишите программу, которая по данному числу n от 1 до 9 выводит на экран n флагов. Изображение одного флага
имеет размер 4×4 символов, между двумя соседними флагами также имеется пустой (из пробелов) столбец. Разрешается
вывести пустой столбец после последнего флага и вообще допускается вывод
пробелов в конце строк. Внутри каждого флага должен быть записан его номер — число от 1 до n.
Символ обратного слэша “\” в текстовых строках
имеет специальное значение. Чтобы включить в состав текстовой
строки такой символ, его нужно повторить дважды. Например,
для вывода на экран одного такого символа можно использовать
такой код: print("\\").
Дано 10 целых чисел. Считайте каждое из этих чисел и выведите столько символов “*”
чему равно это число. Выводите число сразу же после считывания числа.
Дано несколько чисел. Вычислите их сумму. Сначала вводите количество чисел N, затем вводится ровно N целых чисел.
Какое наименьшее число переменных нужно для решения этой задачи?
3
1
20
300
321
★
Какое наименьшее число переменных нужно для решения этой задачи (если не использовать никаких хаков)?
Напишите в комментариях сколько и почему.
По данному натуральному числу n≤1000 выведите все натуральные
делители числа n в порядке возрастания.
Числа нужно выводить в одной строке через пробел (вспомните про параметры
функции print).
Дано N чисел: сначала вводится число N, затем вводится ровно N целых чисел. Подсчитайте количество
нулей среди введенных чисел и выведите это количество.
Даны два четырёхзначных числа A и B.
Выведите в порядке возрастания все четырёхзначные числа на отрезке от A до B,
запись которых содержит ровно три одинаковые цифры.
Рассмотрим N-домино. В таком домино каждая костяшка состоит из двух половинок, на каждой из которых нарисовано от 0 до N точек.
Полный комплект костяшек такого домино содержит все возможные костяшки, каждую по одному разу.
Например, для N=2 в комплект войдут следующие костяшки: (0,0), (0,1), (0,2), (1,1), (1,2) и (2,2).
По заданному N (1≤N≤30) определите, сколько всего точек изображено на всех костяшках полного комплекта N-домино.
Дана монотонная последовательность,
в которой каждое натуральное число k встречается ровно
k раз: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, ...
По данному натуральному n выведите первые n членов этой последовательности.
Решите задачу при помощи одного цикла for.
Операция умножения строки на число также не допускается.
Даны целые неотрицательные числа a, b, c, d, при этом
0≤c<d. Выведите в порядке возрастания все числа от a до b,
которые дают остаток c при делении на d.
В этой задаче нельзя использовать инструкцию if, операторы сравнения
(< и т.д.), должен быть только один цикл.
Необходимо заказать транспорт для перевозки N человек.
Заказывать можно автобусы и такси. В каждый автобус можно посадить не более 50 человек, в каждое такси — не более 4 человек.
Стоимость заказа автобуса составляет A рублей, такси — B рублей (разумеется, A>B).
Определите, какое количество автобусов и такси нужно заказать, чтобы потратить как можно меньшую сумму денег.
Программа получает на вход три целых числа: N, A, B (1≤N≤105, 1≤B<A≤1000).
Выведите два числа — количество автобусов и количество такси для заказа в оптимальном случае. Если возможных ответов несколько, выведите любой.
Кривая дракона — один из наиболее известных фракталов. Она строится так:
на первом шаге проводится отрезок из начала координатной плоскости в точку (0; 1).
Далее на каждом шаге из конца фрактала повторяется уже нарисованная часть фигуры, повернутая на 90 градусов против часовой стрелки
По данному числу N≥1 определите конец кривой дракона после выполнения N шагов.
Магический квадрат — это таблица 3×3,
в каждой из ячеек которой находятся числа от 0 до 9, числа могут повторяться,
но сумма чисел в каждой строке и каждом столбце равна одному числу N.
Определите по данному N сколько существует различных магических квадратов
с суммой чисел в каждой строки и каждом столбце, равной N.
Программа получает на вход одно целое неотрицательное число N и должна вывести искомое число вариантов.
Бригада скорой помощи выехала по вызову в один из отделенных районов. К сожалению,
когда диспетчер получил вызов, он успел записать только адрес дома и номер квартиры K1,
а затем связь прервалась. Однако он вспомнил, что по этому же адресу дома некоторое время назад
скорая помощь выезжала в квартиру K2, которая расположена в подъезде P2 на этаже N2.
Известно, что в доме M этажей и количество квартир на каждой лестничной площадке одинаково.
Напишите программу, которая вычилсяет номер подъезда P1 и номер этажа N1 квартиры K1.
Программа получает на вход пять положительных целых чисел K1, M, K2, P2, N2.
Все числа не превосходят 1000.
Выведите два числа P1 и N1. Если входные данные не позволяют однозначно определить P1 или N1,
вместо соответствующего числа напечатайте 0. Если входные данные противоречивы, напечатайте два числа –1 (минус один).
На страусиной ферме есть N×M птиц. Каждому страусу соорудили по загону, установив перегородки так, чтобы они образовывали прямоугольник из
N строк и M столбцов. Тем самым образуется ровно N×M квадратных загонов 1×1.
В один прекрасный осенний день страус Чак, находившийся в нижнем левом загоне,
почувствовал острую необходимость отправиться по важным и неотложным страусиным делам.
Он начал пробивать себе путь на волю, ломая перегородки. Сначала он сломал правую перегородку
и переместился загоном правее. Потом он сломал верхнюю перегородку и переместился вверх.
Далее он прокладывал себе путь по такому же принципу: ломая попеременно то правую, то верхнюю перегородку, пока, наконец, не оказался на свободе.
Хозяин, увидев разгром, учиненный Чаком, сильно расстроился. Но делать нечего —надо приводить все в порядок.
Он отправил письмо на ближайшую лесопилку, указав, сколько у него осталось перегородок,
но забыв при этом указать, сколько ему требуется.
Помогите работникам лесопилки: зная, сколько у хозяина осталось перегородок, определите, каких размеров могла быть ферма.
Программа получает на вход одно число X, 1≤X≤109 — количество оставшихся перегородок.
Программа должна вывести все возможные варианты размеров фермы, в виде чисел N и M, по одному варианту в строке. Порядок вывода вариантов не важен.