Форматирование строк
Иногда нужно напечатать строку, в которой присутствует пользовательский ввод. Например, напечатать "Привет, name", где name - это введённое пользователем имя.
Можно это сделать с помощью конкатенации строк, например:
name = input("Как вас зовут?") print("Привет, " + name)
Однако, если строки станут сложнее, и подстановок станет больше, то выражение, получающееся при применении всех сложений, будет слишком громоздким.
Для облегчения подобных распространённых задач в Python существуют инструменты форматирования строк, аж целых 3.
Форматирование при помощи оператора %
Этот оператор форматирования - наследник форматирования строк из языка C, где были строковые подстановки. Если у нас один аргумент для подстановки, то через процент (так же, как и остаток от деления) пишется переменная для подстановки:
name = input("Как вас зовут?") print("Привет, %s" % name)
Если несколько переменных - то подставлять нужно кортеж (список не подойдёт!) значений.
>>> print("Привет, %s, %d лет" % ("Вася", 35)) Привет, Вася, 35 лет
Спецификаторы преобразования (это те, что %s, %d и т.д.) записываются в следующем порядке:
- %
- Ключ отображения (необязательно), состоящий из последовательности символов в круглых скобках (например, (somename))
- Флаги преобразования
- Минимальная ширина поля
- Точность, начинается с '.', затем - желаемая точность
- Модификатор длины (опционально)
- Тип преобразования
Поясню каждый пункт подробнее.
- Есть возможность подставить словарь значений
>>> print("Привет, %(name)s, %(age)d лет" % {"name": "Вася", "age": 35}) Привет, Вася, 35 лет
- Это флаги, отвечающие за особое отображение чисел. В примере ниже мы отображаем знак числа
>>> print("Привет, %s, %+d лет" % ("Вася", 35)) Привет, Вася, +35 лет
- Минимальная ширина поля полезна для выравнивания
>>> print("Привет, %s, %3d лет" % ("Вася", 35)) Привет, Вася, 35 лет >>> print("Привет, %s, %3d лет" % ("Вася", 100)) Привет, Вася, 100 лет
- Позволяет более точно управлять дробными значениями
>>> print("Привет, %s, %.2f лет" % ("Вася", 35 + 1/12)) Привет, Вася, 35.08 лет >>> print("Привет, %s, %.4f лет" % ("Вася", 35 + 1/12)) Привет, Вася, 35.0833 лет
- Это про числа. Наследие C, где можно писать %ld для чисел типа long int; в Python игнорируется
- %s, %d - это так называемый тип преобразования (%s - строка, %d - целое число, %f - число с плавающей точкой)
Форматирование при помощи метода format
Вместо фигурных скобок в строку, к которой был применён метод format, подставляются значения аргументов
>>> print("Привет, {}, {} лет".format("Вася", 35)) Привет, Вася, 35 лет
Можно внутри фигурных скобок указывать номер аргумента:
>>> print("Привет, {1} лет, {0}".format("Вася", 35)) Привет, 35 лет, Вася
Можно указывать именованные аргументы:
>>> print("Привет, {name}, {age} лет".format(name="Вася", age=35)) Привет, Вася, 35 лет
Можно комбинировать номера и имена:
>>> print("Привет, {}, {age} лет".format("Вася", age=35)) Привет, Вася, 35 лет
Полную спецификацию метода format можно посмотреть здесь (англ.), но в целом там не очень много различий с оператором %, только все флаги записываются после двоеточия:
>>> print("Привет, {:10}, {age:.2f} лет".format("Вася", age=35.0833)) Привет, Вася , 35.08 лет
И можно внутри выражения обращаться по индексу
>>> print("Привет, {}, {age[0]} лет, {age[1]} месяц(ев)".format("Вася", age=(35, 1))) Привет, Вася, 35 лет, 1 месяц(ев)
f-строки
В Python версии 3.6 появился новый способ форматирования строк, а именно f-строки.
Почему f? Из-за способа задания. Как "сырые" строки задаются буквой r в начале, так f-строки задаются буквой f.
s = f"Это f-строка"
Значения в f-строку подставляются прямо в строке, в фигурных скобках. В качестве подстановки выступает выражение, внутри можно выполнить некоторый код.
Также после двоеточия можно записать флаги-модификаторы, как и в format:
name = "вася" age = 35 months = 1 print(f"Привет, {name.title()}, {age} лет, {months} месяц(ев), всего {age + months / 12:.2f} лет") # Привет, Вася, 35 лет, 1 месяц(ев), всего 35.08 лет