Основы программирования в Python

Алла Тамбовцева, НИУ ВШЭ

Форматирование строк (string formatting)

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

Пусть для начала пользователь вводит свое имя и возраст.

In [9]:
name = input("Введите Ваше имя: ")
age = int(input("Введите Ваш возраст: ")) # возраст будет целочисленным
Введите Ваше имя: Алла
Введите Ваш возраст: 25

Теперь выведем на экран сообщение вида

Ваше имя: `имя`. Ваш возраст: `возраст`. 

Но прежде, чем это сделать, поймем, какого типа будут значения, которые мы будем подставлять в шаблон. Имя (переменная name) – это строка (string), а возраст (переменная age) – это целое число (integer).

In [10]:
result = "Ваше имя: %s. Ваш возраст: %i." % (name, age)
print(result)
Ваше имя: Алла. Ваш возраст: 25.

Что за таинственные %s и %i? Все просто: оператор % в строке указывает место, на которое будет подставляться значение, а буква сразу после процента – сокращённое название типа данных (s – от string и i – от integer). Осталось только сообщить Python, что именно нужно подставлять – после кавычек поставить % и в скобках перечислить названия переменных, значения которых мы будем подставлять.

Для тех, кто работал в R: форматирование строк с помощью оператора % – аналог форматирования с помощью функции sprintf() в R.

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

In [11]:
print("Ваше имя: %s. Ваш возраст: %i." % (name, age))
Ваше имя: Алла. Ваш возраст: 25.

Примечание: не теряйте часть с переменными после самой строки. Иначе получится нечто странное:

In [12]:
print("Ваше имя: %s. Ваш возраст: %i.")
Ваше имя: %s. Ваш возраст: %i.

Важно помнить, что если мы забудем указать какую-то из переменных, мы получим ошибку (точнее, исключение): Python не будет знать, откуда брать нужные значения.

In [13]:
print("Ваше имя: %s. Ваш возраст: %i." % (name))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-2343aa81e176> in <module>
----> 1 print("Ваше имя: %s. Ваш возраст: %i." % (name))

TypeError: not enough arguments for format string

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

In [14]:
print("Ваше имя: %s. Ваш возраст: %s." % (name, age)) # так сработает
Ваше имя: Алла. Ваш возраст: 25.
In [15]:
print("Ваше имя: %i. Ваш возраст: %s." % (name, age)) # а так нет
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-9c083ea32449> in <module>
----> 1 print("Ваше имя: %i. Ваш возраст: %s." % (name, age)) # а так нет

TypeError: %i format: a number is required, not str

В первом случае код сработал: Python не очень строго относится к типам данных, и поэтому он легко может превратить целочисленный возраст в строку (два %s вместо %s и %i не является помехой). Во втором случае все иначе. Превратить строку, которая состоит из букв (name) в целое число никак не получится, поэтому Python справедливо ругается.

А что будет, если мы будем подставлять не целое число, а дробное, с плавающей точкой? Попробуем!

In [16]:
height = float(input("Введите Ваш рост (в метрах): "))
height
Введите Ваш рост (в метрах): 1.68
Out[16]:
1.68
In [17]:
print("Ваш рост: %f м." % height) # f - от float
Ваш рост: 1.680000 м.

По умолчанию при подстановке значений типа float Python выводит число с шестью знаками после запятой. Но это можно исправить. Перед f нужно поставить точку и указать число знаков после запятой, которое мы хотим:

In [18]:
print("Ваш рост: %.2f м." % height) # например, два
Ваш рост: 1.68 м.
In [19]:
print("Ваш рост: %.1f м. " % height) # или один
Ваш рост: 1.7 м. 

В случае, если указанное число знаков после запятой меньше, чем есть на самом деле (как в ячейке выше), происходит обычное арифметическое округление.

Рассмотренный выше способ форматирования строк – не единственный. Он довольно стандартный, но при этом немного устаревший. В Python 3 есть другой способ ‒ форматирование с помощью метода .format(). Кроме того, в Python 3.6 и более поздних версиях появился еще более продвинутый способ форматирования строк ‒ f-strings (formatted string literals).

F-strings очень удобны и просты в использовании: вместо % и сокращённого названия типа в фигурных скобках внутри текстового шаблона нужно указать название переменной, из которой должно подставляться значение, а перед всей строкой добавить f, чтобы Python знал, что нам нужна именно f-string.

In [20]:
print(f"Ваше имя: {name}. Ваш возраст: {age}")
Ваше имя: Алла. Ваш возраст: 25