Статьи
June 1, 2022

Полное руководство по f-строкам в Python

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

Ранее существовали и другие методы форматирования строк: форматирование при помощи %, строковый метод format() или string.Template(). Они имеют свои преимущества, однако их довольно неудобно использовать. f-строки, в свою очередь, проще более читаемы и лаконичны.

Способы форматирование строк в Python:

  1. Форматирование при помощи % — 'текст %s' % переменная
  2. Метод .format() — 'текст {}'.format(переменная)
  3. f-sстроки — f'текст {переменная} текст'

Форматирование при помощи %

Форматирование при помощи % применяется лишь к целым числам, строкам и вещественным числам. Любой другой тип данных либо не поддерживается, либо преобразуется в подходящий формат. Если указать сразу несколько значений, то такой способ вызовет ошибку TypeError. Это подробно описано в официальной документации.

>>> msg = 'отказ доступа'
print('Ошибка: %s' % msg)
# Ошибка: отказ доступа

# Если msg представлен кортежем
msg = ('отказ достуа', 42)
print('Ошибка: %s' % msg)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: not all arguments converted during string formatting

# Но можно передать таким образом составной объект
>>> print('Ошибка: %s' % (msg,))
# Ошибка: ('отказ доступа', 42)

Форматирование при помощи метода .format()

Метод str.format(), в отличие от форматирования через %, поддерживает нескольких параметров, которые могут быть дополнительно расширены с помощью __format()__. Основная проблема с ним — перегруженность. Взгляните на следующий код, переменная «name» используется слишком часто:

>>> name = 'Олег'
>>> print('Меня зовут {name}.'.format(name=name))
# Меня зовут Олег.

Тем не менее, мы можем использовать сокращённый метод:

>>> name = 'Олег'
>>> print('Меня зовут {}.'.format(name))
# Меня зовут Олег.

Поэтому метод format() прост и удобен только в том случае, если у нас не слишком много переменных.

Использование f-строк в Python

Для использования f-строк мы ставим символ f, за которым следует '(открывающая кавычка), далее текст, если он есть, затем переменная, заключённая в {} (фигурные скобки) и '(закрывающая кавычка).

Синтаксис f-строк

f'текст {переменная} текст'

Следующий пример демонстрирует простоту использования метода:

name = 'Олег'
age = 1000
print(f'Меня зовут {name}, мне {age} лет.')
# Меня зовут Олег, мне 1000 лет.

Функции, lambda-функции и расчёты

Вы можете делать расчёты прямо внутри f-строк, а также использовать методы и функции, добавляя их внутрь фигурных скобок {}.

Расчёты:

>>> print(f'8 плюс 10 будет {8 + 10}.')
# 8 плюс 10 будет 18.

Методы:

name = 'олег'
>>> print(f'Меня зовут {name.upper()}.')
# Меня зовут ОЛЕГ.

Функции:

def foo():
    return 10
    
print(f'Результат: {foo()}.')
# Результат: 10.

lambda-функции:

print(f'4 в степени 4 будет {(lambda x: x*4)(4)}.')
# 4 в степени 4 будет 16.

escape-символы и f-строки

f-строки не поддерживают escape-символы внутри фигурных скобок, а значит, мы не можем включить в них обратный слэш (\) для экранирования других символов. Вместо использования escape-символа мы, например, можем использовать другой тип кавычек. При этом обратный слэш разрешается в текстовой части строки.

print(f'Текст в {'одинарных кавычках'}.')
# SyntaxError: f-string: expecting '}'

print(f'Текст в {\'одинарных кавычках\'}.')
# SyntaxError: f-string expression part cannot include a backslash

print(f'Текст в {"двойных кавычках"}.')
# Текст в двойных кавычках.
print(f'В самом тексте обратный слэш использовать можно, вот так: \', ', {"ура!"}.')
# В самом тексте обратный слэш использовать можно, вот так: \', ура!

Комментарии

Использование комментариев внутри f-строк не поддерживается.

print(f'Олегу {30 + 1 #возраст}')
# SyntaxError: f-string expression part cannot include '#'

Фигурные скобки

При работе с f-строками вы можете напечатать фигурные скобки, используя 2 пары фигурных скобок, чтобы получить на выходе 1 пару, или 4 пары фигурных скобок, чтобы получить на выходе 2 пары:

print(f'{{"1 пара фигурных скобок"}}')
# {"1 пара фигурных скобок"}

print(f'{{{"И тут 1 пара фигурных скобок"}}}')
# {И тут 1 пара фигурных скобок}

print(f'{{{{"А тут 2 пары"}}}}')
# {{"А тут 2 пары"}}

Словари и f-строки

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

details = {'name': 'Олег', 'age' : 1000}

# При использовании одинарных кавычек
print(f'Меня зовут {details['name'], мне {details['age'].')
# SyntaxError: f-string: unmatched '['

# С использованием экранирования
print(f'Меня зовут {details[\'name\'], мне {details[\'age\'].')
# SyntaxError: f-string expression part cannot include a backslash

# Выход – используйте разные типы кавычек (например, двойные)
print(f'Меня зовут {details["name"]}, мне {details["age"]}.')
# Меня зовут Олег, мне 1000.

Заполнение f-строки (f-strings padding)

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

Дополнение строк нулями (0-Padding)

Мы можем дополнять числа в строке нулями (0-Padding) добавляя {переменная:0N} внутри скобок, где N является общим количеством цифр:

for n in range(1, 11):
    print(f'Число: {n:02}')

# Число: 01
# Число: 02
# Число: 03
# Число: 04
# Число: 05
# Число: 06
# Число: 07
# Число: 08
# Число: 09
# Число: 10

Округление чисел (Decimal Places)

Округлять числа (float) можно следующим образом: {переменная:.Nf}, где N – количество цифр после точки. И да, что этот способ не просто удаляет лишние цифры, а правильно их округляет.

from math import pi
print(f'Число Пи: {pi :.4f}')
# Число Пи: 3.1416

Форматирование дат (Date Formatting)

Для форматирования даты в f-строках, нам необходимо использовать модуль datetime и добавить желаемый формат в фигурные скобки {дата:формат}. Со всеми форматами можно ознакомиться на официальном сайте модуля.

import datetime
date = datetime.date(1991, 10, 12)
print(f'{date} — {date:%A}')
# 1991-10-12 — Saturday

print(f'{date:%A, %B %d, %Y}.')
# Saturday, October 12, 1991.

Дополнение пробелами (Space Padding)

Дополнить строки пробелами можно при помощи {переменная:N} где N — это общая длина выражения внутри фигурных скобок. Если переменная равна 1, а N равна 4, то это добавит 3 пробела перед 1, следовательно, сделает общую длину равной 4.

for n in range(1,11):
    print(f'Число: {n:4}')

# Число:    1
# Число:    2
# Число:    3
# Число:    4
# Число:    5
# Число:    6
# Число:    7
# Число:    8
# Число:    9
# Число:   10

Выравнивание строки

И, наконец, мы можем выровнять строку, используя {переменная:>N} где N – это общая длина.

s1 = 'Python'
s2 = 'ython'
s3 = 'thon'
s4 = 'hon'
s5 = 'on'
s6 = 'n'

print(f'{s1:>6}')
print(f'{s2:>6}')
print(f'{s3:>6}')
print(f'{s4:>6}')
print(f'{s5:>6}')
print(f'{s6:>6}')

# Output:
'''
Python
 ython
  thon
   hon
    on
     n
'''

Итого:

  1. Дополнение чисел нулями (0 Padding) - {переменная:0N}
  2. Округление чисел (Decimal Places) - {переменная:.Nf}
  3. Форматирование дат (Date Formatting) - {дата : формат}
  4. Дополнение пробелами (Space Padding) - {переменная:N}
  5. Выравнивание строки (Justified string) - {переменная:>N}

Различные способы записи чисел

В f-строках мы можем применять различные способы записи чисел: шестнадцатеричный (Hexadecimal), восьмеричный (Ocatal), экспоненциальный (scientific) и так далее. Для этого используем синтаксис {переменная:способ записи} как показано в примере ниже:

number = 800

# шестнадцатеричный формат
print(f'{number:x}')

# восьмеричный формат
print(f'{number:o}')

# экспоненциальный формат
print(f'{number:e}')

# 320
# 1440
# 8.000000e+02

Сырые (raw) f-строки

Использовать сырые f-строки можно при помощи синтаксиса {переменная!r}:

name = 'Джон'
print(f'Его зовут {name!r}.')
# Его зовут 'Джон'.

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

Добавляйте f в начале каждой строки, как показано ниже:

name = 'Олег'
age = 1000
profession = "data scientist"
sentence = (
    f'Меня зовут {name}. '
    f'Мне {age}. '
    f'Я {profession}.'
    )

print(sentence)
# Меня зовут Олег.Мне 1000.Я data scientist.

Такой же результат получится при использовании ''' (тройных кавычек) как в следующем примере, но такой способ автоматически будет добавлять перенос на следующую строку (\n):

name = 'Олег'
age = 1000
profession = "data scientist"
sentence = f"""Меня зовут {name}.
Мне {age}.
Я {profession}.
"""
    
print(sentence)
# Меня зовут Олег.\nМне 1000.\nЯ data scientist.

Сравнение скорости способов форматирования

Быстрее ли в итоге f-строки? Да. Следующий пример показывает, что f-строки минимум в два раза быстрее других способов.

import timeit
timeit.timeit("""name="Олег"
age = 1000
'%s – %s.' %(name, age)""", number = 1000000)
# 0.5408120879999956

timeit.timeit("""name="Олег"
age = 1000
'{} – {}.'.format(name, age)""", number = 1000000)
# 0.5696044179999831


timeit.timeit("""name="Олег"
age = 1000
f'{name} – {age}.'
""", number = 1000000)
# 0.2470700240000383

Заключение

Опираясь на всю информацию, которую мы получили ранее, выделим следующие преимущества использования f-строк, по отношению к другим способам форматирования:

  • они быстрее;
  • они читабельнее;
  • они лаконичнее.

Выбор очевиден :)

Источник: SaralGyaan
Перевод и адаптация: Александр Сердюк

👉🏻Подписывайтесь на PythonTalk в Telegram 👈🏻

👨🏻‍💻Чат PythonTalk в Telegram💬

🍩 Поддержать канал 🫶