В этой статье разберемся со способами форматирования в Python с помощью f-string. Вы узнаете, что такое f-string, как форматировать и округлять числа, создавать отступы, центрировать строки, а также как отображать объекты Python.
Что такое F-string в Python
Форматирование строк в Python претерпело долгую историю. В Python2.6 для форматирования строки использовался оператор %
или модуль str.Template
. Немного позже появился метод str.format
, который был очень гибким и удобным инструментом (остается до сих пор).
С выходом PEP 498 под названием Literal String Interpolation ситуация изменилась. PEP 498 представил новый способ форматирования строк. Вместо вызова метода str.format
теперь нужно добавить символ f
перед началом объявления строки. Сравните между собой три способы форматирования в Python:
>>> text = 'world' >>> 'Hello, %s' % text >>> 'Hello, {}'.format(text) >>> f'Hello, {text}' 'Hello, world'
Использование F-string с другими видами строк
В Python перед началом строки также можно использовать r
(raw), b
(byte), u
(unicode). Однако F-string может сочетаться только с raw string (о ней мы говорили тут). Также можно писать их с большой буквы, но рекомендуется все-таки с маленькой.
Ограничения
Несмотря на то, что использование F-string очень удобно, полностью отказаться от str.format
невозможно. F-string имеет доступ к локальным и глобальным переменным и выполняется в реальном времени. Таким образом, если выражение, используемое внутри {<expr>}
, не может быть вычислено, интерпретатор вызовет исключение. Рассмотрите такой пример в Python:
>>> f'{name}' Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'name' is not defined
Ошибки не возникнет, если мы воспользуемся str.format,
поскольку сначала создается строка, а затем она может вызвать свои методы с нужными аргументами. Вот так выглядит пример на Python, где форматирование строки откладывается до вызова метода:
>>> s = '{name}' >>> s.format(name='Python') 'Python' >>> print(s) {name}
Другой вид ограничения — невозможность использования комментариев внутри выражения F-string:
>>> f'Python is {name #name}' File "<stdin>", line 1 SyntaxError: f-string expression part cannot include '#'
Использование F-string для отладки программы
На первых порах, вместо написания тестов, можно просто выводить на экран результаты работы программы. До появления Python3.8 многие бы писали что-то вроде hello = 58; f"hello = {hello}"
, но в этой конструкции много повторений.
Python3.8 имеет новые особенности. Мы можем переписать всё это выражение одной строкой f"{hello=}"
, которая выведет тот же результат. Кроме того, это свойство можно использовать и с функциями Python:
>>> def magic_number(): ... return 58 >>> f"{magic_number() = }" 'magic_number() = 58'
Форматирование чисел в Python
Полезным применением F-string также является отображение вещественных чисел. Можно указать число с заданным количеством знаков после запятой Для этого добавляется двоеточие, точка, количество десятичных знаков и суффикс f
в конце.
Например, округлим заданное число до двух знаков после запятой в Python:
>>> n = 4 / 3 >>> f'{n:.2f}' # Целочисленное: >>> f'{n:.0f}' '1'
Большие числа можно форматировать в специальном в виде. Например, разделить по сотням каким-нибудь символом, например, знаком подчеркивания или запятой:
>>> big_num = 1234567890 >>> f'{big_num:_}' '1_234_567_890' >>> f'{big_num:,}' '1,234,567,890' # Указывать точность также можно: >>> float_num = 2343552.6516251625 >>> f'{float_num:,.3f}' '2,343,552.652
Еще можно в виде строки отображать проценты без дополнительного умножения на 100. Для этого суффикс f
заменяется на знак процентов %
. Точность вещественного числа также можно указать. Пример на Python для отображения процентов:
>>> p = 33 / 76 >>> p 0.4342105263157895 >>> f'Perс = {p:%}' 'Perc = 43.421053%' >>> f'Perc = {p:.2%}' 'Perc = 43.42%'
Как форматировать даты в Python с f-string
Форматирование объектов datetime
также возможно. После объекта в выражении ставится двоеточие, а затем формат вывода даты. Такая запись может использоваться вместо метода strftime
, о котором говорили здесь.
>>> now = datetime.datetime.now() >>> f'{now:%Y-%m-%d}' '2021-01-19' >>> f'{now:%Y-%m-%d %H:%M:%S}' '2021-01-19 16:50:25'
Как добавить отступы в строку
Добавление отступов (пробелов) внутри строки осуществляется добавлением знака больше или меньше. Знак больше >
добавит указанное количество пробелов впереди, а знак меньше <
после.
Примеры кода на Python для добавления отступов внутри строки:
>>> greetings = "hello" >>> f"He says {greetings:>10}" 'He says hello' >>> f"He says {greetings:<10}" 'He says hello
Отступы могут быть полезны для красивого отображения:
>>> a = 1 >>> b = 21 >>> c = 321 >>> d = 4321 >>> print("\n".join((f"{a:>10}", f"{b:>10}", f"{c:>10}", f"{d:>10}"))) 1 21 321 4321
Отступы могут быть заполнены не только пробелами. Можно указать какие-нибудь другие символы. Их указывают после двоеточия. Пример в Python:
>>> f"{greetings:*<10}" 'hello*****'
Кстати, помимо отступов можно центрировать строку. Для этого используется символ ^
. Вот так выглядит центрирование в Python:
>>> f"{greetings:^10}" ' hello ' >>> f"{greetings:^11}" ' hello ' >>> f"{greetings:*^11}" '***hello***'
Как форматировать объекты
Напоследок расскажем о форматировании объектов с F-string. Для отображения объектов на экран в Python вызывается метод __repr__
или __str__
. Как правило, первый метод нужен для клиента, а второй — для отладки, т.е. для себя.
Допустим имеется объект Color, у которого есть атрибуты, отвечающие за красный, синий и зеленый цвета:
class Color: def __init__(self, r=255, g=255, b=255): self.r = r self.g = g self.b = b def __str__(self) -> str: return "A RGB color" def __repr__(self) -> str: return f"Color(r={self.r}, g={self.g}, b={self.b})"
Тогда простое использование объекта в f-string вызовет метод __str__
, а вот добавление !r
вызовет __repr__
. Вот так выглядит вывод объектов Python:
>>> f"{c}" 'A RGB color' >>> f"{c!r}" 'Color(r=123, g=32, b=255)'
Можно контролировать отображение объектов, передавая те или иные значения аргумента. Как это сказано в PEP 3101, для этого нужно определить метод __format__
. Этот метод принимает аргумент format_spec
, который определят вид отображения, например, с помощью условий. Пример реализации этого объекта для нашего объекта в Python может выглядеть так:
class Color: # Те же методы, что и выше ... def __format__(self, format_spec): if not format_spec or format_spec == "s": return str(self) elif format_spec == "r": return repr(self) elif format_spec == "v": return ( f"Color(r={self.r}, g={self.g}, b={self.b})" f" - It is RGB." ) elif format_spec == "vv": return ( f"Color(r={self.r}, g={self.g}, b={self.b})" f" - A more verbose nice RGB thing." ) raise ValueError( f"Unknown format code '{format_spec}'" )
Теперь можем отображать объект в нужно нам виде. Передаются значения аргумента после двоеточия в f-string. Вот так выглядит передача в объект Python разных значений:
>>> c = Color(r=123, g=32, b=255) >>> f'{c:v}' 'Color(r=123, g=32, b=255) - It is RGB.' >>> f'{c:vv}' 'Color(r=123, g=32, b=255) - A more verbose nice RGB thing.' >>> f'{c}' 'A RGB color' >>> f'{c:s}' 'A RGB color' >>> f'{c:r}' 'Color(r=123, g=32, b=255)' >>> f'{c:j}' ValueError: Unknown format code 'j' for object of type 'Color'
- PYML: Введение в машинное обучение на Python
- DPREP: Подготовка данных для Data Mining на Python
- PYNN: Введение в Нейронные сети на Python
А о том, как работать со строками Python, а также применять полученные знанию для решения прикладных задачи Data Science вы узнаете на наших курсах в лицензированном учебном центре обучения и повышения квалификации Data Scientist’ов и IT-специалистов в Москве.