В цикле с условием while
цикл выполняется, пока истинно задающее его условие.
Поэтому этот цикл также иногда называют циклом "пока". Часто цикл while
используется,
когда невозможно заранее предсказать, сколько раз необходимо выполнить тело цикла. В повседневной жизни цикл
while
можно встретить в алгоритмах, вроде "Пока в пределах видимости есть машины, стоять на месте"
или "Пока в ящике есть детали, достать деталь из ящика".
В следующей программе цикл while
используется подобно циклу for
для вывода на экран
всех чисел от 1 до 10:
i=1 while i<=10: print i i=i+1
В этой программе переменной i
присваивается значение 1. Затем начинается цикл (ключевое слово while
)
с проверяемым условием i<=10
. Тело цикла содержит две инструкции: вывод на экран значения переменной i
и увеличение значения переменной i
на 1.
При выполнении этого цикла проверяется условие i<=10
. Поскольку значение i
изначально равно 1, то условие верно
и выполняется тело цикла: на экран выводится значение переменной i
, то есть 1 и переменной i
присваивается значение i+1
, то есть 2. Снова проверяется условие, поскольку оно верно, то выполняется блок цикла:
на экран выводится число 2 и переменной i
присваивается значение 3. Опять проверяется значение цикла, и так далее
до тех пор, пока проверяемое условие истинно.
Как только проверяемое условие станет ложно (это произойдет, когда переменная i
станет равна 11), цикл завершит
работу и управление будет передано следующей инструкции после блока цикла. Поэтому после завершения цикла переменная
i
будет иметь значение 11.
В общем виде синтаксис цикла с условием в языке Питон такой:
while условие: инструкция 1 инструкция 2 ... инструкция n
В каждой инструкции while
должны присутствовать:
while
и может быть произвольным арифметическим выражением, в котором должен быть
хотя бы один из операторов ==
, !=
, <
, >
, <=
, >=
и могут
использоваться логические операторы and
, or
, not
.
После условия ставится двоеточие.
i=i+1
. Если бы этой инструкции
не было, то значение переменной i
не менялось бы и проверяемое условие
всегда было бы истинным, что привело бы к бесконечному циклу.
Для прерывания работы программы, попавшей в бесконечный цикл, используется
комбинация клавиш Ctrl+C.
Цикл while
в Питоне всегда можно использовать вместо цикла for
.
Однако иногда цикл for
удобней, а иногда удобней цикл while
,
как в следующем примере, где вычисляется наименьшая степень двойки, которая превосходит данное число n
:
n=input("Введите натуральное число") i=0 while 2**i<=n: i=i+1 print "2 в степени",i,"превосходит данное число"
В этом примере переменная i
внутри цикла увеличивается на 1,
пока значение 2**i
не превосходит n
. После окончания цикла
величина 2**i
будет больше n
, и соответствующее значение i
будет напечатано на экране.
Внутри цикла могут быть различные другие инструкции, в том числе инструкции
if
, while
и for
. В этом случае говорят о вложенных циклах,
или об условной инструкции, вложенной в цикл.
Тело вложенного цикла выделяется от цикла, в который оно вложено, большей величиной отступа.
Рассмотрим два примера. В первом примере программа печатает на экран все натуральные делители
данного натурального числа n
. Для этого используется цикл, в котором переменная i
меняется от 1 до n
, а внутри цикла проверяется условие, и если остаток от деления n
на i
равен 0, то печатается значение i
:
n=input("Введите число, для которого необходимо вывести делители") i=1 while i<=n: if n%i==0: print i i=i+1
В следующем примере на экран печатается таблица умножения всех однозначных чисел.
Для этого организовано два цикла: в одном переменная i
меняется от 1 до 9,
внутри этого цикла (то есть при каждом новом значении i
) переменная j
также меняется от 1 до 9. В блоке вложенного цикла на экран печатаются
значения переменных i
, j
и их произведение:
i=1 while i<10: # Условие внешнего цикла по i j=1 while j<10: # Условие внутреннего цикла по j print i, "*", j, "=", i*j j=j+1 # Инструкция-итератор вложенного цикла i=i+1 # Инструкция-итератор внешнего цикла
С использованием циклов for
этот пример можно записать короче:
for i in range(1,10): for j in range(1,10): print i, "*", j, "=", i*j
n
выведите на экран n
символов *
.
Для печати на экране одной звездочки используйте инструкцию
print "*",
(запятая после инструкции print
указывает не осуществлять
переход на новую строку).
n
напечатайте "лесенку" из n
ступенек (см. пример).
n
напечатайте границу квадрата со стороной n
(см. пример).
* * * * * * * * * * * * * * * * * * * * * *
n
напечатайте его представление в двоичном виде. Представление можно
печатать в обратном порядке (то есть для числа 6 достаточно вывести 0 1 1
).
n
определите количество цифр в его десятичной записи.
Определите сумму цифр числа n
. Определите количество нулей в десятичной записи числа n
(указание: используйте инструкцию if
в теле цикла).
В циклах while
и for
можно использовать две инструкции, управляющие циклом.
Инструкция break
прерывает выполнение цикла. Управление передается на следующую инструкцию
после тела цикла.
Инструкция continue
прерывает текущую итерацию цикла. Все инструкции
после инструкции continue
до конца блока цикла пропускаются. В цикле for
переменной, которая меняется в цикле, присваивается следующее значение из списка и
цикл продолжает выполняться с новым значением переменной. В цикле while
проверяется условие, заданное в цикле и если оно истинно, то цикл продолжает выполняться
с начала блока цикла.
Например, допустим, что нам необходимо перебрать в цикле все натуральные числа, меньшие n
и не делящиеся на 3. Для этого можно перебрать все числа, проверить их остаток от деления на 3,
и если число делится на 3, выполнить инструкцию continue
, которая пропустит оставшиеся до конца
цикла инструкции и перейдет к следующему числу:
for in range(n): if i%3==0: continue print i # а далее выполняем прочие необходимые действия
Инструкции break
и continue
следует использовать только внутри условных инструкций.
Безусловные инструкции break
и continue
, как правило, бессмысленны.
Также в циклах while
и for
можно указать else
-блок после основного блока
цикла. else
-блок в циклах выполняется один раз после завершения работы цикла, но только
в случае, если цикл не был прерван инструкцией break
. Поясним это на программе, которая
по введенному целому числу n>1 определяет, является ли оно простым или составным.
n=input("Введите целое число, больше 1 ") # 1 Считали число n for d in range(2, n): # 2 d меняется от 2 до n-1 if n % d == 0: # 3 Проверка: n делится на d? print n, "имеет делитель", d # 4 break # 5 Завершаем цикл for else: # 6 Это else-блок цикла print n, "простое число" # 7
Поясним эту программу. После ввода с клавиатуры числа n в программе организовывается цикл
по переменной d
, принимающей значения от 2
до n-1
(строка 2).
Далее в теле цикла проверяется, является ли d
делителем n
(строка 3). Если
является делителем, то на экран выводится соответствующее сообщение (строка 4) и при помощи
инструкции break
завершается выполнение цикла (строка 5). После тела цикла for
идет else
-блок.
То, что инструкция else
(строка 6) относится к циклу for
(строка 2), а не к инструкции if
(строка 3), определяется
по величине отступа перед инструкцией else
: отступ перед ней такой же, как и перед инструкцией
for
. Поэтому если цикл не был прерван инструкцией break
, то есть для числа n
не будет найден нетривиальный делитель, то будет выполнен else
-блок, то есть на экран будет
напечатано сообщение о том, что n — простое число (строка 7).
(Московская олимпиада школьников по программированию, 1980 г.)