Программа работает неплохо, если не считать того, что она выводит слово '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

<p>Флаги</p>

В предыдущем примере программа выполняла некоторые операции, пока заданное условие оставалось истинным. А что если вы пишете более сложную программу, выполнение которой может прерываться по нескольким разным условиям?

Например, компьютерная игра может завершаться по разным причинам: у игрока кончились все «жизни»; прошло отведенное время; все города, которые он должен был защищать, были уничтожены и т.д. Игра должна завершаться при выполнении любого из этих условий. Попытки проверять все возможные условия в одной команде while быстро усложняются и становятся слишком громоздкими.

Если программа должна выполняться только при истинности нескольких условий, определите одну переменную-флаг. Эта переменная сообщает, должна ли программа выполняться далее. Программу можно написать так, чтобы она продолжала выполнение, если флаг находится в состоянии 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. "

(1) active = True

(2)while active:

. .message = input(prompt)

. .

(3) . .if message == 'quit':

. . . .active = False

(4) . .else:

. . . .print(message)

В точке (1) переменной active присваивается True, чтобы программа начинала работу в активном состоянии. Это присваивание упрощает команду while, потому что в самой команде while никакие сравнения не выполняются; вся логика реализуется в других частях программы. Пока переменная active остается равной True, цикл выполняется.

В команде if внутри цикла while значение message проверяется после того, как пользователь введет данные. Если пользователь ввел строку 'quit' (3), флаг active переходит в состояние False, а цикл while останавливается. Если пользователь ввел любой текст, кроме 'quit' (4), то введенные им данные выводятся как сообщение.

Результаты работы этой программы ничем не отличаются от предыдущего примера, в котором условная проверка выполняется прямо в команде while. Но теперь в программе имеется флаг, указывающий, находится ли она в активном состоянии, и вы сможете легко добавить новые проверки (в форме команд elif) для событий, с которыми переменная active может перейти в состояние False. Это может быть удобно в сложных программах — например, в компьютерных играх с многочисленными событиями, каждое из которых может привести к завершению программы. Когда по любому из этих событий флаг active переходит в состояние False, основной игровой цикл прервется, выводится сообщение о завершении игры, и у игрока появляется возможность сыграть еще раз.

<p>Команда break и выход из цикла</p>

Чтобы немедленно прервать цикл while без выполнения оставшегося кода в цикле независимо от состояния условия, используйте команду break. Команда break управляет ходом выполнения программы; она позволит вам управлять тем, какая часть кода выполняется, а какая нет.

Рассмотрим пример — программу, которая спрашивает у пользователя, в каких городах он бывал. Чтобы прервать цикл while, программа выполняет команду break, как только пользователь введет значение 'quit':

cities.py

prompt = "\nPlease enter the name of a city you have visited:"

prompt += "\n(Enter 'quit' when you are finished.) "

(1) while True:

. .city = input(prompt)

. .

. .if city == 'quit':

. . . .break

. .else:

. . . .print("I'd love to go to " + city.title() + "!")

Перейти на страницу:

Все книги серии Библиотека программиста

Похожие книги