Изучаем Python — страница 17 из 61


В этой главе вы научились определять словари и работать с хранящейся в них информацией. Вы узнали, как обращаться к отдельным элементам словаря и изменять их, как перебрать всю информацию в словаре. Вы научились перебирать пары «ключ—значение», ключи и значения словаря. Также были рассмотрены возможности вложения словарей в список, вложения списков в словари и вложения словарей в другие словари.

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

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


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

В этой главе вы узнаете, как получить пользовательский ввод (то есть входные данные), чтобы программа могла работать с ним. Например, таким вводом может быть отдельное имя или список имен. Для получения данных в программах используется функция 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!

примечание

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

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


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

greeter.py

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

print("Hello, " + name + "!")

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

Please enter your name: Eric

Hello, Eric!

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

greeter.py

prompt = "If you tell us who you are, we can personalize the messages you see."

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


name = input(prompt)

print("\nHello, " + name + "!")

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

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

If you tell us who you are, 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

(1) >>>age >= 18

Traceback (most recent call last):

File "", line 1, in

(2)TypeError: unorderable types: str() >= int()

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

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

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

How old are you? 21

(1) >>>age = int(age)

>>>age >= 18

True

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

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

rollercoaster.py

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

height = int(height)

if height >= 36:

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

else:

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

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

How tall are you, in inches? 71

You're tall enough to ride!

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

Оператор вычисления остатка


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

>>>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("\nThe number " + str(number) + " is even.")

else:

. .print("\nThe number " + str(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.

Ввод данных в Python 2.7


Если вы работаете с Python 2.7, для запроса данных у пользователя следует использовать функцию raw_input(). Эта функция интерпретирует весь ввод как строку — точно так же, как функция input() в Python 3.

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

Упражнения

7-1. Прокат машин: напишите программу, которая спрашивает у пользователя, какую машину он хотел бы взять напрокат. Выведите сообщение с введенными данными (например, “Let me see if I can find you a Subaru”).

7-2. Заказ стола: напишите программу, которая спрашивает у пользователя, на сколько мест он хочет забронировать стол в ресторане. Если введенное число больше 8, выведите сообщение о том, что пользователю придется подождать. В противном случае сообщите, что стол готов.

7-3. Числа, кратные 10: запросите у пользователя число и сообщите, кратно оно 10 или нет.

Циклы while