#!/usr/bin/env python # coding: utf-8 # # Основы программирования в Python # *Алла Тамбовцева, НИУ ВШЭ* # ### Ввод информации с клавиатуры # Иногда возникает необходимость запросить какую-нибудь информацию у пользователя — попросить ввести ее с клавиатуры. Это может быть нужно, например, когда мы пытаемся имитировать заполнение какой-нибудь формы (собрать информацию и обработать) или написать функцию, которая будет работать по-разному в зависимости от режима ("Если хотите выгрузить данные из файла, нажмите 1, если хотите вводить данные вручную, введите 2"). # # Запросить данные с клавиатуры можно с помощью функции `input()`: # In[1]: input("Введите что-нибудь: ") # Однако обычно нам нужно не просто вывести на экран то, что ввел пользователь (он и сам это видит), но и сохранить введенную информацию. Сделаем это (и заодно перейдем к числам). # In[2]: num = input("Введите какое-нибудь число: ") # Теперь мы можем работать с переменной *num*, в которую мы сохранили результат ввода с клавиатуры. # In[3]: num # Введенное нами число 5 сохранилось. Однако, если посмотреть внимательнее, это не совсем число: число пять стоит в кавычках. Это строка! То есть обычный текст. Проверим: # In[4]: type(num) # действительно # Тут нам как раз и пригодится преобразование типов переменных с первого занятия: # In[5]: num = int(num) num # И теперь все сразу: правильно и компактно. # In[6]: num = int(input("Введите какое-нибудь число: ")) num # Раз мы не предлагаем пользователю ввести именно целое число, число может быть любым, даже дробным. Учтем это ‒ будем конвертировать введенный текст в число с плавающей точкой. # In[7]: num = float(input("Введите какое-нибудь число: ")) num # С клавиатуры можно вводить сколько угодно объектов: # In[8]: numbers = input("Введите числа через пробел: ") # In[9]: numbers # Только тогда для работы с отдельными элементами ввода потребуется разбить строку на части по какому-нибудь символу (в нашем случае по пробелу). О разбиении текста на части поговорим позже, когда будем обсуждать работу со строками, а пока разберем вывод информации на экран. # ### Вывод информации на экран # Как мы уже знаем, для вывода чего-либо на экран в Python существует функция `print()`: # In[10]: print(5) print('Hello!') # Для того, чтобы вывести на экран сразу несколько объектов, нужно просто перечислить их через запятую в круглых скобках. # In[11]: age = 23 print('Your age is ', age) # *Примечание* для тех, кто работал в R: `print()` в Python отличается от `print()` в R тем, что на вход он легко принимает сразу несколько объектов. В R перечень значений пришлось бы оформлять в виде списка (вектора), в противном случае на экран был бы выведен только первый элемент. # ### Форматирование строк (string formatting) # А теперь посмотрим на то, как подставлять значения в уже имеющийся текстовый шаблон, то есть форматировать строки. Чтобы понять, о чем идет речь, можно представить, что у нас есть электронная анкета, которую заполняет пользователь, и мы должны написать программу, которая выводит на экран введенные данные, чтобы пользователь мог их проверить. # # Пусть для начала пользователь вводит свое имя и возраст. # In[12]: name = input("Введите Ваше имя: ") age = int(input("Введите Ваш возраст: ")) # возраст будет целочисленным # Теперь выведем на экран сообщение вида # # Ваше имя: `имя`. Ваш возраст: `возраст`. # Но прежде, чем это сделать, поймем, какого типа будут значения, которые мы будем подставлять в шаблон. Имя (переменная *name*) ‒ это строка (*string*), а возраст (переменная *age*) ‒ это целое число (*integer*). # In[13]: result = "Ваше имя: %s. Ваш возраст: %i." % (name, age) print(result) # Что за таинственные `%s` и `%i`? Все просто: оператор `%` в строке указывает место, на которое будет подставляться значение, а буква сразу после процента ‒ сокращенное название типа данных (`s` ‒ от *string* и `i` ‒ от *integer*). Осталось только сообщить Python, что именно нужно подставлять — после кавычек поставить `%` и в скобках перечислить названия переменных, значения которых мы будем подставлять. # # Для тех, кто работал в R: форматирование строк с помощью оператора `%` ‒ аналог форматирования с помощью функции `sprintf()` в R. # # Конечно, результат можно выводить сразу, не сохраняя полученную строку в переменную. Главное, не запутаться в скобках, и не потерять их. # In[14]: print("Ваше имя: %s. Ваш возраст: %i." % (name, age)) # *Примечание:* не теряйте часть с переменными после самой строки. Иначе получится нечто странное: # In[15]: print("Ваше имя: %s. Ваш возраст: %i.") # Важно помнить, что если мы забудем указать какую-то из переменных, мы получим ошибку (точнее, исключение): Python не будет знать, откуда брать нужные значения. # In[16]: print("Ваше имя: %s. Ваш возраст: %i." % (name)) # Кроме того, создавая такие текстовые шаблоны, нужно обращать внимание на типы переменных, значения которых мы подставляем. # In[17]: print("Ваше имя: %s. Ваш возраст: %s." % (name, age)) # так сработает # In[18]: print("Ваше имя: %i. Ваш возраст: %s." % (name, age)) # а так нет # В первом случае код сработал: Python не очень строго относится к типам данных, и поэтому он легко может превратить целочисленный возраст в строку (два `%s` вместо `%s` и `%i` не является помехой). Во втором случае все иначе. Превратить строку, которая состоит из букв (*name*) в целое число никак не получится, поэтому Python справедливо ругается. # А что будет, если мы будем подставлять не целое число, а дробное, с плавающей точкой? Попробуем! # In[19]: height = float(input("Введите Ваш рост (в метрах): ")) height # In[20]: print("Ваш рост: %f м." % height) # f - от float # По умолчанию при подстановке значений типа *float* Python выводит число с шестью знаками после запятой. Но это можно исправить. Перед `f` нужно поставить точку и указать число знаков после запятой, которое мы хотим: # In[21]: print("Ваш рост: %.2f м." % height) # например, два # In[22]: print("Ваш рост: %.1f м. " % height) # или один # В случае, если указанное число знаков после запятой меньше, чем есть на самом деле (как в ячейке выше), происходит обычное арифметическое округление. # Рассмотренный выше способ форматирования строк ‒ не единственный. Он довольно стандартный, но при этом немного устаревший. В Python 3 есть другой способ ‒ форматирование с помощью метода `.format()`. Кроме того, в Python 3.6 появился еще более продвинутый способ форматирования строк ‒ *f-strings* *(formatted string literals)*. Об этом можно почитать в дополнительных материалах (ноутбук *String-formatting-additional.ipynb*).