Вступление
Python 3.6 представил новый способ форматирования строк: f-Strings. Это быстрее, чем другие методы форматирования строк в Python, и они позволяют нам оценивать выражения Python внутри строки.
В этом посте мы рассмотрим различные способы форматирования строк в Python. Затем мы более подробно рассмотрим f-Strings, посмотрим, как мы можем использовать их при отображении различных данных.
Традиционное форматирование строк в Python
Прежде чем мы перейдем к f-Strings, давайте взглянем на более «традиционные» параметры форматирования строк , доступные в 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 "<stdin>", line 1, in <module>
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 года на разработку на C, приведенный
выше синтаксис может вам не понравиться. Таким образом, 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-Strings более внимательно.
Форматирование строк с помощью f-строк
F-строки или форматированные строковые литералы имеют префикс f
и
содержат поля замены с фигурными скобками. Они оцениваются во время
выполнения, что делает их самым быстрым вариантом форматирования строк в
Python (по крайней мере, в стандартной реализации CPython).
Сначала убедитесь, что у вас установлена версия Python 3.6 или выше:
$ python3 --version
Python 3.6.0
Если ваша версия Python ниже 3.6, вам необходимо выполнить обновление, чтобы использовать эту функцию.
Литералы F-String начинаются с символа f
, за которым следует любой
тип строк (например, одинарная кавычка, двойная кавычка, тройная
кавычка), затем вы можете включить выражение Python внутри строки между
фигурными скобками.
Давайте создадим строку для использования f-String в вашей оболочке 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-String. У каждого класса есть два разных метода, которые позволяют преобразовать объект в строку:
- Метод
__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-String с __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-String). Если вы попробуете в своем интерпретаторе Python сделать следующее:
print(f'{ord("\n")}')
Вы получите следующую ошибку:
File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash
То же ограничение справедливо и для однотипных кавычек. Код ниже:
a = {"key": "value"}
print(f"the value is {a["key"]}")
Выдает нам эту синтаксическую ошибку:
File "<stdin>", line 1
print(f"the value is {a["key"]}")
^
SyntaxError: invalid syntax
Чтобы избежать этих проблем, мы можем вычислить их вне f-String:
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-Strings мы получаем удобочитаемое решение, для которого оптимизирован Python. Помимо преимущества в скорости, мы видели, насколько хорошо f-Strings работают с оценкой выражений и объектов из классов.