Рубрики
Без рубрики

Форматирование строк с помощью f-строк Python 3

F-Строки, имеют префикс f и содержат поля замены с фигурными скобками. Они позволяют нам быстрее форматировать строки и вычислять выражения в Python.

Автор оригинала: Sajjad Heydari.

Вступление

Python 3.6 представил новый способ форматирования строк: f-Strings. Это быстрее, чем другие методы форматирования строк в Python, и они позволяют нам вычислять выражения Python внутри строки.

В этом посте мы рассмотрим различные способы форматирования строк в Python. Затем мы более подробно рассмотрим f-строки, рассматривая, как мы можем использовать их при отображении различных данных.

Традиционное форматирование строк в Python

Прежде чем мы перейдем к f-строкам, давайте посмотрим на более “традиционные” параметры форматирования строк, доступные в Python. Если вы просто хотите перейти к изучению f-строк, ознакомьтесь с разделом Форматирование строк с помощью f-строк в этой статье.

Конкатенация строк

Конкатенация строк означает, что мы объединяем две строки, чтобы создать новую. В Python мы обычно объединяем строки с оператором + .

В вашем интерпретаторе Python давайте использовать конкатенацию для включения переменной в строку:

name = "Python"
print("I like " + name + " very much!")

Вы увидите следующий вывод:

I like Python very much!

Конкатенация строк работает только со строками. Если вы хотите включить нестроковые данные, вам придется преобразовать их вручную.

Давайте посмотрим, объединив число со строкой:

age = (10 + 5) * 2
print("You wouldn't believe me, but I am only " + age + " years old")

Запустив вышеописанное вы увидите эту ошибку:

Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str

Теперь давайте преобразуем age в строку:

age = (10 + 5) * 2
print("You wouldn't believe me, but I am only " + str(age) + " years old")

Переводчик правильно покажет:

You wouldn't believe me, but I am only 30 years old

Этот метод не всегда является самым быстрым для Python для оценки, и людям не так легко управлять многими переменными. Лучше использовать специальные методы форматирования строк Python.

Форматирование строк в стиле C

Форматирование строк в стиле C, также называемом стилем printf, использует строки в качестве шаблонов, помеченных символом % , чтобы можно было подставлять переменные.

Например, %d сообщает Python, что мы подставляем число, тогда как %s сообщает Python, что мы подставляем строку.

Существует также несколько механизмов управления, например %02d гарантирует, что число состоит по крайней мере из 2 цифр, а если это не так, то остальные будут заполнены нулями. Мы можем использовать маркер типа %.4f , чтобы заменить десятичную дробь ровно 4 плавающими точками в строке.

В вашем интерпретаторе Python введите следующий код, чтобы мы могли видеть форматирование строк в стиле C в действии:

print('Here is an integer %02d' % 4)
print('And a float: %.2f' % 3.141592)
print("And a %s with %d replacements" % ("mess", 2))

Ваш вывод должен быть:

Here is an integer 04
And a float: 3.14
And a mess with 2 replacements

Как вы могли видеть, с большим количеством аргументов он становится довольно запутанным и трудным для понимания. Таким образом, Python делает еще один шаг вперед и позволяет использовать словари в формате % .

Хотя это не сильно улучшает его общую эстетику, это может немного помочь на фронте читабельности.

Попробуйте отформатировать строку в стиле C с помощью словаря:

print('Using %(dictionary)s format in C-style string formatting, here is %(num)d number to make it more interesting!' % {'dictionary': "named", "num": 1})

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

Ваш переводчик должен отображать:

Using named format in C-style string formatting, here is 1 number to make it more interesting!

Если вы не потратили последние 42 года на разработку языка Си, приведенный выше синтаксис может вам не понравиться. Таким образом, Python дает нам еще один вариант, используя метод format() для строк.

Функция Python format()

Функция format() ведет себя аналогично форматированию в стиле C, но она гораздо более удобочитаема. Он работает, вызывая метод format() в вашей строке, предоставляя замены в шаблоне в фигурных скобках – {} .

Используя ваш интерпретатор Python, мы будем использовать метод format() для форматирования строки. Давайте начнем с замены одной строки:

print("This is a first {}".format("attempt!"))

Выход будет таким:

This is a first attempt!

Мы можем использовать фигурные скобки несколько раз, подставляя переменные по порядку:

print("And {} can add {} string too.".format("we", "more"))

Выход:

And we can add more string too.

Мы также можем назвать переменные, которые мы форматируем:

print("String format also supports {dictionary} arguments.".format(dictionary="named"))

Приведенный выше код должен быть напечатан:

String format also supports named arguments.

Хотя этот метод очень удобочитаем, Python более эффективен с f-строками, а также читаем. Давайте посмотрим на f-струны более внимательно.

Форматирование строк с помощью f-строк

F-строки, или форматированные строковые литералы , имеют префикс f и содержат поля замены с фигурными скобками. Они вычисляются во время выполнения, что делает их самым быстрым вариантом форматирования строк в Python (по крайней мере, в стандартной реализации CPython).

Во-первых, убедитесь, что у вас есть версия Python 3.6 или выше:

$ python3 --version
Python 3.6.0

Если ваша версия Python меньше 3.6, вам необходимо обновить ее, чтобы использовать эту функцию.

F-Строковые литералы начинаются с f , за которыми следуют строки любого типа (например, одинарная кавычка, двойная кавычка, тройная кавычка), затем вы можете включить свое выражение Python внутри строки, между фигурными скобками.

Давайте построим строку, чтобы использовать f-строку в вашей оболочке Python:

name = "f-String"
print(f"hello {name}!")

А теперь запустите его, чтобы увидеть магию:

hello f-String!

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

Давайте посмотрим на эти функции, начиная с многострочных строк.

Многострочные f-строки

F-Strings допускает многострочные строки, все, что вам нужно сделать, это обернуть их в круглые скобки:

name = "World"
message = (
  f"Hello {name}. "
  "This is from a multi-lined f-string. "
  f"Have a good day, {name}"
)
print(message)

Вы увидите это на распечатке:

Hello World. This is from a multi-lined f-string. Have a good day, World

Не забудьте поставить литерал f перед строками, которые имеют замены. Иначе замены не сработают.

Оценка выражений Python в f-строках

F-строки Python позволяют выполнять выражения прямо в самой строке. Допустима следующая строка:

number = 10
print(f"{number} + 1 = {number+1}")

И выходы:

10 + 1 = 11

Вы можете включить любое допустимое выражение, если оно не содержит специальных символов. Например, у нас могут быть вызовы функций:

def func():
  return 42

print(f"func() = {func()}")

Это возвращает:

func() = 42

Форматирование классов с помощью f-строк

Вы можете включать объекты, созданные из классов, в f-строку. Каждый класс имеет два различных метода, которые позволяют преобразовать объект в строку:

  • Метод __str__() объекта должен возвращать строку, которая одновременно отображается пользователю и понятна ему. Это означает, что он не должен иметь никакой секретной информации, которая должна быть скрыта от пользователя, и он не должен иметь никаких отладочных сообщений.
  • Метод __repr__() объекта должен возвращать более подробную строку, возможно, содержащую отладочную информацию.

f-Строки автоматически вызывают __str__() для объекта, который вы им предоставляете.

Давайте попробуем наши f-строки с классом, чтобы убедиться сами. Мы создадим класс User , который хранит ваше имя и связанный с ним идентификатор базы данных, используемый нашей воображаемой системой.

Создайте новый файл с именем fstring_classes.py и добавить следующее:

# fstring_classes.py

class User:
    def __init__(self, name, db_id):
        self.name = name
        self.db_id = db_id

    def __str__(self):
        return f"User with name: {self.name}"

my_user = User("Sajjad", 12)
print(f"{my_user}")

В вашем терминале запустите файл с помощью Python:

$ python fstring_classes.py

Эта программа покажет:

User with name: Sajjad

Если мы хотим использовать f-строку с методом __repr_() объекта, вы можете поставить !r перед заменяемым объектом.

Отредактируйте fstring_classes.py файл и изменить последнюю строку:

print(f"{my_user}")

В следующее, которое включает в себя суффикс !r :

print(f"{my_user!r}")

Теперь мы можем запустить эту программу снова:

$ python fstring_classes.py

И наш выход будет:

User with name: Sajjad with id 12

Обработка специальных символов в f-строках

F-строки, как и любая другая строка Python, поддерживают использование обратной косой черты для экранирования символов. Все следующие допустимые f-строки Python:

print(f'escaping with \\ is also possible, like: \'')

Запуск этого процесса приведет к печати:

escaping with \ is also possible, like: '

Однако есть одно ограничение: мы не можем использовать обратную косую черту внутри фигурных скобок (часть выражения f-строки). Если вы попробуете следующее в своем интерпретаторе Python:

print(f'{ord("\n")}')

Вы получите следующую ошибку:

  File "", line 1
SyntaxError: f-string expression part cannot include a backslash

То же ограничение справедливо и для однотипных кавычек. Код ниже:

a = {"key": "value"}
print(f"the value is {a["key"]}")

Дает нам эту синтаксическую ошибку:

  File "", line 1
    print(f"the value is {a["key"]}")
                               ^
SyntaxError: invalid syntax

Чтобы избежать этих проблем, мы можем либо вычислить их вне f-строки:

ord_newline = ord("\n")
print(f'{ord_newline}')

Какие отпечатки:

10

Или мы можем использовать различные типы цитат:

a = {"key": "val"}
print(f"The value is {a['key']}")

Какие дисплеи:

The value is val

Вывод

В этом посте мы рассмотрели различные методы форматирования строк в Python, уделив особое внимание методу f-String. В Python мы избалованы опциями, поскольку можем объединять строки, использовать форматирование в стиле C с помощью % или метода format() для строк.

Однако с f-строками мы получаем читаемое решение, для которого оптимизирован Python. Помимо преимуществ скорости, мы видели, как хорошо f-строки работают с вычислением выражений и объектов из классов.