Строки, которые начинаются спрефикса 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 = 1000print(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 backslashprint(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 piprint(f'Число Пи: {pi :.4f}')# Число Пи: 3.1416
Форматирование дат (Date Formatting)
Для форматирования даты в f-строках, нам необходимо использовать модуль datetime
и добавить желаемый формат в фигурные скобки {дата:формат}
. Со всеми форматами можно ознакомиться на официальном сайте модуля.
import datetimedate = datetime.date(1991, 10, 12)print(f'{date} — {date:%A}')# 1991-10-12 — Saturdayprint(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 = 1000profession = "data scientist"sentence = ( f'Меня зовут {name}. ' f'Мне {age}. ' f'Я {profession}.' )print(sentence)# Меня зовут Олег.Мне 1000.Я data scientist.
Такой же результат получится при использовании '''
(тройных кавычек) как в следующем примере, но такой способ автоматически будет добавлять перенос на следующую строку (\n)
:
name = 'Олег'age = 1000profession = "data scientist"sentence = f"""Меня зовут {name}.Мне {age}.Я {profession}.""" print(sentence)# Меня зовут Олег.\nМне 1000.\nЯ data scientist.
Сравнение скорости способов форматирования
Быстрее ли в итоге f-строки? Да. Следующий пример показывает, что f-строки минимум в два раза быстрее других способов.
import timeittimeit.timeit("""name="Олег"age = 1000'%s – %s.' %(name, age)""", number = 1000000)# 0.5408120879999956timeit.timeit("""name="Олег"age = 1000'{} – {}.'.format(name, age)""", number = 1000000)# 0.5696044179999831timeit.timeit("""name="Олег"age = 1000f'{name} – {age}.'""", number = 1000000)# 0.2470700240000383
Заключение
Опираясь на всю информацию, которую мы получили ранее, выделим следующие преимущества использования f-строк, по отношению к другим способам форматирования:
Источник: SaralGyaan
Перевод иадаптация: Александр Сердюк
👉🏻Подписывайтесь на PythonTalk в Telegram 👈🏻