Примеры форматирования строк с помощью f-string

автор рубрика
Примеры форматирования строк с помощью f-string

В этой статье разберемся со способами форматирования в 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
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, о котором говорили здесь.

Формат даты с кодами Python
Запись для форматирования даты
>>> 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'

 

А о том, как работать со строками Python, а также применять полученные знанию для решения прикладных задачи Data Science вы узнаете на наших курсах в лицензированном учебном центре обучения и повышения квалификации Data Scientist’ов и IT-специалистов в Москве.

Комментировать

Ваш адрес email не будет опубликован. Обязательные поля помечены *