Далеко в прошлом остались те времена, когда разработчики Python еще использовали оператор % для форматирования строк.
С момента появления Python 3.0 его постепенно заменили вызовом метода .format() для строкового объекта.
А вот когда наступила эра Python 3.6 и последующих версий, то в обиход вошли f-строки, ставшие новым способом вставки выражения Python внутрь строковых констант. И в настоящее время многие уже освоили это нововведение.

Для тех, кто еще не знаком с этим способом форматирования, отметим, что работать с f-строками чрезвычайно просто. Достаточно лишь предварить строку префиксом f или F, а затем поставить одинарные, двойные или даже тройные кавычки для оформления строки, например f"Hello, Python!".
Наверняка большинство из вас прекрасно осведомлены о механизме форматирования с помощью f-строк, но в этой статье будут представлены малоизвестные способы их применения в Python 3.8+.
Содержание.
- F-строки для более эффективной отладки.
- F-строки для форматирования
floatдо N десятичных знаков, денежных значений, объектовdatetimeи заполнения целых чисел ведущими нулями или пробелами. - F-строки для конверсий (ASCII и
repr()).
Итак, приступаем.
1. F-строки для отладки
Разработчики часто задействуют инструкции print для отладки кода просто потому, что их так легко добавлять.
Как правило, мы делаем так:
viewer = "🐊"
owner = "🐼"
editor = "🐓"
print(viewer)
print(owner)
print(editor)
Отличный способ запутаться в переменных и их значениях.
А вот и вывод в терминале:
🐊
🐼
🐓
На самом деле с инструкциями print в данном коде все в порядке.
Однако если терминал переполнен другими логами отладчика, то велика вероятность забыть порядок выводимых переменных. В таком случае отладка с помощью print быстро превращается в квест по поиску иголки в стоге сена. Вот как в нашем примере:
🐊
🐼 -- Извините, а какой переменной принадлежит это значение?
🐓
Более эффективный способ вывода переменных в процессе отладки
Для решения этой проблемы воспользуемся print(f’{variable_name=}’):
print(f"{viewer=}")
print(f"{owner=}")
print(f"{editor=}")
# Поток Stdout:
# viewer = "🐊"
# owner = "🐼"
# editor = "🐓"
F-строки делают вывод более понятным!
Даже не смотря на то, что мы должны обернуть переменные синтаксисом f-строк, все становится намного яснее. Теперь уже не перепутаешь порядок выводимых переменных во время отладки.
Более того, благодаря такому способу применения f-строк сохраняются пробелы. Их пользу в процессе отладки вы сможете оценить, оказавшись в гуще запутанных логов в терминале.
print(f"{viewer=}")
print(f"{owner=}")
print(f"{editor=}")
# Поток Stdout:
# viewer = "🐊"
# owner = "🐼"
# editor = "🐓"
2. Форматирование строк
Помимо эффективности f-строк в отладке, большего всего полезна их гибкость, позволяющая легко форматировать строки.
Благодаря этому свойству становится гораздо проще читать, писать и поддерживать вывод строки по сравнению со старой доброй конкатенацией.
И сейчас вы в этом убедитесь на простейшем примере переменных типа float.
Форматирование float до N десятичных знаков
Допустим, нужно вывести переменную типа float с двумя десятичными знаками после точки, преобразовав 3.1425123 в 3.14. Не такой уж и редкий случай, надо сказать.
Как правило, на ум приходят варианты со встроенным методом round или “устаревшим” str.format. Ниже рассмотрим эти способы ограничения числа с плавающей точкой до двух десятичных знаков:
# "Устаревшие" способы корректировки числа с плавающей точкой до двух десятичных знаков
float_variable = 3.141592653589793
print("%.2f" % float_variable)
print("{:.2f}".format(float_variable))
# Поток Stdout:
# 3.14
# 3.14
А теперь для этой цели попробуем задействовать f-строки:
float_variable = 3.141592653589793
print(f"{float_variable:.2f}")
# Поток Stdout:
# 3.14
По сравнению с str.format() f-строки все значительно упрощают.
Преобразование float в “красивый” денежный формат
Когда дело касается денежных единиц, строкам необходимо придать максимально удобный для пользователя вид. Например, целесообразно представить значение 3142671.76 как $3,142,671.76.
В данном случае с помощью f-строк очень удобно оформить значение float в денежном формате. С этой целью нам понадобится ,:2f.
money = 3_142_671.76 # 💡 Это тоже самое, что и 3142671.76
print(f"${money:,.2f}")
# Поток Stdout:
# $3,142,671.76
Вот так без особого труда мы представили переменную типа float в “красивом” денежном формате.
Представление datetime в “красивом" формате посредством strftime
F-строки можно использовать не только для форматирования переменных типа float, но и типа datetime.
Наиболее распространенный способ представить объект datetime в удобном для восприятия формате, например 05-July-2021, состоит в применении стандартного встроенного метода strftime, а именно datetime_var.strftime(‘%d-%b-%y’).
То же самое мы легко сможем сделать, обратившись к f-строкам:
from datetime import datetime
now = datetime.now()
# Стандартный способ
formatted_datetime_now = now.strftime('%d-%B-%Y')
print(formatted_datetime_now)
# Способ с f-строкой
formatted_datetime_now = f"{now:%d-%B-%Y}"
print(formatted_datetime_now)
# Поток Stdout
# 05-July-2021
Заполнение переменных int ведущими нулями или пробелами
В зависимости от того, над чем вы работаете, бывают ситуации, требующие заполнить ведущими нулями целое число при его отображении или использовании в виде строки.
Вместо того, чтобы для этой цели писать пользовательскую функцию, мы без особого труда сделаем это с помощью f-строк. Итак, заполняем целочисленную переменную ведущими нулями:
# Выводим длину в 20 цифр и заполняем остальные позиции нулями.
int_variable = 1_234_567
print(f'{int_variable:020}')
# Поток Stdout
# 00000000000001234567
# Выводим длину в 24 цифры и заполняем остальные позиции нулями
int_variable = 30
print(f'{int_variable:024}')
# Поток Stdout
# 000000000000000000000030
Для заполнения целых чисел ведущими пробелами делаем следующее:
# Выводим длину в 10 символов и заполняем остальные позиции ведущими пробелами
whitesplace
int_variable = 20_21
print(f'{int_variable:10d}')
# Stdout
# ' 2021'
# Выводим длину в 5 символов и заполняем остальные позиции пробелами
print(f"{int_variable:5d}")
# Поток Stdout
# ' 2021'
Конверсия
В последнем разделе статьи мы кратко рассмотрим несколько примеров с f-строками для конверсии. Если в f-строке присутствует синтаксис восклицательного знака !, за которым следует переменная, то она проведет дополнительное преобразование этой переменной.
Преобразование строки в ASCII
Например, можно легко вывести представление строки в ASCII с помощью f’{your_variable!a}’ следующим образом:
owl = '🦉'
print(f'{owl!a}')
# Поток Stdout
# '\U0001f989'
Перед вами эмоджи в виде ASCII.
A repr() alternative with f-string
И наконец, еще один отличный способ использовать синтаксис ! в f-строках — отобразить строку, которая содержит выводимое представление объекта наподобие метода repr() в Python.
Обратимся к примеру, в котором вместо repr() воспользуемся !r:
from datetime import datetime
now = datetime.now()
# repr()
print(repr(now))
# F-строки
print(f'{now!r}')
# Поток Stdout
# datetime.datetime(2021, 7, 5, 13, 2, 34, 672383)
repr(now) == f'{now!r}'
# True
Заключение
С началом эры Python 3.6 f-строки стали отличным способом форматирования строк.
Благодаря свойственной им гибкости, позволяющей включать выражения, условия и даже форматирование в строковый объект, f-строки не только просты, но и высокоэффективны.
Из всех перечисленных способов мне особенно нравится форматирование объекта datetime и любых денежных значений.
Надеемся, вы почерпнули для себя много интересного из статьи и воспользуетесь данными приемами в своих сторонних проектах или базе кода.
Читайте также:
- Асинхронная многопоточность в Python
- Отладка кода на Python с помощью icecream
- Как писать код на Python лучше: 6 рекомендаций
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Jerry Ng: 3 Useful Python f-string Tricks You Probably Don’t Know





