Цикл while («пока») позволяет выполнить
одну и ту же последовательность действий, пока проверяемое условие истинно.
Условие записывается до тела цикла и проверяется до выполнения тела цикла.
Как правило, цикл while используется, когда невозможно
определить точное значение количества проходов исполнения цикла.
Синтаксис цикла while в простейшем случае выглядит так:
while условие:
блок инструкций
При выполнении цикла while сначала проверяется условие.
Если оно ложно, то выполнение цикла прекращается и управление
передается на следующую инструкцию после тела цикла while.
Если условие истинно, то выполняется инструкция, после чего условие
проверяется снова и снова выполняется инструкция.
Так продолжается до тех пор, пока условие будет истинно.
Как только условие станет ложно, работа цикла завершится и
управление передастся следующей инструкции после цикла.
Например, следующий фрагмент программы напечатает на экран
квадраты всех целых чисел от 1 до 10. Видно, что цикл
while может заменять цикл for ... in range(...):
i = 1while i <= 10:
print(i)
i += 1
В этом примере переменная i внутри цикла изменяется от 1 до 10.
Такая переменная, значение которой меняется с каждым новым проходом цикла,
называется счетчиком. Заметим, что после выполнения этого фрагмента
значение переменной i будет равно 11,
поскольку именно при i==11 условие i<=10 впервые
перестанет выполняться.
Вот еще один пример использования цикла while
для определения количества цифр натурального числа n:
n = int(input())
length = 0while n > 0:
n //= 10
length += 1
В этом цикле мы отбрасываем по одной цифре числа, начиная с конца,
что эквивалентно целочисленному делению на 10 (n //= 10),
при этом считаем в переменной length, сколько раз это было сделано.
В языке Питон есть и другой способ решения этой задачи:
length = len(str(i)).
После тела цикла можно написать слово else:
и после него блок операций, который будет
выполнен один раз после окончания цикла, когда проверяемое
условие станет неверно:
i = 1while i <= 10:
print(i)
i += 1else:
print('Цикл окончен, i =', i)
Казалось бы, никакого смысла в этом нет, ведь эту же инструкцию можно
просто написать после окончания цикла. Смысл появляется только
вместе с инструкцией break, использование которой внутри цикла
приводит к немедленному прекращению цикла, и при этом не исполняется ветка
else. Разумеется, инструкцию break осмыленно
вызывать только из инструкции if, то есть она должна выполняться
только при выполнении какого-то особенного условия.
Другая инструкция управления циклом —
continue (продолжение цикла). Если эта инструкция
встречается где-то посередине цикла, то пропускаются все оставшиеся
инструкции до конца цикла, и исполнение цикла продолжается
со следующей итерации.
Инструкции break, continue и ветка
else: можно использовать и внутри цикла for.
Тем не менее, увлечение инструкциями break и continue
не поощряется, если можно обойтись без их использования. Вот типичный пример
плохого использования инструкции break.
В первый день спортсмен пробежал x километров,
а затем он каждый день увеличивал пробег на 10% от предыдущего значения.
По данному числу y определите номер дня, на который пробег спортсмена составит
не менее y километров.
Программа получает на вход действительные числа x и y и должна вывести одно натуральное
число.
Названия x и y используются здесь для удобства
обозначения. Называть переменные буквами x и y нельзя.
Иногда нужно обрабатывать последовательность объектов до тех пор, пока не встретится какой-то «особый» объект.
И тут есть два варианта: нужно остановиться после обработки «особого» объекта, либо до.
Если «особый» элемент нужно обработать, то обычно пишут так:
x = любое_не_особое_значение
while x isnot особый:
x = взять_следующий
обработать
Если «особый» элемент НЕ нужно обрабатывать (то есть нужно остановиться сразу), то обычно пишут так:
x = взять_следующий
while x isnot особый:
обработать
x = взять_следующий
Первый вариант использования цикла предпочтителен сразу по нескольким причинам.
Во-первых, каждая итерация цикла начинается с взятия нового значения.
Если мы на предыдущей итерации сделали continue, то в этой итерации сразу всё ок.
Во-вторых, значение заполняется ровно в одном месте.
Если код для получения нового значения длинный, то он не будет дублироваться.
Ну и без дублирования кода нельзя забыть исправить дубль.
Начиная с python 3.8 (у нас на сервере ещё python 3.5, увы) можно писать и второй вариант обработки без повторов, вот так:
while (x := взять_следующий) isnot особый:
обработать
Пользователь вводит слова по одному в строке, программа выводит
эти слова, разворачивая их в обратном порядке. Программа останавливается,
когда пользователь введёт “STOP!”
Программа получает на вход последовательность целых неотрицательных чисел,
каждое число записано в отдельной строке. Последовательность завершается числом
0, при считывании которого программа должна закончить свою работу и вывести
количество членов последовательности (не считая завершающего числа 0).
Когда мы ищем что-то самое большое или самое маленькое, то часто удобно сначала положить в переменную что-то, что уж точно меньше (ну или больше), чем всё,
что нам может встретиться.
В питоне для этого можно использовать бесконечности:
∞=float('inf'), −∞=float('-inf')
x = float('inf')
x > 10000# True
x > 1098465164864134681315# True
x > 1e300# True
Ещё один плюс бесконечностей в том, что их легко отличить от «обычных» чисел.
Если в переменной осталась бесконечность, значит ничего дельного мы не встретили.
Последовательность состоит из натуральных чисел и завершается числом 0.
Определите значение наименьшего элемента последовательности.
Гарантируется, что в последовательности есть хотя бы один элемент
(кроме завершающего числа 0).
1
7
9
0
1
IDE
O: Количество чётных чисел в начале последовательности
Последовательность завершается числом 0.
Определите, какое число чётных чисел идёт в начале последовательности
(длину наибольшего префикса последовательности, состоящего только из чётных чисел).
Сам 0 при этом не считается элементом последовательности.
Леонид учится считать, он изучает натуральные числа и называет
их, начиная с числа 1 подряд: 1, 2, 3, ... В какой-то момент он сбился со счёта.
Определите, сколько чисел он назвал правильно.
Программа получает на вход последовательность чисел, которая заканчивается
числом 0. Определите, сколько начальных членов этой последовательности совпадает с натуральным рядом.
Освоив счёт начиная с числа 1, Леонид учится считать начиная с произвольного
натурального числа, но в какой-то момент он сбился со счёта.
Определите, сколько чисел он назвал правильно.
Программа получает на вход последовательность чисел, которая заканчивается
числом 0, первое число последовательности ненулевое.
Определите, сколько начальных членов этой последовательности являются последовательными
целыми числами.
В этой задаче нельзя использовать if.
3
4
5
7
6
0
3
3
2
1
0
1
IDE
R: Количество элементов, которые больше предыдущего элемента последовательности
Последовательность состоит из натуральных чисел и завершается числом 0.
Определите, сколько элементов этой последовательности больше предыдущего элемента.
Последовательность состоит из
натуральных чисел и завершается числом 0.
Определите, какое количество элементов этой последовательности,
равны ее наибольшему элементу.
Гарантируется, что в последовательности есть хотя бы один элемент
(кроме завершающего числа 0).
Последовательность состоит из
натуральных чисел не превосходящих 109 и завершается числом 0.
Определите значение второго минимального по величине элемента
в этой последовательности, то есть элемента,
который будет наименьшим, если из последовательности удалить наименьший элемент.
Последнее число 0 не учитывается. Гарантируется, что в последовательности есть хотя бы два элемента
(кроме завершающего числа 0).
Для удобства решения можно использовать тот факт, что все элементы
последовательности не превосходят 109.
Вам известен курс акций в течение ближайших N дней.
Необходимо один раз купить одну акцию по указанному курсу,
затем продать её по новому курсу спустя один или несколько дней.
Определите, какую максимальную сумму вы сможете при этом заработать.
Вы обязаны совершить ровно одну покупку и затем одну продажу, даже если
курс акций монотонно убывает (в этом случае вам всё равно нужно
вывести наибольшее возможное число, даже если оно будет отрицательным).
Программа получает на вход последовательность натуральных чисел — курсы акций.
Значения чисел не превосходят 109. Последовательность завершается числом 0, которое
является признаком окончания ввода, а не одним из данных чисел.
Программа должна вывести одно целое число — максимально возможную величину прибыли.
Последовательность Фибоначчи определяется так:
φ0=0,φ1=1,...,φn=φn−1+φn−2.
Дано натуральное число A≥2. Определите, каким по счету числом Фибоначчи
оно является, то есть выведите такое число n, что φn=A.
Если А не является числом Фибоначчи, выведите число -1.
Класс написал контрольную работу. В результате ровно A% учащихся получили 5,
ровно B% — 4, ровно C% — 3, а остальные D% написали её на 2.
Какое минимальное количество школьников должно быть в классе для того, чтобы могли получиться такие результаты?
Вводятся 4 целых числа от 0 до 100 — A, B, C, D (A+B+C+D=100).
40
50
5
5
20
IDE
Y: Максимальное число идущих подряд одинаковых элементов
Дана последовательность натуральных чисел, завершающаяся числом 0. Определите,
какое наибольшее число подряд идущих элементов этой последовательности
равны друг другу.
1
7
7
9
1
0
2
IDE
Z: Максимальная длина монотонного фрагмента последовательности
Дана последовательность натуральных чисел, завершающаяся число 0.
Определите наибольшую длину монотонного фрагмента последовательности
(то есть такого фрагмента, где все элементы либо больше предыдущего,
либо меньше).
Последовательность состоит из натуральных чисел, причем
какое-то из чисел составляет более половины от общего числа
членов последовательности. Найдите это число.
Программа должна использовать O(1) памяти, то есть нельзя
сохранять неограниченное количество элементов последовательности
в памяти.
Дана последовательность натуральных чисел x1, x2, ..., xn.
Стандартным отклонением называется величина
σ=n−1(x1−s)2+(x2−s)2+…+(xn−s)2
где s=nx1+x2+…+xn — среднее арифметическое последовательности.
Определите стандартное отклонение для данной последовательности натуральных чисел,
завершающейся числом 0.
Гарантируется, что в последовательности есть хотя бы два элемента
(кроме завершающего числа 0).
1
7
9
0
4.16333199893
IDE
ZC: Количество локальных максимумов последовательности
Элемент последовательности называется локальным максимумом,
если он строго больше предыдущего и последующего элемента последовательности.
Первый и последний элемент последовательности не являются локальными максимумами.
Дана последовательность натуральных чисел, завершающаяся числом 0. Определите количество строгих
локальных максимумов в этой последовательности.
1
2
1
2
1
0
2
IDE
ZD: Наименьшее расстояние между двумя строгими локальными максимумами
Определите наименьшее расстояние между двумя локальными максимумами
последовательности натуральных чисел, завершающейся числом 0. Если в последовательности
нет двух локальных максимумов, выведите число 0.
Имеется неограниченное количество монет в 1, 2, 5, 10 рублей.
Определите, сколькими способами можно выдать сдачу в n рублей.
Например, 5 рублей можно выдать четырьмя способами:
5=2+2+1=2+1+1+1=1+1+1+1+1.
Программа получает на вход число n, не превышающее 100.