Форматирование строк в Python: format() и f-строки

Давайте поговорим про форматирование строк в Python. Этот язык предоставляет несколько вариантов форматирования. Мы разберем метод str.format(), f-строки и «шаблонные» строки.

Но для начала давайте посмотрим, что считается «старым способом» форматирования.

Что такое форматирование строк в Python с помощью %?

Раньше форматирование строк происходило при помощи оператора %.

Вот основной синтаксис данного оператора:

"This is a string %s" % "string value goes here"

Вы можете создать строку и использовать %s внутри нее. %s здесь играет роль плейсхолдера. Дальше вы можете написать значок %, а затем – фактическое строковое значение, которое хотите использовать. Это значение в результате вставится на место плейсхолдера.

Вот базовый пример использования форматирования строки с помощью %.

print("Hi, my name is %s" % "Jessica")

# Запустив такую строчку кода, получим следующий результат:
Hi, my name is Jessica

Этот метод часто называют старым, потому что Python 3 представил  метод str.format(), а также f-строки.

Что такое метод str.format() в Python?

Вот основной синтаксис данного метода:

"template string {}".format(arguments)

Внутри строки мы можем использовать фигурные скобки {}. Они играют роль плейсхолдеров для аргументов. Аргументы – это значения, которые будут подставлены в строку.

В этом примере мы хотим напечатать "Hello, my name is Jessica. I am a musician turned programmer."

В строке у нас будет всего три пары фигурных скобок. Они выступят в роли плейсхолдеров для значений Jessica, musician и programmer.

"Hello, my name is {}. I am a {} turned {}."

Внутри скобок для str.format() мы будем использовать значения Jessica, musician и programmer следующим образом:

.format("Jessica", "musician", "programmer")

Таким образом, целиком наш код будет выглядеть так:

print("Hello, my name is {}. I am a {} turned {}.".format("Jessica", "musician", "programmer"))

# И наш желаемый результат:
Hello, my name is Jessica. I am a musician turned programmer.
[python_ad_block]

Позиционные аргументы

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

В этом примере метод .format() имеет два аргумента: "trumpet" и "drums".

.format("trumpet", "drums")

Мы можем получить доступ к этим значениям внутри строки, обратившись к ним по индексам. {0} относится к первому аргументу ("trumpet"), а {1} — ко второму ("drums").

"Steve plays {0} and {1}."

Вот наш полный код и предложение, которое будет выведено на экран:

print("Steve plays {0} and {1}.".format("trumpet", "drums"))

# Steve plays trumpet and drums.

Мы можем изменить этот пример и поменять местами номера индексов в строке. Вы заметите, что предложение изменилось, так как расположение аргументов поменялось.

print("Steve plays {1} and {0}.".format("trumpet", "drums"))

# Результат:
Steve plays drums and trumpet.

Именованные аргументы

Эти аргументы состоят из пары «ключ-значение». Мы можем получить доступ к значению аргумента, используя ключ внутри фигурных скобок.

В следующем примере у нас есть два ключа: organization и adjective. Мы пропишем их внутри строки:

"{organization} is {adjective}!"

Метод .format() в качестве аргументов получает пары ключ-значение:

.format(organization="Pythonist", adjective="awesome")

Целиком наш код будет выглядеть следующим образом:

print("{organization} is {adjective}!".format(organization="Pythonist", adjective="awesome"))

# Output:
# Pythonist is awesome!

Как смешивать именованные и позиционные аргументы

В str.format() вы можете использовать и именованные, и позиционные аргументы одновременно.

В этом примере мы собираемся написать небольшой рассказ о поездке в Диснейленд.

Сначала мы создадим несколько переменных для имени, числа, прилагательного и аттракциона Диснейленда.

name = "Sam"
adjective = "amazing"
number = 200
disney_ride = "Space Mountain"

Затем мы создадим нашу строку, используя различные аргументы. Также добавим \n, чтобы компьютер создавал новую строку после каждого предложения.

"I went to {0} with {name}.\nIt was {adjective}.\nWe waited for {hours} hours to ride {ride}."

Внутри скобок в методе str.format() мы присвоим ключам name, adjective, hours и disney_ride в качестве значений наши переменные.

{0} будет иметь значение Disneyland.

.format("Disneyland", name=name, adjective=adjective, hours=number, ride=disney_ride)

Полностью наш код выглядит так:

name = "Sam"
adjective = "amazing"
number = 200
disney_ride = "Space Mountain"

print("I went to {0} with {name}.\nIt was {adjective}.\nWe waited for {hours} hours to ride {ride}."
      .format("Disneyland", name=name, adjective=adjective, hours=number, ride=disney_ride))

Запустив его, мы получим следующий результат:

I went to Disneyland with Sam.
It was amazing.
We waited for 200 hours to ride Space Mountain.

Что такое f-строки?

Форматированные строковые литералы (или f-строки) позволяют включать выражения прямо внутри ваших строк. Непосредственно перед строкой вы помещаете f или F. Это сообщает компьютеру, что вы хотите использовать f-строку.

Вот так выглядит основной синтаксис:

variable = "some value"
f"this is a string {variable}"

Вот простой пример, который поможет нам вывести на экран предложение Maria and Jessica have been friends since grade school.

name = "Jessica"
print(f"Maria and {name} have been friends since grade school.")

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

name = "Jessica"
print(F"Maria and {name} have been friends since grade school.")

Результаты последних двух примеров абсолютно идентичны:

Maria and Jessica have been friends since grade school.

Вы также можете использовать f-строку для форматирования данных из словаря.

Давайте рассмотрим следующий пример. У нас есть словарь. В нем представлены лучшие позиции мужских баскетбольных команд колледжей и количество выигранных ими игр из возможных 32.

rankings = {"Gonzaga": 31, "Baylor": 28, "Michigan": 25, "Illinois": 24, "Houston": 21}

При помощи цикла for и словарного метода items() можно просмотреть каждую из пар «ключ-значение» словаря rankings.

for team, score in rankings.items():

Внутри цикла for мы можем использовать f-строку для форматирования выводимых результатов.

Использование двоеточия в {team: 10} и {score: 10d} указывает компьютеру создать поле шириной 10 символов. Так мы получим ровные столбцы для наших данных.

Буква d внутри {score: 10d} обозначает десятичное целое число.

print(f"{team:10} ==> {score:10d}")

Соберем наш код и получим следующую программу:

rankings = {"Gonzaga": 31, "Baylor": 28, "Michigan": 25, "Illinois": 24, "Houston": 21}

for team, score in rankings.items():
    print(f"{team:10} ==> {score:10d}")

Теперь давайте запустим её. Вот, что у нас получится:

Gonzaga    ==>         31
Baylor     ==>         28
Michigan   ==>         25
Illinois   ==>         24
Houston    ==>         21

Что такое «шаблонные» строки?

«Шаблонные» строки – это строки в Python, которые используют плейсхолдеры для реальных значений.

Вот основной синтаксис такой строки:

Template("$placeholder").substitute(placeholder="real value")

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

В этом примере мы хотим напечатать I love to learn with Pythonist!, используя шаблонные строки.

Чтобы их использовать, сначала нужно импортировать класс Template из стандартной библиотеки string.

from string import Template

Затем мы можем использовать класс Template и указать строку внутри скобок. Мы поставим знак доллара $ перед именем. Позже $name заменится реальным значением.

Template("I love to learn with $name!")

Затем мы добавляем .substitute() к шаблону и присваиваем name значение Pythonist.

.substitute(name="Pythonist")

Таким образом, мы получили следующий код:

from string import Template

print(Template("I love to learn with $name!").substitute(name="Pythonist"))

# Результат:
# I love to learn with Pythonist!

Заключение

Форматирование строк в Python можно осуществлять по-разному.

Более старый способ форматирования заключался в использовании оператора %.

"This is a string %s" % "string value goes here"

%s действует как плейсхолдер для реального значения. Вы помещаете реальное значение после оператора %.

Этот метод часто называют старым, потому что Python 3 представил метод str.format() и f-строки.

В методе str.format() вы используете фигурные скобки для плейсхолдеров и круглые — для реальных значений. Этот метод может принимать именованные и позиционные аргументы.

"template string {}".format(arguments)

F-строки позволяют включать выражения в ваши строки. Непосредственно перед строкой вы помещаете f или F, которые сообщают компьютеру, что вы хотите использовать f-строку.

variable = "some value"
f"this is a string {variable}"

Вы также можете использовать шаблонные строки, импортировав класс Template из стандартной библиотеки. Шаблонные строки  – это строки Python, которые используют плейсхолдеры для реальных значений.

Template("$placeholder").substitute(placeholder="real value")

Мы надеемся, что эта статья оказалась для вас полезной, и желаем удачи в вашем путешествии в мире Python!

Перевод статьи «Python String Format – Python S Print Format Example».