УПРАЖНЕНИЯ
7-1 . Прокат машин: напишите программу, которая спрашивает у пользователя, какую ма-
шину он хотел бы взять напрокат . Выведите сообщение с введенными данными (например,
“Let me see if I can find you a Subaru”) .
7-2 . Заказ стола: напишите программу, которая спрашивает у пользователя, на сколько
мест он хочет забронировать стол в ресторане . Если введенное число больше 8, выведите
сообщение о том, что пользователю придется подождать . В противном случае сообщите,
что стол готов .
7-3 . Числа, кратные 10: запросите у пользователя число и сообщите, кратно оно 10 или нет .
Циклы while
Цикл
for
получает коллекцию элементов и выполняет блок кода по одному разу
для каждого элемента в коллекции. В отличие от него, цикл
while
продолжает вы-
полняться, пока остается истинным некоторое условие.
Цикл while в действии
Цикл
while
может использоваться для перебора числовой последовательности.
Например, следующий цикл считает от 1 до 5:
counting.py
current_number = 1
while current_number <= 5:
print(current_number)
current_number += 1
В первой строке отсчет начинается с 1, для чего
current_number
присваивается
значение 1. Далее запускается цикл
while
, который продолжает работать, пока
значение
current_number
остается меньшим или равным 5. Код в цикле выводит
значение
current_number
и увеличивает его на 1 командой
current_number += 1
.
(Оператор
+=
является сокращенной формой записи для
current_number
=
current_number
+
1
.)
Цикл повторяется, пока условие
current_number
<=
5
остается истинным. Так как
1 меньше 5, Python выводит 1, а затем увеличивает значение на 1, отчего
current_
number
становится равным 2. Так как 2 меньше 5, Python выводит 2 и снова при-
Циклы while 125
бавляет 1 и т. д. Как только значение
current_number
превысит 5, цикл останавли-
вается, а программа завершается:
1
2
3
4
5
Очень многие повседневные программы содержат циклы
while
. Например,
представьте компьютерную игру: цикл
while
выполняется, пока игра про-
должается, и завершается, как только игрок захочет остановить игру. Вряд ли
кого-нибудь обрадует, если программа завершает работу преждевременно или
продолжает работать, когда ей приказали остановиться, так что циклы
while
весьма полезны.
Пользователь решает прервать работу программы
Программа
parrot .py
может выполняться, пока пользователь не захочет остановить
ее, — для этого бульшая часть кода заключается в цикл
while
. В программе опре-
деляется признак завершения, и программа работает, пока пользователь не введет
нужное значение:
parrot.py
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
message = ""
while message != 'quit':
message = input(prompt)
print(message)
В точке определяется сообщение, которое объясняет, что у пользователя есть
два варианта: ввести сообщение или ввести признак завершения (в данном случае
это строка
'quit'
). Затем переменной
message
присваивается значение, введен-
ное пользователем. В программе переменная
message
инициализируется пустой
строкой
""
, чтобы значение проверялось без ошибок при первом выполнении
строки
while
. Когда программа только запускается и выполнение достигает ко-
манды
while
, значение
message
необходимо сравнить с
'quit'
, но пользователь еще
не вводил никакие данные. Если у Python нет данных для сравнения, продолжение
выполнения становится невозможным. Чтобы решить эту проблему, необходимо
предоставить
message
исходное значение. И хотя это всего лишь пустая строка, для
Python такое значение выглядит вполне осмысленно; программа сможет выполнить
сравнение, на котором основана работа цикла
while
. Цикл
while
выполняется,
пока значение
message
не равно
'quit'
.
При первом выполнении цикла
message
содержит пустую строку, и Python входит
в цикл. При выполнении команды
message
=
input(prompt)
Python отображает
подсказку и ожидает, пока пользователь введет данные. Эти данные сохраняются
в
message
и выводятся командой
print
; после этого Python снова проверяет усло-
вие команды
while
. Пока пользователь не введет слово
'quit'
, приглашение будет
126 Глава 7 • Ввод данных и циклы while
выводиться снова и снова, а Python будет ожидать новых данных. При вводе слова
'quit'
Python перестает выполнять цикл
while
, а программа завершается:
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello everyone!
Hello everyone!
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello again.
Hello again.
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
quit
Программа работает неплохо, если не считать того, что она выводит слово
'quit'
,
словно оно является обычным сообщением. Простая проверка
if
решает про-
блему:
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
message = ""
while message != 'quit':
message = input(prompt)
if message != 'quit':
print(message)
Теперь программа проводит проверку перед выводом сообщения и выводит со-
общение только в том случае, если оно не совпадает с признаком завершения:
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello everyone!
Hello everyone!
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello again.
Hello again.
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
Флаги
В предыдущем примере программа выполняла некоторые операции, пока заданное
условие оставалось истинным. А что если вы пишете более сложную программу,
выполнение которой может прерываться по нескольким разным условиям?
Например, компьютерная игра может завершаться по разным причинам: у игро-
ка кончились все «жизни»; прошло отведенное время; все города, которые он
должен был защищать, были уничтожены и т. д. Игра должна завершаться
при выполнении любого из этих условий. Попытки проверять все возможные
условия в одной команде
while
быстро усложняются и становятся слишком
громоздкими.
Циклы while 127
Если программа должна выполняться только при истинности нескольких условий,
определите одну переменную-флаг. Эта переменная сообщает, должна ли програм-
ма выполняться далее. Программу можно написать так, чтобы она продолжала
выполнение, если флаг находится в состоянии
True
, и завершалась, если любое
из нескольких событий перевело флаг в состояние
False
. В результате в команде
while
достаточно проверить всего одно условие: находится ли флаг в состоянии
True
. Все остальные проверки (которые должны определить, произошло ли собы-
тие, переводящее флаг в состояние
False
) удобно организуются в остальном коде.
Добавим флаг в программу
parrot .py
из предыдущего раздела. Этот флаг, который
мы назовем
active
(хотя переменная может называться как угодно), управляет тем,
должно ли продолжаться выполнение программы:
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
active = True
while active:
message = input(prompt)
if message == 'quit':
active = False
else:
print(message)
В точке переменной
active
присваивается
True
, чтобы программа начинала
работу в активном состоянии. Это присваивание упрощает команду
while
, потому
что в самой команде
while
никакие сравнения не выполняются; вся логика реали-
зуется в других частях программы. Пока переменная
active
остается равной
True
,
цикл выполняется.
В команде
if
внутри цикла
while
значение
message
проверяется после того, как
пользователь введет данные. Если пользователь ввел строку
'quit'
, флаг
active
переходит в состояние
False
, а цикл
while
останавливается. Если пользователь ввел
любой текст, кроме
'quit'
, то введенные им данные выводятся как сообщение.
Результаты работы этой программы ничем не отличаются от предыдущего приме-
ра, в котором условная проверка выполняется прямо в команде
while
. Но теперь
в программе имеется флаг, указывающий, находится ли она в активном состоянии,
и вы сможете легко добавить новые проверки (в форме команд
elif
) для событий,
с которыми переменная
active
может перейти в состояние
False
. Это может быть
удобно в сложных программах — например, в компьютерных играх с многочислен-
ными событиями, каждое из которых может привести к завершению программы.
Когда по любому из этих событий флаг
active
переходит в состояние
False
, основ-
ной игровой цикл прервется, выводится сообщение о завершении игры, и у игрока
появляется возможность сыграть еще раз.
Команда break и выход из цикла
Чтобы немедленно прервать цикл
while
без выполнения оставшегося кода в цикле
независимо от состояния условия, используйте команду
break
. Команда
break
128 Глава 7 • Ввод данных и циклы while
управляет ходом выполнения программы; она позволит вам управлять тем, какая
часть кода выполняется, а какая нет.
Рассмотрим пример — программу, которая спрашивает у пользователя, в каких го-
родах он бывал. Чтобы прервать цикл
while
, программа выполняет команду
break
,
как только пользователь введет значение
'quit'
:
Достарыңызбен бөлісу: |