Книга: Изучаем Python: программирование игр, визуализация данных, веб-приложения. 3-е изд. дополненное и переработанное
Назад: 6. Словари
Дальше: 8. Функции

7. Ввод данных и циклы while

18744.png

 

Программы обычно пишутся для решения задач конечного пользователя. Для этого им нужна какая-то информация, которую должен ввести пользователь. Простой пример: допустим, пользователь хочет узнать, достаточен ли его возраст для голосования. Если вы пишете программу для ответа на этот вопрос, то вам нужно будет узнать возраст пользователя. Программа должна запросить у пользователя значение — его возраст; когда у нее появятся данные, она может сравнить их с возрастом, дающим право на голосование, и сообщить результат.

В этой главе вы узнаете, как получить пользовательский ввод (то есть входные данные), чтобы программа могла работать с ним. Если она хочет получить отдельное имя, то запрашивает только его; если ей нужен список имен — выводит соответствующее сообщение. Для получения данных в программах используется функция input().

Вы также научитесь продолжать работу программы, пока пользователь вводит новые данные; после получения всех данных программа переходит к работе с полученной информацией. Цикл while в языке Python позволяет выполнять программу, пока некое условие остается истинным.

Научившись работать с пользовательским вводом и управлять продолжительностью выполнения программы, вы сможете создавать полностью интерактивные программы.

Как работает функция input()

Функция input() приостанавливает выполнение программы и ожидает, пока пользователь введет некий текст. Получив ввод, Python сохраняет его в переменной, чтобы вам было удобнее работать с ним.

Например, следующая программа предлагает пользователю ввести текст, а затем выводит для него сообщение:

parrot.py

message = input("Tell me something, and I will repeat it back to you: ")

print(message)

Функция input() получает один аргумент: текст подсказки (или инструкции), который выводится на экран, чтобы пользователь понимал, что от него требуется. В данном примере при выполнении первой строки пользователь видит подсказку с предложением ввести любой текст. Программа ожидает, пока пользователь введет ответ, и продолжает работу после того, как он нажмет Enter. Ответ сохраняется в переменной message, после чего функция print(message) дублирует введенные данные:

Tell me something, and I will repeat it back to you: Hello everyone!

Hello everyone!

ПРИМЕЧАНИЕ

VS Code и многие другие редакторы кода не запускают программы, запрашивающие входные данные у пользователя. Вы можете использовать такие редакторы для создания подобных программ, но запускать их придется из терминального окна. См. раздел «Запуск программ Python из терминала» в главе 1.

Содержательные подсказки

Каждый раз, когда в вашей программе используется функция input(), вы должны давать четкую, понятную подсказку, которая точно сообщит пользователю, какую информацию вы хотите получить от него. Подойдет любое предложение, которое объяснит пользователю, что нужно вводить. Пример:

greeter.py

name = input("Please enter your name: ")

print(f"\nHello, {name}!")

Добавьте пробел в конце подсказки (после двоеточия в предыдущем примере), чтобы отделить подсказку от данных, вводимых пользователем, и четко показать, где должен вводиться текст. Пример:

Please enter your name: Eric

Hello, Eric!

Иногда подсказка занимает несколько строк. Например, вы можете сообщить пользователю, для чего программа запрашивает данные. Текст подсказки можно сохранить в переменной и передать ее функции input(): вы создаете длинную подсказку из нескольких строк, а потом выполняете один компактный оператор input().

greeter.py

prompt = "If you share your name, we can personalize the messages you see."

prompt += "\nWhat is your first name? "

 

name = input(prompt)

print(f"\nHello, {name}!")

В этом примере продемонстрирован один из способов создания длинных строк. Первая часть длинного сообщения сохраняется в переменной prompt. Затем оператор += объединяет хранящийся в ней текст с новым фрагментом.

Теперь содержимое prompt занимает две строки (вопросительный знак снова отделяется от ввода пробелом для наглядности):

If you share your name, we can personalize the messages you see.

What is your first name? Eric

 

Hello, Eric!

Использование функции int() для получения числового ввода

При использовании функции input() Python воспринимает все данные, введенные пользователем, как строку. В следующем сеансе интерпретатора программа запрашивает у пользователя возраст:

>>> age = input("How old are you? ")

How old are you? 21

>>> age

'21'

Пользователь вводит число 21, но когда мы запрашиваем у Python значение age, выводится '21' — представление введенного числа в строковом формате. Кавычки, в которые заключены данные, указывают на то, что Python воспринимает ввод как строку. Но попытка использовать данные как число приведет к ошибке:

>>> age = input("How old are you? ")

How old are you? 21

❶ >>> age >= 18

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

❷ TypeError: '>=' not supported between instances of 'str' and 'int'

Когда вы пытаетесь сравнить введенные данные с числом , Python выдает ошибку, поскольку не может сравнить строку с числом: строка '21', хранящаяся в age, не сравнивается с числовым значением 18; происходит ошибка .

Проблему можно решить с помощью функции int(), которая преобразует входную строку в числовое значение. Это позволяет успешно провести сравнение:

>>> age = input("How old are you? ")

How old are you? 21

❶ >>> age = int(age)

>>> age >= 18

True

В этом примере введенный текст 21 интерпретируется как строка, но затем преобразуется в числовое представление путем вызова функции int() . Теперь Python может проверить условие: сравнить переменную age (которая теперь содержит числовое значение 21) с 18. Условие «значение age больше или равно 18» выполняется, и результат проверки равен True.

Как использовать функцию int() в реальной программе? Допустим, программа проверяет рост пользователя и определяет, достаточен ли он для катания на аттракционе:

rollercoaster.py

height = input("How tall are you, in inches? ")

height = int(height)

 

if height >= 48:

    print("\nYou're tall enough to ride!")

else:

    print("\nYou'll be able to ride when you're a little older.")

Программа может сравнить height с 48, поскольку строка height = int(height) преобразует входное значение в число перед проведением сравнения. Если введенное число больше или равно 48, то программа сообщает пользователю, что он прошел проверку:

How tall are you, in inches? 71

 

You're tall enough to ride!

Если пользователь вводит числовые данные, которые используются в вашей программе для вычислений и сравнений, то обязательно преобразуйте введенное значение в его числовой эквивалент.

Оператор деления по модулю

При работе с числовыми данными может пригодиться оператор деления по модулю (modulo operator) (%), который делит одно число на другое и возвращает остаток:

>>> 4 % 3

1

>>> 5 % 3

2

>>> 6 % 3

0

>>> 7 % 3

1

Оператор % не сообщает частное от целочисленного деления; он возвращает только остаток.

Когда одно число нацело делится на другое, остаток равен 0, и оператор % возвращает 0. Например, этот факт может использоваться для проверки четности или нечетности числа:

even_or_odd.py

number = input("Enter a number, and I'll tell you if it's even or odd: ")

number = int(number)

 

if number % 2 == 0:

    print(f"\nThe number {number} is even.")

else:

    print(f"\nThe number {number} is odd.")

Четные числа всегда делятся на 2. Следовательно, если остаток от деления на 2 равен 0 (в данном случае number % 2 == 0), число четное, а если нет — нечетное.

Enter a number, and I'll tell you if it's even or odd: 42

 

The number 42 is even.

Упражнения

7.1. Каршеринг. Напишите программу, которая спрашивает у пользователя, какую машину он хотел бы взять напрокат. Выведите сообщение с введенными данными (например, «Посмотрим, смогу ли я найти вам 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 и снова прибавляет 1 и т.д. Как только значение current_number превысит 5, цикл останавливается, а программа завершается:

1

2

3

4

5

Очень многие повседневные программы содержат циклы while. Например, представьте компьютерную игру: цикл while выполняется, пока игра продолжается, и завершается, как только игрок захочет остановить игру. Вряд ли кого-нибудь обрадует, если программа завершит работу преждевременно или продолжит работать, когда ей приказали остановиться, так что циклы while весьма полезны.

Пользователь решает прервать работу программы

Программа parrot.py может выполняться, пока пользователь не захочет остановить ее, — для этого бо́льшая часть кода заключается в цикл while. В программе определяется признак завершения (quit value), и она работает, пока пользователь не введет нужное значение:

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 присваивается значение, введенное пользователем. В программе данная переменная инициализируется пустой строкой "", чтобы значение проверялось без ошибок при первом выполнении строки while. Когда программа запускается впервые и выполнение достигает оператора while, значение message необходимо сравнить с 'quit', но пользователь еще не вводил никакие данные. Если у Python нет данных для сравнения, то продолжать выполнение невозможно. Чтобы решить эту проблему, необходимо предоставить message исходное значение. И хотя это всего лишь пустая строка, для Python такое значение выглядит вполне осмысленно; программа сможет выполнить сравнение, на котором основана работа цикла while. Он выполняется, пока значение message не равно 'quit'.

При первом выполнении цикла переменная message содержит пустую строку, и Python входит в цикл. При выполнении команды message = input(prompt) Python отображает подсказку и ожидает введения пользователем данных. Они сохраняются в переменной message и выводятся функцией print(); после этого Python снова проверяет условие оператора while. Пока пользователь не введет слово 'quit', подсказка будет выводиться снова и снова, а 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 быстро усложняются и становятся слишком громоздкими.

Если программа должна выполняться только при истинности нескольких условий, то определите одну переменную — флаг (flag). Она сообщает, должна ли программа выполняться далее. Программу можно написать так, чтобы она продолжала выполнение, если флаг находится в состоянии 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, поскольку в нем самом никакие сравнения не выполняются; вся логика реализуется в других частях программы. Пока переменная active остается равной True, цикл выполняется .

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

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

Оператор break и выход из цикла

Чтобы немедленно прервать цикл while без выполнения оставшегося в цикле кода независимо от состояния условия, используйте оператор 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.) "

 

❶ while True:

    city = input(prompt)

 

    if city == 'quit':

        break

    else:

        print(f"I'd love to go to {city.title()}!")

Цикл, который начинается с while True , будет выполняться бесконечно — если только в нем не будет выполнен оператор break. Цикл в программе продолжает запрашивать у пользователя названия городов, пока тот не введет строку 'quit'. При ее вводе выполняется оператор break, заставляющий Python выйти из цикла:

Please enter the name of a city you have visited:

(Enter 'quit' when you are finished.) New York

I'd love to go to New York!

 

Please enter the name of a city you have visited:

(Enter 'quit' when you are finished.) San Francisco

I'd love to go to San Francisco!

 

Please enter the name of a city you have visited:

(Enter 'quit' when you are finished.) quit

ПРИМЕЧАНИЕ

Оператор break может использоваться в любых циклах Python. Например, его можно добавить в цикл for для перебора элементов словаря.

Оператор continue и продолжение цикла

Вместо того чтобы полностью выходить из цикла, не выполняя оставшуюся часть кода, вы можете воспользоваться оператором continue, который позволяет вернуться к началу цикла и проверить условия. Например, возьмем цикл, который считает от 1 до 10, но выводит только нечетные числа в этом диапазоне:

counting.py

current_number = 0

while current_number < 10:

❶     current_number += 1

    if current_number % 2 == 0:

        continue

 

    print(current_number)

Сначала переменной current_number присваивается 0. Значение меньше 10, поэтому Python входит в цикл while. При этом счетчик увеличивается на 1 , так что current_number принимает значение 1. Затем оператор if проверяет остаток от деления current_number на 2. Если остаток равен 0 (то есть current_number делится на 2), то оператор continue дает Python указание проигнорировать оставшийся код цикла и вернуться к началу. Если счетчик не делится на 2, то оставшаяся часть цикла выполняется, и Python выводит текущее значение счетчика:

1

3

5

7

9

Предотвращение зацикливания

У каждого цикла while должна быть предусмотрена возможность завершения, чтобы он не выполнялся бесконечно. Например, следующий цикл считает от 1 до 5:

counting.py

x = 1

while x <= 5:

    print(x)

    x += 1

Но если случайно пропустить строку x += 1 (см. далее), то цикл будет выполняться бесконечно:

# Бесконечный цикл!

x = 1

while x <= 5:

    print(x)

Теперь переменной x присваивается начальное значение 1, но оно никогда не изменяется в программе. В итоге проверка условия x <= 5 всегда дает результат True, и цикл while выводит бесконечную серию единиц:

1

1

1

1

--пропуск--

Любой программист время от времени пишет бесконечный цикл, особенно если в программе используются неочевидные условия завершения. Если ваша программа зациклилась, то нажмите Ctrl+C или просто закройте терминальное окно с выводом программы.

Чтобы избежать зацикливания, тщательно проверьте каждый цикл while и убедитесь в том, что он прерывается именно тогда, когда это предполагается. Если программа должна завершаться при вводе некоего значения, то запустите программу и введите его. Если программа не завершилась, то проанализируйте обработку значения, которое должно приводить к выходу из цикла. Убедитесь, что хотя бы одна часть программы может сделать условие цикла ложным или привести к выполнению оператора break.

ПРИМЕЧАНИЕ

VS Code, как и многие редакторы, отображает выходные данные во встроенном терминальном окне. Чтобы отменить бесконечный цикл, обязательно щелкните в области вывода редактора, прежде чем нажимать CTRL+C.

Упражнения

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 для извлечения пользователей из списка непроверенных, проверяем их и добавляем в отдельный список проверенных пользователей. Код может выглядеть так:

confirmed_users.py

# Начинаем с двух списков: пользователей, которых нужно проверить,

# и пустого списка для хранения проверенных пользователей.

❶ unconfirmed_users = ['alice', 'brian', 'candace']

confirmed_users = []

 

# Проверяем каждого пользователя, пока остаются непроверенные пользователи. Каждый

# пользователь, прошедший проверку, перемещается в список проверенных.

❷ while unconfirmed_users:

❸     current_user = unconfirmed_users.pop()

 

    print(f"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())

Работа программы начинается с двух списков: непроверенных пользователей (Alice, Brian и Candace) и пустого списка для проверенных пользователей. Цикл 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() использовалась для удаления конкретного значения из списка. Она работала, поскольку интересующее нас значение встречалось в списке только раз. Но что, если вы захотите удалить все вхождения значения из списка?

Допустим, имеется список 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 ваша программа может запрашивать любое необходимое количество данных. Напишем программу, которая при каждом проходе цикла запрашивает имя участника и его ответ. Собранные данные будут сохраняться в словаре, поскольку каждый ответ должен быть связан с конкретным пользователем:

mountain_poll.py

responses = {}

# Установка флага продолжения опроса.

polling_active = True

 

while polling_active:

    # Запрос имени и ответа пользователя.

❶     name = input("\nWhat is your name? ")

    response = input("Which mountain would you like to climb someday? ")

 

    # Ответ сохраняется в словаре.

❷     responses[name] = response

 

    # Проверка продолжения опроса.

❸     repeat = input("Would you like to let another person respond? (yes/ no) ")

    if repeat == 'no':

        polling_active = False

 

# Опрос завершен, вывести результаты.

print("\n--- Poll Results ---")

❹ for name, response in responses.items():

    print(f"{name} would like to climb {response}.")

Сначала программа определяет пустой словарь (responses) и устанавливает флаг (polling_active), показывающий, что опрос продолжается. Пока polling_active содержит True, Python будет выполнять код в цикле while.

В цикле пользователю предлагается ввести имя и название горы, на которую ему хо­телось бы подняться . Эта информация сохраняется в словаре responses , после чего программа спрашивает у пользователя, нужно ли продолжать опрос . Если пользователь отвечает положительно, то программа снова входит в цикл while. Если же ответ отрицателен, флаг polling_active переходит в состояние False, цикл while перестает выполняться, и завершающий блок кода выводит результаты опроса.

Если вы запустите эту программу и введете пару ответов, то результат будет выглядеть примерно так:

What is your name? Eric

Which mountain would you like to climb someday? Denali

Would you like to let another person respond? (yes/ no) yes

 

What is your name? Lynn

Which mountain would you like to climb someday? Devil's Thumb

Would you like to let another person respond? (yes/ no) no

 

--- Poll Results ---

Lynn would like to climb Devil's Thumb.

Eric would like to climb Denali.

Упражнения

7.8. Бутерброды. Создайте список sandwich_orders, заполните его названиями различных видов бутербродов. Создайте пустой список finished_sandwiches. В цикле переберите элементы первого списка и выведите сообщение для каждого элемента (например, «Я приготовил бутерброд с тунцом»). После этого каждый бутерброд из первого списка перемещается в список finished_sandwiches. После того как все элементы первого списка будут обработаны, выведите сообщение, в котором перечисляются все изготовленные бутерброды.

7.9. Без пастромы. Используя список sandwich_orders из упражнения 7.8, проследите за тем, чтобы значение 'pastrami' встречалось в списке как минимум три раза. Добавьте в начало программы код для вывода сообщения о том, что пастромы больше нет, и напишите цикл while, удаляющий все вхождения 'pastrami' из sandwich_orders. Убедитесь в том, что в finished_sandwiches значение 'pastrami' не встречается ни одного раза.

7.10. Отпуск мечты. Напишите программу, которая опрашивает пользователей, где бы они хотели провести отпуск. Добавьте подсказку вида «Если бы вы могли посетить одно место в мире, то куда бы отправились?» Добавьте блок кода, который выводит результаты опроса.

Резюме

В этой главе вы научились использовать input() для того, чтобы пользователи могли вводить собственную информацию в ваших программах. Вы узнали, как работать с числовыми и текстовыми данными, а также научились управлять продолжительностью выполнения своих программ с помощью циклов while. Кроме того, вы изучили несколько способов управления циклами while: установку флага, операторы break и continue. Вы узнали, как использовать цикл while для перемещения элементов из одного списка в другой и как удалить все вхождения некоего значения из списка. Вдобавок вы изучили возможности применения циклов while со словарями.

Глава 8 посвящена функциям. Они позволяют разделить программу на меньшие части, каждая из которых решает одну конкретную задачу. Функции можно хранить в отдельных файлах и вызывать их столько раз, сколько потребуется. Благодаря функциям вы сможете писать более эффективный, более простой в отладке и сопровождении код, который к тому же можно повторно использовать в разных программах.

Назад: 6. Словари
Дальше: 8. Функции