Алла Тамбовцева, НИУ ВШЭ
Иногда возникает необходимость запросить какую-нибудь информацию у пользователя — попросить ввести ее с клавиатуры. Это может быть нужно, например, когда мы пытаемся имитировать заполнение какой-нибудь формы (собрать информацию и обработать) или написать функцию, которая будет работать по-разному в зависимости от режима ("Если хотите выгрузить данные из файла, нажмите 1, если хотите вводить данные вручную, введите 2").
Запросить данные с клавиатуры можно с помощью функции input()
:
input("Введите что-нибудь: ")
Введите что-нибудь: нечто
'нечто'
Однако обычно нам нужно не просто вывести на экран то, что ввел пользователь (он и сам это видит), но и сохранить введенную информацию. Сделаем это (и заодно перейдем к числам).
num = input("Введите какое-нибудь число: ")
Введите какое-нибудь число: 5
Теперь мы можем работать с переменной num, в которую мы сохранили результат ввода с клавиатуры.
num
'5'
Введенное нами число 5 сохранилось. Однако, если посмотреть внимательнее, это не совсем число: число пять стоит в кавычках. Это строка! То есть обычный текст. Проверим:
type(num) # действительно
str
Тут нам как раз и пригодится преобразование типов переменных с первого занятия:
num = int(num)
num
5
И теперь все сразу: правильно и компактно.
num = int(input("Введите какое-нибудь число: "))
num
Введите какое-нибудь число: 7
7
Раз мы не предлагаем пользователю ввести именно целое число, число может быть любым, даже дробным. Учтем это ‒ будем конвертировать введенный текст в число с плавающей точкой.
num = float(input("Введите какое-нибудь число: "))
num
Введите какое-нибудь число: 7.5
7.5
С клавиатуры можно вводить сколько угодно объектов:
numbers = input("Введите числа через пробел: ")
Введите числа через пробел: 2 3
numbers
'2 3'
Только тогда для работы с отдельными элементами ввода потребуется разбить строку на части по какому-нибудь символу (в нашем случае по пробелу). О разбиении текста на части поговорим позже, когда будем обсуждать работу со строками, а пока разберем вывод информации на экран.
Как мы уже знаем, для вывода чего-либо на экран в Python существует функция print()
:
print(5)
print('Hello!')
5 Hello!
Для того, чтобы вывести на экран сразу несколько объектов, нужно просто перечислить их через запятую в круглых скобках.
age = 23
print('Your age is ', age)
Your age is 23
Примечание для тех, кто работал в R: print()
в Python отличается от print()
в R тем, что на вход он легко принимает сразу несколько объектов. В R перечень значений пришлось бы оформлять в виде списка (вектора), в противном случае на экран был бы выведен только первый элемент.
А теперь посмотрим на то, как подставлять значения в уже имеющийся текстовый шаблон, то есть форматировать строки. Чтобы понять, о чем идет речь, можно представить, что у нас есть электронная анкета, которую заполняет пользователь, и мы должны написать программу, которая выводит на экран введенные данные, чтобы пользователь мог их проверить.
Пусть для начала пользователь вводит свое имя и возраст.
name = input("Введите Ваше имя: ")
age = int(input("Введите Ваш возраст: ")) # возраст будет целочисленным
Введите Ваше имя: Алла Введите Ваш возраст: 24
Теперь выведем на экран сообщение вида
Ваше имя: `имя`. Ваш возраст: `возраст`.
Но прежде, чем это сделать, поймем, какого типа будут значения, которые мы будем подставлять в шаблон. Имя (переменная name) ‒ это строка (string), а возраст (переменная age) ‒ это целое число (integer).
result = "Ваше имя: %s. Ваш возраст: %i." % (name, age)
print(result)
Ваше имя: Алла. Ваш возраст: 24.
Что за таинственные %s
и %i
? Все просто: оператор %
в строке указывает место, на которое будет подставляться значение, а буква сразу после процента ‒ сокращенное название типа данных (s
‒ от string и i
‒ от integer). Осталось только сообщить Python, что именно нужно подставлять — после кавычек поставить %
и в скобках перечислить названия переменных, значения которых мы будем подставлять.
Для тех, кто работал в R: форматирование строк с помощью оператора %
‒ аналог форматирования с помощью функции sprintf()
в R.
Конечно, результат можно выводить сразу, не сохраняя полученную строку в переменную. Главное, не запутаться в скобках, и не потерять их.
print("Ваше имя: %s. Ваш возраст: %i." % (name, age))
Ваше имя: Алла. Ваш возраст: 24.
Примечание: не теряйте часть с переменными после самой строки. Иначе получится нечто странное:
print("Ваше имя: %s. Ваш возраст: %i.")
Ваше имя: %s. Ваш возраст: %i.
Важно помнить, что если мы забудем указать какую-то из переменных, мы получим ошибку (точнее, исключение): Python не будет знать, откуда брать нужные значения.
print("Ваше имя: %s. Ваш возраст: %i." % (name))
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-16-2343aa81e176> in <module>() ----> 1 print("Ваше имя: %s. Ваш возраст: %i." % (name)) TypeError: not enough arguments for format string
Кроме того, создавая такие текстовые шаблоны, нужно обращать внимание на типы переменных, значения которых мы подставляем.
print("Ваше имя: %s. Ваш возраст: %s." % (name, age)) # так сработает
Ваше имя: Алла. Ваш возраст: 24.
print("Ваше имя: %i. Ваш возраст: %s." % (name, age)) # а так нет
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-18-9c083ea32449> in <module>() ----> 1 print("Ваше имя: %i. Ваш возраст: %s." % (name, age)) # а так нет TypeError: %i format: a number is required, not str
В первом случае код сработал: Python не очень строго относится к типам данных, и поэтому он легко может превратить целочисленный возраст в строку (два %s
вместо %s
и %i
не является помехой). Во втором случае все иначе. Превратить строку, которая состоит из букв (name) в целое число никак не получится, поэтому Python справедливо ругается.
А что будет, если мы будем подставлять не целое число, а дробное, с плавающей точкой? Попробуем!
height = float(input("Введите Ваш рост (в метрах): "))
height
Введите Ваш рост (в метрах): 1.68
1.68
print("Ваш рост: %f м." % height) # f - от float
Ваш рост: 1.680000 м.
По умолчанию при подстановке значений типа float Python выводит число с шестью знаками после запятой. Но это можно исправить. Перед f
нужно поставить точку и указать число знаков после запятой, которое мы хотим:
print("Ваш рост: %.2f м." % height) # например, два
Ваш рост: 1.68 м.
print("Ваш рост: %.1f м. " % height) # или один
Ваш рост: 1.7 м.
В случае, если указанное число знаков после запятой меньше, чем есть на самом деле (как в ячейке выше), происходит обычное арифметическое округление.
Рассмотренный выше способ форматирования строк ‒ не единственный. Он довольно стандартный, но при этом немного устаревший. В Python 3 есть другой способ ‒ форматирование с помощью метода .format()
. Кроме того, в Python 3.6 появился еще более продвинутый способ форматирования строк ‒ f-strings (formatted string literals). Об этом можно почитать в дополнительных материалах (ноутбук String-formatting-additional.ipynb).