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

Введение Python 3.6 представил новый способ форматирования строк: f-Strings. Это быстрее, чем другие методы форматирования строк в Python, и они позволяют нам оценивать выражения Python внутри строки. В этом посте мы рассмотрим различные способы форматирования строк в Python. Затем мы более подробно рассмотрим f-Strings, посмотрим, как мы можем использовать их при отображении различных данных. Традиционное форматирование строк в Python Прежде чем мы перейдем к f-строкам, давайте взглянем на более «традиционные»

Вступление

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 работают с оценкой выражений и объектов из классов.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus

Содержание