f-строки в Python
Начиная с версии 3.6 в Python появился новый тип строк — f-строки, которые буквально означают «formatted string». Эти строки улучшают читаемость кода, а также работают быстрее чем другие способы форматирования. F-строки задаются с помощью литерала «f» перед кавычками.
>>> "обычная строка"
>>> f"f-строка"
f-строки - это пятый способ (sic!) форматирования строк в Python, который очень похож на использование метода format().
Вспомним все 5 способов форматирования.
5 способов форматирования строк
1. Конкатенация. Грубый способ форматирования, в котором мы просто склеиваем несколько строк с помощью операции сложения:
>>> name = "Дмитрий"
>>> age = 25
>>> print("Меня зовут " + name + ". Мне " + str(age) + " лет.")
>>> Меня зовут Дмитрий. Мне 25 лет.
2. %-форматирование. Самый популярный способ, который перешел в Python из языка С. Передавать значения в строку можно через списки и кортежи , а также и с помощью словаря. Во втором случае значения помещаются не по позиции, а в соответствии с именами.
>>> name = "Дмитрий"
>>> age = 25
>>> print("Меня зовут %s. Мне %d лет." % (name, age))
>>> Меня зовут Дмитрий. Мне 25 лет.
>>> print("Меня зовут %(name)s. Мне %(age)d лет." % {"name": name, "age": age})
>>> Меня зовут Дмитрий. Мне 25 лет.
3. Template-строки. Этот способ появился в Python 2.4, как замена %-форматированию (
>>> from string import Template
>>> name = "Дмитрий"
>>> age = 25
>>> s = Template('Меня зовут $name. Мне $age лет.')
>>> print(s.substitute(name=name, age=age))
>>> Меня зовут Дмитрий. Мне 25 лет.
4. Форматирование с помощью метода format(). Этот способ появился в Python 3 в качестве замены %-форматированию. Он также поддерживает передачу значений по позиции и по имени.
>>> name = "Дмитрий"
>>> age = 25
>>> print("Меня зовут {}. Мне {} лет.".format(name, age)
>>> Меня зовут Дмитрий. Мне 25 лет.
>>> print("Меня зовут {name} Мне {age} лет.".format(age=age, name=name)
>>> Меня зовут Дмитрий. Мне 25 лет.
5. f-строки. Форматирование, которое появилось в Python 3.6 (
>>> name = "Дмитрий"
>>> age = 25
>>> print(f"Меня зовут {name} Мне {age} лет.")
>>> Меня зовут Дмитрий. Мне 25 лет.
Курс по языку Python 3
Узнать подробнее- Научитесь программировать на Python с нуля
- Более 130 уроков и 300 заданий
- Поддержка преподавателя на всех этапах
Погружение в f-строки
f-строки делают очень простую вещь — они берут значения переменных, которые есть в текущей области видимости, и подставляют их в строку. В самой строке вам лишь нужно указать имя этой переменной в фигурных скобках.
>>> name = "Дмитрий"
>>> age = 25
>>> print(f"Меня зовут {name} Мне {age} лет.")
>>> Меня зовут Дмитрий. Мне 25 лет.
f-строки также поддерживают расширенное форматирование чисел:
>>> from math import pi
>>> print(f"Значение числа pi: {pi:.2f}")
>>> Значение числа pi: 3.14
С помощью f-строк можно форматировать дату без вызова метода strftime():
>>> from datetime import datetime as dt
>>> now = dt.now()
>>> print(f"Текущее время {now:%d.%m.%Y %H:%M}")
>>> Текущее время 24.02.2017 15:51
Они поддерживают базовые арифметические операции. Да, прямо в строках:
>>> x = 10
>>> y = 5
>>> print(f"{x} x {y} / 2 = {x * y / 2}")
>>> 10 x 5 / 2 = 25.0
Позволяют обращаться к значениям списков по индексу:
>>> planets = ["Меркурий", "Венера", "Земля", "Марс"]
>>> print(f"Мы живим не планете {planets[2]}")
>>> Мы живим не планете Земля
А также к элементам словаря по ключу:
>>> planet = {"name": "Земля", "radius": 6378000}
>>> print(f"Планета {planet['name']}. Радиус {planet['radius']/1000} км.")
>>> Планета Земля. Радиус 6378.0 км.
Причем вы можете использовать как строковые, так и числовые ключи. Точно так же, как в обычном Python коде:
>>> digits = {0: 'ноль', 'one': 'один'}
>>> print(f"0 - {digits[0]}, 1 - {digits['one']}")
>>> 0 - ноль, 1 - один
Вы можете вызывать в f-строках методы объектов:
>>> name = "Дмитрий"
>>> print(f"Имя: {name.upper()}")
>>> Имя: ДМИТИРИЙ
А также вызывать функции:
>>> print(f"13 / 3 = {round(13/3)}")
>>> 13 / 3 = 4
f-строки очень гибкий и мощный инструмент для создания самых разнообразных шаблонов. Со всеми возможностями f-строк вы можете ознакомиться в PEP498.
Переиспользование кавычек в Python 3.12
Начиная с Python версии 3.12, f-строки поддерживают так называемое переиспользование кавычек (quote reuse), когда один вид кавычек применяется и для оформления самой строки, и для работы внутри фигурных скобок. Иными словами, теперь вы можете писать так:
>>> planet = {"name": "Земля", "radius": 6378000}
>>> print(f"Планета {planet["name"]}. Радиус {planet["radius"]/1000} км.")
Обратите внимание, что f-строка начинается и заканчивается с двойных кавычек и те же двойные кавычки я использую для доступа к ключам "name" и "radius"внутри фигурных скобок. И это важное уточнение. Если вы решите переиспользовать кавычки вне фигурных скобок, то это вызовет синтаксическую ошибку:
>>> planet = {"name": "Земля", "radius": 6378000}
>>> # Так писать нельзя
>>> print(f"Планета "{planet["name"]}". Радиус {planet["radius"]/1000} км.")
>>> # А так можно
>>> print(f"Планета \"{planet["name"]}\". Радиус {planet["radius"]/1000} км.")
Использование кавычек за пределами фигурных скобок подчиняется тем же правилам, что и при работе с обычными строками: чередовать, либо экранировать. И разумеется, парность кавычек внутри фигурных скобок должна сохраняться. Либо двойные "name", либо одинарные 'name', но не вперемешку "name'.
Подробнее о переиспользовании кавычек можно почитать в PEP 701.
Производительность
F-строки не только гибкие, но и быстрые. И для сравнения производительности разных подходов к форматированию я подготовил два шаблона:
- простой, в который нужно вставить всего два значения: строку и число;
- сложный, данные для которого собираются из разных переменных, а внутри происходит преобразование даты, вещественного числа, а также округление.
Финальная простая строка получается такой:
Привет, меня зовут Дмитрий. Мне 27 лет.
Сложная строка на выходе такая:
Сегодня 24.02.2017.
Мы живём на планете Земля. Её радиус 6378 км., а масса 5.973e+24
Период обращения планеты вокруг Солнца 365 дней.
Далее я написал 5 функций, каждая из которых возвращает строку отформатированную одним из способом, а после запустил каждую функцию много раз. Пример всех функций и тестового скрипта можете скачать тут.
После недолгого тестирования я получил следующие результаты:

На простых примерах f-строки показывают наилучшие результаты.
На 25% быстрее %-форматирования и метода format().

На сложных шаблонах f-строки ведут себя так же как %-форматирование
(разница в пользу %-форматирования не превышает величину погрешности).
А вот относительно метода format() f-строки быстрее на 27%.
Заключение
Если вы используете Python 3.6 и старше, то самое время использовать f-строки — они гибкие и быстрые.