Форматирование строк в Python действительно прошло очень долгий путь. Во многих языках программирования это известно как интерполяция строк.

Строковая интерполяция - это буквальная строка, содержащая выражения интерполяции или заполнители, которые преобразуются в результирующую строку путем замены выражений интерполяции предоставленными значениями.

Если вы пишете код Python в течение разумного количества времени, то, скорее всего, вы знаете хотя бы один способ добиться интерполяции строк в Python. Создатель Python Гвидо ван Россум, команда разработчиков Python и все сообщество Python долгое время упорно трудились над созданием чистых, ясных, элегантных, точных и всеобъемлющих способов интерполяции строк в Python. Эти усилия и попытки на протяжении многих лет привели к реализации ряда принятых предложений по усовершенствованию Python (PEP), каждое из которых содержит предложения о том, как этого добиться.

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

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

Добро пожаловать, f-string

Что такое ф-струна

Это новейший механизм интерполяции строк, представленный в версии Python 3.6. Это форматирование строки, указанное в соответствующем ему PEP, PEP 3101 не предназначено для замены какого-либо существующего механизма интерполяции, но позиционирует себя как предпочтительный вариант при выполнении форматирования строки.

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

Синтаксис

f '<text> { <expression> <optional !s, !r, or !a> <optional : format specifier> } <text> ...'

Пример

Причины, по которым вам следует использовать f-струну

Каждый из более ранних механизмов интерполяции, представленных в более ранних версиях Python, по сравнению со своими предшественниками был усовершенствован с точки зрения ясности, производительности и общей элегантности кода.

Метод Str.format () был предпочтительным механизмом интерполяции для многих разработчиков Python до того, как f-строки были представлены в версии Python 3.6.

Ниже приведены 5 причин, по которым вам следует подумать об использовании f-строки в следующий раз, когда вам понадобится реализовать интерполяцию строк в Python 3.6.

# 1 Простой, лаконичный и менее подверженный ошибкам

f-string на сегодняшний день является наиболее простой, лаконичной и наименее подверженной ошибкам реализацией интерполяции строк Python. Может, стоит процитировать PEP 498.

Этот PEP вызван желанием иметь более простой способ форматирования строк в Python.

Это действительно правда. Синтаксис очень удобен для глаз, независимо от того, насколько запутанными и длинными становятся ваша буквальная строка и выражения.
И наоборот, строки% -formatting и Str.format () начинают становиться беспорядочными, и их трудно рассуждать, когда работа с длинными строками с множеством выражений. Причина в том, что строковые выражения (заполнители) и их замещающие значения визуально удалены друг от друга; и поэтому их трудно рассуждать. Значения, заменяющие выражения в строке, всегда находятся в крайней правой части строки.

Эта визуальная проблема также увеличивает шансы пропустить заменяющее значение для одного или двух строковых выражений.

f-string чертовски проста, элегантна и красива на вид. Я люблю это.

Давайте сравним f-string с% -formatting и Str.format () с точки зрения простоты, лаконичности, элегантности и подверженности ошибкам.

Посмотрите на приведенные выше фрагменты кода и решите сами, кто победит. И% -formatting, и Str.format () выглядят запутанными и трудными для чтения. Даже при использовании как позиционных, так и ключевых параметров они по-прежнему выглядят довольно запутанными и трудными для чтения, а подключение выражений (заполнителей) к заменяющим значениям справа уже начинает выглядеть запутанным.

# 2 Поддерживает более сложные типы и форматирование

До появления f-строк у других методов интерполяции были свои проблемы с форматированием расширенных типов объектов. Пример% -форматирования может форматировать только выражения типов int, str, dict. Попытка отформатировать буквальное выражение типа кортеж завершается неудачно с приведенными ниже результатами.

Эта проблема с кортежем и аналогичная проблема форматирования с расширенными типами была решена с введением Str.format (). С помощью Str.format () продвинутые типы могут определять __format__ метод для обработки их форматирования. f-string для достижения этого не изобретает заново колеса, а повторно использует реализацию __format__ в Str.format ().

Это позволяет форматировать объекты сторонних библиотек, такие как объект DateTime и другие настраиваемые объекты.

# 3 Поддерживает конкатенацию f-строк и обычных строк

Простая конкатенация означает объединение нескольких независимых строк в одну строку. Эта концепция существует во всех языках программирования. В Python это достигается знаком плюса (+).
До появления f-string с выпуском Python 3.6 добиться объединения интерполируемых строк или интерполирующей строки с обычной литеральной строкой было непросто. Сначала вам нужно было оценить и разрешить отдельные строки интерполяции, присвоить их переменным, а затем объединить переменные результата с помощью знаков плюс (+).

f-string полностью меняет это. Теперь стало проще. Теперь вы можете выполнять конкатенацию, не используя знак плюса (+). Кроме того, вам не нужно оценивать и разрешать строки интерполяции перед их объединением.

Давайте посмотрим, как выглядит объединение строк с использованием строк интерполяции и обычных строковых литералов с использованием% -форматирования, Str.format () и f-строк.

Str.format ()

% -форматирование

f-строка

Несомненно, f-строка выигрывает при выполнении конкатенации строк.
С f-строками у вас не только более чистая конкатенация строк, но и другие удобства.

  • Вы можете объединить две или более f-строки, не оценивая сначала каждую f-строку, не присваивая результирующие строки переменным, а затем используя знак плюса (+) для соединения переменных. Вы можете напрямую соединить свои f-строки, и они будут оценены и соединены вместе.
  • Вы можете объединить f-строку с обычной строкой без знака плюс (+).

# 4 Фигурная скобка ({}) полностью поддерживает выражения Python

Это очень мощно. Выражения f-string поддерживают вычисление всех выражений, поддерживаемых Python. Я имею в виду их всех. Любое выражение можно оценить в {}

Это не поддерживается более ранними методами, такими как% -formatting и Str.format (). Чтобы добиться того же с этими старыми механизмами, вам нужно будет предварительно оценить вещи и назначить результирующие строки переменным, а затем использовать переменные в качестве заменяющих значений для ваших строковых выражений интерполяции.

Давайте посмотрим, что я имею в виду, на примере. Что мы собираемся сделать, так это напечатать строку ниже, область прямоугольника с заданной шириной 5 и длиной 10.

Площади прямоугольника длиной 10 и шириной 5 равны 20.

С помощью f-строки мы можем напрямую оценить площадь прямоугольника, которая равна width * length , непосредственно в {} без необходимости делать это до присвоения ее переменной, скажем, rec_area, а затем использовать переменную как выражение в нашей строке интерполяции .

Вместо нижеприведенного, что является единственным способом добиться этого с помощью% -formatting и Str.format ()

Используя f-строки, вы также можете сделать это, напрямую оценивая площадь в выражении.

# 5 Это быстрее

Да, вы не ослышались. f-string работает быстрее по сравнению с другими механизмами. В Твиттере кто-то спросил, почему f-string быстрее, и на скриншоте ниже показаны пункты Сергей Сторчака, предоставленный разработчиком ядра Python. Каждое второе улучшение скорости вашего приложения - это улучшение опыта для пользователей вашего приложения.

Я сам должен был доказать, что это f-строка требует более быстрого выполнения. Итак, я провел собственный простой тест производительности, используя пакет Python timeit. И действительно, скорость ф-струны - это не разглагольствования и шумихи. f-string невероятно быстрее, чем Str.format (), который, в свою очередь, также быстрее, чем% -форматирование. Ниже приведен снимок экрана с результатами (обратите внимание, что эти результаты указаны в секундах).

Ниже приведен код показателей скорости. Если вы хотите проверить это самостоятельно, скопируйте и вставьте его в файл python с именем string-interpolation-methods.py и вызовите python3 string-interpolation-methods.py из вашего терминала, чтобы увидеть показатели скорости на вашем собственном компьютере. Помните, что вы можете запустить это только с Python 3.6 и выше. Также обратите внимание, что результаты могут немного отличаться на вашем компьютере из-за возможного несоответствия в скоростях ЦП и других системных ресурсах. Тем не менее, струны f по-прежнему будут лидировать с комфортом.

Некоторые проблемы при использовании f-струн

Необходимо отметить следующие моменты, иначе вы скоро испытаете разочарование из-за того, как вы можете пытаться использовать f-струны.

  1. Внутри фигурных скобок нельзя использовать люфты, такие как '\ n,' \ ”',« \' », '\ xhh', '\ uxxxx', '\ Uxxxxxxxx' и т. Д. {}.
    Что-то вроде f"Hello {name\n}" недействителен и вызовет синтаксическую ошибку, например SyntaxError: f-string expression part cannot include a backslash.Использование обратной косой черты позволяет избежать {}, но внутри строкового литерала допустимо.
    Пример: f"Hello {name}\n" это допустимый
  2. Используйте двойную фигурную скобку {{ }} вокруг выражения, если хотите, чтобы полученная строка была заключена в фигурную скобку {} .
    Пример:
    >> f"Hello {{ {name} }}"
    'Hello {Felix Otoo}'
  3. Использование одинарной кавычки вокруг буквальной строки с выражением, содержащим поиск по индексу списка, вызовет синтаксическую ошибку.
    Пример: f'abc{a['x']}' не удастся выполнить лексический анализ Python. Токенизатор, использующий правило токенизации строки Python, проанализирует указанную строку f'abc{a['x']}' на три токена abc{a[, x и ]}
    Два способа справиться с этим:
    f-строка с двойными кавычками: f"abc{a['x']}"
    F-строка с тройными кавычками: f'''abc{a['x']}'''
  4. Если вы используете лямбда-функции внутри строкового выражения, вы должны заключить их в круглые скобки (). Причина в том, что лямбда-функция имеет :, который интерпретируется как начало спецификатора формата, который поворачивается, чтобы отметить начало спецификатора формата. , представляя, что после : недопустимый спецификатор формата

Резюме о том, почему вы должны использовать f-струны сегодня

Мне очень нравятся f-строки в Python 3.6 и выше, и я уверен, что вы тоже. В общем, это причины, по которым вам следует подумать об использовании f-строк.

  1. Простой, лаконичный и менее подверженный ошибкам
  2. Поддерживает более сложные типы и форматирование
  3. Поддерживает конкатенацию между f-строками и обычными строками
  4. Фигурная скобка ({}) полностью поддерживает все выражения Python.

Вы также можете найти эти полезные