Полное руководство по f-строкам в Python
Строки, которые начинаются с префикса f и содержат выражения с переменными внутри фигурных скобок {}
, называют f-строками. Они были добавлены в Python 3.6.0.
Ранее существовали и другие методы форматирования строк: форматирование при помощи %
, строковый метод format()
или string.Template()
. Они имеют свои преимущества, однако их довольно неудобно использовать. f-строки, в свою очередь, проще более читаемы и лаконичны.
Способы форматирование строк в Python:
Форматирование при помощи %
Форматирование при помощи %
применяется лишь к целым числам, строкам и вещественным числам. Любой другой тип данных либо не поддерживается, либо преобразуется в подходящий формат. Если указать сразу несколько значений, то такой способ вызовет ошибку 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-строк
Следующий пример демонстрирует простоту использования метода:
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.
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 '''
Различные способы записи чисел
В 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 👈🏻