ПРИМЕЧАНИЕ
В некоторых редакторах — например, в Sublime Text — используется встроенное окно вывода . Оно
может усложнить прерывание бесконечных циклов; возможно, для выхода из цикла придется за-
крыть редактор .
УПРАЖНЕНИЯ
7-4 . Дополнения для пиццы: напишите цикл, который предлагает пользователю вводить
дополнения для пиццы до тех пор, пока не будет введено значение 'quit’ . При вводе каждо-
го дополнения выведите сообщение о том, что это дополнение включено в заказ .
7-5 . Билеты в кино: кинотеатр установил несколько вариантов цены на билеты в зависимо-
сти от возраста посетителя . Для посетителей младше 3 лет билет бесплатный; в возрасте
от 3 до 12 билет стоит $10; наконец, если возраст посетителя больше 12, билет стоит $15 .
Напишите цикл, который предлагает пользователю ввести возраст и выводит цену билета .
7-6 . Три выхода: напишите альтернативную версию упражнения 7-4 или упражнения 7-5,
в которой каждый пункт следующего списка встречается хотя бы один раз .
• Завершение цикла по проверке условия в команде while .
• Управление продолжительностью выполнения цикла в зависимости от переменной
active .
• Выход из цикла по команде break, если пользователь вводит значение ‘quit’ .
7-7 . Бесконечный цикл: напишите цикл, который никогда не завершается, и выполните его .
(Чтобы выйти из цикла, нажмите Ctrl+C или закройте окно с выводом .)
Использование цикла while со списками и словарями
До настоящего момента мы работали только с одним фрагментом информации,
полученной от пользователя. Мы получали ввод пользователя, а затем выводили
ответ на него. При следующем проходе цикла
while
программа получала новое
входное значение и реагировала на него. Но, чтобы работать с несколькими
фрагментами информации, необходимо использовать в циклах
while
списки
и словари.
Цикл
for
хорошо подходит для перебора списков, но, скорее всего, список не дол-
жен изменяться в цикле, потому что у Python возникнут проблемы с отслежива-
нием элементов. Чтобы изменять список в процессе обработки, используйте цикл
while
. Использование циклов
while
со списками и словарями позволяет собирать,
хранить и упорядочивать большие объемы данных для последующего анализа
и обработки.
Возьмем список недавно зарегистрированных, но еще не проверенных пользова-
телей сайта. Как переместить пользователей после проверки в отдельный список
Использование цикла while со списками и словарями 131
проверенных пользователей? Одно из возможных решений: используем цикл
while
для извлечения пользователей из списка непроверенных, проверяем их и включаем
в отдельный список проверенных пользователей. Код может выглядеть так:
confirmed_users.py
# Начинаем с двух списков: пользователей для проверки
# и пустого списка для хранения проверенных пользователей.
unconfirmed_users = ['alice', 'brian', 'candace']
confirmed_users = []
# Проверяем каждого пользователя, пока остаются непроверенные
# пользователи. Каждый пользователь, прошедший проверку,
# перемещается в список проверенных.
while unconfirmed_users:
current_user = unconfirmed_users.pop()
print("Verifying user: " + current_user.title())
confirmed_users.append(current_user)
# Вывод всех проверенных пользователей.
print("\nThe following users have been confirmed:")
for confirmed_user in confirmed_users:
print(confirmed_user.title())
Работа программы начинается с двух списков: непроверенных пользователей
и пустого списка для проверенных пользователей. Цикл
while
в точке выпол-
няется, пока в списке
unconfirmed_users
остаются элементы. Внутри этого списка
функция
pop()
в точке извлекает очередного непроверенного пользователя
с конца списка
unconfirmed_users
. В данном примере список
unconfirmed_users
завершается пользователем
Candace
; это имя первым извлекается из списка, со-
храняется в
current_user
и добавляется в список
confirmed_users
в точке . Далее
следуют пользователи
Brian
и
Alice
.
Программа моделирует проверку каждого пользователя выводом сообщения, после
чего переносит пользователя в список проверенных. По мере сокращения списка
непроверенных пользователей список проверенных пользователей растет. Когда
в списке непроверенных пользователей не остается ни одного элемента, цикл оста-
навливается, и выводится список проверенных пользователей:
Verifying user: Candace
Verifying user: Brian
Verifying user: Alice
The following users have been confirmed:
Candace
Brian
Alice
Удаление всех вхождений конкретного значения из списка
В главе 3 функция
remove()
использовалась для удаления конкретного значения
из списка. Функция
remove()
работала, потому что интересующее нас значение
132 Глава 7 • Ввод данных и циклы while
встречалось в списке только один раз. Но что если вы захотите удалить все вхож-
дения значения из списка?
Допустим, имеется список
pets
, в котором значение
'cat'
встречается многократно.
Чтобы удалить все экземпляры этого значения, можно выполнять цикл
while
до
тех пор, пока в списке не останется ни одного экземпляра
'cat'
:
pets.py
pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets)
while 'cat' in pets:
pets.remove('cat')
print(pets)
Программа начинает со списка, содержащего множественные экземпляры
'cat'
.
После вывода списка Python входит в цикл
while
, потому что значение
'cat'
при-
сутствует в списке хотя бы в одном экземпляре. После входа цикл Python удаляет
первое вхождение
'cat'
, возвращается к строке
while
, а затем обнаруживает, что
экземпляры
'cat'
все еще присутствуют в списке, и проходит цикл заново. Вхож-
дения
'cat'
удаляются до тех пор, пока не окажется, что в списке значений
'cat'
не осталось; в этот момент Python завершает цикл и выводит список заново:
['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
['dog', 'dog', 'goldfish', 'rabbit']
Заполнение словаря данными, введенными пользователем
При каждом проходе цикла
while
ваша программа может запрашивать любое
необходимое количество данных. Напишем программу, которая при каждом про-
ходе цикла запрашивает имя участника и его ответ. Собранные данные будут со-
храняться в словаре, потому что каждый ответ должен быть связан с конкретным
пользователем:
Достарыңызбен бөлісу: |