F-строки в Python: синтаксис, выражения и функции
Обновлено:
1. Что такое f-строка
F-строка — это строка, внутрь которой можно удобно подставлять:
- значения переменных;
- результаты математических выражений;
- результаты встроенных функций;
- результаты собственных функций.
F-строки появились в Python 3.6. Они были добавлены как более удобный способ создавать строки с динамическими значениями.
Простейший пример:
first_name = 'Анна'
message = f'Здравствуйте, {first_name}!'
print(message)
Результат:
Здравствуйте, Анна!
2. Что использовали до появления f-строк
До появления f-строк часто использовали:
- сложение строк;
- оператор
%; - метод
format().
Метод format() на этом уроке не рассматривается.
Он по-прежнему существует и не является устаревшим. В некоторых ситуациях, например при использовании заранее подготовленного изменяемого шаблона, он может быть удобнее f-строки.
Позже мы отдельно познакомимся с методом format().
3. Синтаксис f-строки
Перед открывающей кавычкой ставится маленькая буква:
f
Пример:
message = f'Hello'
В тех местах, куда нужно подставить значение, используются фигурные скобки:
{}
Внутри фигурных скобок записывается переменная или выражение:
first_name = 'Анна'
message = f'Здравствуйте, {first_name}!'
4. Буква f обязательна
Рассмотрим обычную строку:
first_name = 'Анна'
message = 'Здравствуйте, {first_name}!'
print(message)
Результат:
Здравствуйте, {first_name}!
Без буквы f фигурные скобки и имя переменной становятся обычной частью текста.
Правильно:
message = f'Здравствуйте, {first_name}!'
Результат:
Здравствуйте, Анна!
5. Значение f-строки имеет тип str
F-строка создаёт обычный объект класса str:
first_name = 'Анна'
message = f'Здравствуйте, {first_name}!'
print(type(message))
Результат:
<class 'str'>
F-строка — это способ создать строку, а не отдельный тип данных.
6. Сообщение без f-строки
Предположим, банк должен подготовить уведомление для клиента.
Есть три переменные:
first_name = 'Анна'
last_name = 'Смирнова'
balance = 12_500.75
Без f-строки сообщение можно составить с помощью сложения:
message = (
'Клиент: '
+ first_name
+ ' '
+ last_name
+ '. Доступный баланс: '
+ str(balance)
+ ' руб.'
)
print(message)
Результат:
Клиент: Анна Смирнова. Доступный баланс: 12500.75 руб.
7. Почему понадобился str()
Переменная:
balance
ссылается на объект класса float.
Оператор + не может сложить строку и вещественное число:
'Баланс: ' + balance
Будет ошибка:
TypeError
Поэтому перед сложением число пришлось преобразовать:
str(balance)
8. То же сообщение с помощью f-строки
first_name = 'Анна'
last_name = 'Смирнова'
balance = 12_500.75
message = (
f'Клиент: {first_name} {last_name}. '
f'Доступный баланс: {balance} руб.'
)
print(message)
Результат:
Клиент: Анна Смирнова. Доступный баланс: 12500.75 руб.
Внутри фигурных скобок можно подставлять объекты разных изученных типов.
Дополнительно вызывать str(balance) не требуется.
9. Преимущества f-строки
Сравним два варианта.
Сложение строк:
message = (
'Клиент: '
+ first_name
+ ' '
+ last_name
+ '. Доступный баланс: '
+ str(balance)
+ ' руб.'
)
F-строка:
message = (
f'Клиент: {first_name} {last_name}. '
f'Доступный баланс: {balance} руб.'
)
F-строка:
- короче;
- легче читается;
- не требует вручную преобразовывать числа в строки;
- лучше показывает итоговый шаблон сообщения;
- уменьшает количество операторов
+.
10. Уведомление о погоде без f-строки
city = 'Тбилиси'
temperature = 18.5
wind_speed = 4.2
message = (
'Сегодня в городе '
+ city
+ ' ожидается температура '
+ str(temperature)
+ ' °C. Скорость ветра: '
+ str(wind_speed)
+ ' м/с.'
)
print(message)
Результат:
Сегодня в городе Тбилиси ожидается температура 18.5 °C. Скорость ветра: 4.2 м/с.
Такой код работает, но содержит много сложений и преобразований.
11. Уведомление о погоде с f-строкой
city = 'Тбилиси'
temperature = 18.5
wind_speed = 4.2
message = (
f'Сегодня в городе {city} ожидается температура '
f'{temperature} °C. Скорость ветра: {wind_speed} м/с.'
)
print(message)
Результат:
Сегодня в городе Тбилиси ожидается температура 18.5 °C. Скорость ветра: 4.2 м/с.
Шаблон сообщения хорошо виден прямо в исходном коде.
12. В фигурных скобках можно писать выражения
Внутри фигурных скобок можно выполнять вычисления:
first_number = 10
second_number = 5
message = f'Сумма чисел: {first_number + second_number}'
print(message)
Результат:
Сумма чисел: 15
Сначала Python вычисляет:
first_number + second_number
После этого подставляет результат в строку.
13. Другие математические операции
length = 8
width = 5
message = (
f'Длина: {length}\n'
f'Ширина: {width}\n'
f'Площадь: {length * width}\n'
f'Периметр: {(length + width) * 2}'
)
print(message)
Результат:
Длина: 8
Ширина: 5
Площадь: 40
Периметр: 26
Круглые скобки внутри фигурных скобок управляют порядком математических операций.
14. Вычисление или отдельная переменная
Можно выполнить вычисление прямо внутри f-строки:
message = f'Площадь: {length * width}'
Можно сначала создать переменную:
area = length * width
message = f'Площадь: {area}'
Оба варианта правильные.
Отдельную переменную удобно создавать, когда:
- результат используется несколько раз;
- выражение длинное;
- понятное имя улучшает читаемость;
- результат нужно использовать отдельно от строки.
15. Вызов встроенной функции
В фигурных скобках можно вызывать встроенные функции:
balance = 12_500.7564
message = f'Доступный баланс: {round(balance, 2)} руб.'
print(message)
Результат:
Доступный баланс: 12500.76 руб.
Сначала выполняется:
round(balance, 2)
Затем полученный результат подставляется в строку.
16. Другие встроенные функции
numbers = [10, 20, 30, 40]
message = (
f'Количество чисел: {len(numbers)}\n'
f'Сумма чисел: {sum(numbers)}\n'
f'Минимальное число: {min(numbers)}\n'
f'Максимальное число: {max(numbers)}'
)
print(message)
Результат:
Количество чисел: 4
Сумма чисел: 100
Минимальное число: 10
Максимальное число: 40
17. Среднее арифметическое внутри f-строки
numbers = [10, 20, 30]
message = f'Среднее значение: {sum(numbers) / len(numbers)}'
print(message)
Результат:
Среднее значение: 20.0
Можно сразу округлить результат:
numbers = [10, 20, 31]
message = (
f'Среднее значение: '
f'{round(sum(numbers) / len(numbers), 2)}'
)
print(message)
Результат:
Среднее значение: 20.33
18. Вызов собственной функции
Создадим функцию:
def calculate_square_area(side_length):
return side_length ** 2
Вызовем её внутри f-строки:
side_length = 6
message = (
f'Площадь квадрата со стороной {side_length}: '
f'{calculate_square_area(side_length)}'
)
print(message)
Результат:
Площадь квадрата со стороной 6: 36
Сначала выполняется собственная функция, затем её результат подставляется в строку.
19. Функция, возвращающая готовое сообщение
def create_balance_message(
first_name,
last_name,
balance,
):
return (
f'Клиент: {first_name} {last_name}. '
f'Доступный баланс: {round(balance, 2)} руб.'
)
Вызов:
message = create_balance_message(
'Анна',
'Смирнова',
12_500.7564,
)
print(message)
Результат:
Клиент: Анна Смирнова. Доступный баланс: 12500.76 руб.
20. Зачем формировать строку внутри функции
Функция содержит общий шаблон сообщения:
def create_balance_message(
first_name,
last_name,
balance,
):
return (
f'Клиент: {first_name} {last_name}. '
f'Доступный баланс: {round(balance, 2)} руб.'
)
Теперь её можно использовать для разных клиентов:
print(
create_balance_message(
'Анна',
'Смирнова',
12_500.7564,
)
)
print(
create_balance_message(
'Иван',
'Петров',
850.5,
)
)
Результат:
Клиент: Анна Смирнова. Доступный баланс: 12500.76 руб.
Клиент: Иван Петров. Доступный баланс: 850.5 руб.
Один шаблон используется многократно.
21. Функция для сообщения о погоде
def create_weather_message(
city,
temperature,
wind_speed,
):
return (
f'Сегодня в городе {city} ожидается температура '
f'{temperature} °C.\n'
f'Скорость ветра: {wind_speed} м/с.'
)
Вызов:
message = create_weather_message(
'Тбилиси',
18.5,
4.2,
)
print(message)
Результат:
Сегодня в городе Тбилиси ожидается температура 18.5 °C.
Скорость ветра: 4.2 м/с.
22. Многострочная f-строка
F-строку можно использовать вместе с тройными кавычками:
first_name = 'Анна'
balance = 12_500.75
message = f"""Информация о клиенте:
Имя: {first_name}
Баланс: {balance} руб."""
print(message)
Результат:
Информация о клиенте:
Имя: Анна
Баланс: 12500.75 руб.
Переносы внутри тройных кавычек сохраняются.
23. F-строки внутри круглых скобок
Для аккуратного многострочного кода можно использовать круглые скобки:
first_name = 'Анна'
last_name = 'Смирнова'
balance = 12_500.75
message = (
'Информация о клиенте:\n'
f'Имя: {first_name}\n'
f'Фамилия: {last_name}\n'
f'Баланс: {balance} руб.'
)
print(message)
Результат:
Информация о клиенте:
Имя: Анна
Фамилия: Смирнова
Баланс: 12500.75 руб.
24. Не каждая часть должна быть f-строкой
Рассмотрим:
message = (
'Информация о клиенте:\n'
f'Имя: {first_name}\n'
f'Фамилия: {last_name}\n'
f'Баланс: {balance} руб.'
)
В первой строке нет переменных:
'Информация о клиенте:\n'
Поэтому буква f перед ней не нужна.
Букву f ставим только перед теми строковыми литералами, внутри которых есть фигурные скобки с выражениями.
25. Расчётный отчёт внутри функции
def create_circle_report(radius, units):
diameter = radius * 2
area = round(3.14 * radius ** 2, 2)
circumference = round(2 * 3.14 * radius, 2)
return (
'Результаты вычислений:\n'
f'Радиус круга: {radius} {units}\n'
f'Площадь круга: {area} {units}²\n'
f'Диаметр круга: {diameter} {units}\n'
f'Длина окружности: {circumference} {units}'
)
Вызов:
report = create_circle_report(5, 'см')
print(report)
Результат:
Результаты вычислений:
Радиус круга: 5 см
Площадь круга: 78.5 см²
Диаметр круга: 10 см
Длина окружности: 31.4 см
26. Что происходит внутри функции
Функция:
- получает радиус;
- получает единицы измерения;
- вычисляет диаметр;
- вычисляет площадь;
- вычисляет длину окружности;
- округляет результаты;
- создаёт многострочный отчёт;
- возвращает готовую строку.
В этом примере f-строка используется для отделения:
- бизнес-логики;
- текста, который должен увидеть пользователь.
27. Строка внутри фигурных скобок
Внутри фигурных скобок может находиться выражение со строкой.
Простой учебный пример:
def repeat_text(text):
return text * 2
message = f"Результат: {repeat_text('OK')}"
print(message)
Результат:
Результат: OKOK
Снаружи используются двойные кавычки:
f"..."
Внутри фигурных скобок — одинарные:
'OK'
28. Одинаковые кавычки в разных версиях Python
До Python 3.12 повторное использование таких же кавычек внутри выражения f-строки могло привести к SyntaxError.
Начиная с Python 3.12 ограничения синтаксиса f-строк были ослаблены, и одинаковые кавычки внутри выражения стали допустимы. Это изменение было добавлено в рамках PEP 701.
В Python 3.12 и новее может работать:
message = f"Результат: {repeat_text("OK")}"
Однако для лучшей читаемости и совместимости с Python 3.11 разумно продолжать использовать разные кавычки:
message = f"Результат: {repeat_text('OK')}"
29. Когда f-строка не обязательна
Предположим, нужно соединить две строки:
greeting = 'Здравствуйте, '
first_name = 'Анна'
Можно использовать f-строку:
message = f'{greeting}{first_name}'
Но обычное сложение тоже остаётся понятным:
message = greeting + first_name
Оба варианта вернут:
Здравствуйте, Анна
30. Простой текст в начале или конце
Если нужно добавить одну строку к другой, оператор + может быть проще:
file_name = 'report.xlsx'
message = 'Обработан файл: ' + file_name
Или:
status = 'успешно'
message = status + ' завершено'
F-строка здесь тоже допустима:
message = f'Обработан файл: {file_name}'
Выбор зависит прежде всего от читаемости.
31. Когда f-строка особенно удобна
F-строку лучше использовать, когда:
- в текст подставляется несколько значений;
- среди значений есть числа;
- внутри строки выполняются вычисления;
- вызываются функции;
- сообщение состоит из большого шаблона;
- операторов
+становится слишком много.
Пример:
message = (
f'Клиент: {first_name} {last_name}. '
f'Доступный баланс: {round(balance, 2)} руб.'
)
32. Скорость работы
Для измерения скорости небольших участков кода в Python существует модуль:
timeit
Он многократно выполняет указанный код и возвращает общее время выполнения в секундах.
Чем меньше результат, тем быстрее выполнился проверяемый вариант.
Точное время зависит от:
- версии Python;
- реализации Python;
- компьютера;
- операционной системы;
- количества запусков;
- конкретного выражения.
33. Сравнение большого сообщения
from timeit import timeit
first_name = 'Анна'
last_name = 'Смирнова'
balance = 12_500.75
concatenation_code = (
"'Клиент: ' + first_name + ' ' + last_name + "
"'. Доступный баланс: ' + str(balance) + ' руб.'"
)
f_string_code = (
"f'Клиент: {first_name} {last_name}. "
"Доступный баланс: {balance} руб.'"
)
concatenation_time = timeit(
concatenation_code,
number=1_000_000,
globals=globals(),
)
f_string_time = timeit(
f_string_code,
number=1_000_000,
globals=globals(),
)
print('Сложение:', concatenation_time)
print('F-строка:', f_string_time)
В подобных выражениях с несколькими подстановками f-строка во многих версиях CPython обычно оказывается быстрее или сопоставима со сложением.
Кроме того, f-строка здесь значительно лучше читается.
34. Сравнение простой подстановки
from timeit import timeit
first_name = 'Анна'
concatenation_code = "'Здравствуйте, ' + first_name"
f_string_code = "f'Здравствуйте, {first_name}'"
concatenation_time = timeit(
concatenation_code,
number=1_000_000,
globals=globals(),
)
f_string_time = timeit(
f_string_code,
number=1_000_000,
globals=globals(),
)
print('Сложение:', concatenation_time)
print('F-строка:', f_string_time)
При простом соединении двух строк оператор + в некоторых версиях CPython может работать немного быстрее.
Но разница обычно очень мала.
35. Не нужно оптимизировать каждую строку заранее
Не следует выбирать способ создания строки только ради очень небольшой разницы во времени.
Сначала обращаем внимание на:
- правильность;
- читаемость;
- понятность;
- простоту изменения кода.
Если строка содержит много вставок, f-строка обычно является лучшим выбором.
Если нужно просто соединить две готовые строки, оператор + может быть достаточно понятным.
Измерять производительность имеет смысл тогда, когда скорость действительно важна для программы.
36. Частые ошибки
Забыли букву f
first_name = 'Анна'
message = 'Здравствуйте, {first_name}!'
Результат:
Здравствуйте, {first_name}!
Исправление:
message = f'Здравствуйте, {first_name}!'
Забыли фигурные скобки
first_name = 'Анна'
message = f'Здравствуйте, first_name!'
Результат:
Здравствуйте, first_name!
Исправление:
message = f'Здравствуйте, {first_name}!'
Использовали имя, которого нет
message = f'Здравствуйте, {user_name}!'
Если имя user_name не было создано, будет:
NameError
Ошибка внутри выражения
balance = '12500'
message = f'Баланс после начисления: {balance + 500}'
Будет:
TypeError
Проблема находится не в f-строке.
Строку нельзя сложить с целым числом.
37. Основные правила урока
Простейшая f-строка:
first_name = 'Анна'
message = f'Здравствуйте, {first_name}!'
Перед кавычкой ставится:
f
Переменная помещается в:
{}
В фигурных скобках можно выполнять вычисления:
f'Сумма: {10 + 5}'
Можно вызывать встроенные функции:
f'Баланс: {round(balance, 2)} руб.'
Можно вызывать собственные функции:
f'Площадь: {calculate_square_area(5)}'
F-строка создаёт объект класса:
str
Для большого количества вставок f-строка обычно удобнее сложения строк.
Домашнее задание
Задание 1. Простая подстановка
Создать переменные:
first_name = 'Иван'
last_name = 'Петров'
age = 25
С помощью f-строки создать сообщение:
Пользователь: Иван Петров. Возраст: 25 лет.
Сохранить сообщение в переменную и вывести через print().
Задание 2. Исправление старого кода
Переписать код с использованием f-строки:
city = 'Батуми'
temperature = 24.5
wind_speed = 3.8
message = (
'Город: '
+ city
+ '. Температура: '
+ str(temperature)
+ ' °C. Скорость ветра: '
+ str(wind_speed)
+ ' м/с.'
)
Дополнительные вызовы str() в новом варианте использовать не нужно.
Задание 3. Функция банковского уведомления
Создать функцию:
create_account_message()
Функция принимает три позиционных обязательных аргумента:
first_name
account_number
balance
Функция должна округлить баланс до двух знаков и вернуть сообщение:
Здравствуйте, Анна! Счёт №1250. Доступный баланс: 15400.76 руб.
Вызвать функцию с несколькими разными значениями.
Задание 4. Функция прогноза погоды
Создать функцию:
create_weather_notification()
Функция принимает:
city
temperature
wind_speed
И возвращает многострочное сообщение:
Прогноз погоды:
Город: Тбилиси
Температура: 18.5 °C
Скорость ветра: 4.2 м/с
Использовать круглые скобки, \n и f-строки.
Задание 5. Отчёт о прямоугольнике
Создать функцию:
create_rectangle_report()
Функция принимает длину и ширину прямоугольника.
Внутри функции найти:
- площадь;
- периметр.
Функция должна вернуть сообщение:
Результаты вычислений:
Длина: 8
Ширина: 5
Площадь: 40
Периметр: 26
Не выполнять одну и ту же математическую операцию несколько раз.
Задание 6. Отчёт по списку чисел
Создать функцию:
create_numbers_report()
Функция принимает список или кортеж чисел.
Внутри функции найти:
- количество элементов;
- сумму;
- минимальное число;
- максимальное число;
- среднее арифметическое;
- среднее арифметическое, округлённое до двух знаков.
Вернуть все результаты в одной многострочной f-строке.
Задание 7. Сообщение о заказе
Создать функцию:
create_order_message()
Функция принимает:
order_number
product_count
total_price
delivery_price
Внутри функции найти итоговую стоимость:
стоимость товаров + стоимость доставки
Вернуть сообщение:
Заказ №4587
Количество товаров: 3
Стоимость товаров: 2500 руб.
Доставка: 300 руб.
Итого: 2800 руб.
Задание 8. Вызов собственной функции внутри f-строки
Создать функцию:
calculate_cube()
Функция принимает число и возвращает его куб.
После этого создать вторую функцию:
create_cube_message()
Она принимает число и возвращает строку:
Куб числа 5 равен 125.
Функцию calculate_cube() вызвать непосредственно внутри фигурных скобок f-строки.
Задание 9. Вложенные вычисления
Создать функцию:
create_average_message()
Функция принимает три числа.
Она должна вернуть строку:
Числа: 10, 20, 31. Среднее значение: 20.33.
Среднее значение:
- вычислить внутри функции;
- округлить до двух знаков;
- подставить в f-строку.
Задание 10. Найти и исправить ошибки
В коде допущены ошибки:
def create_user_message(first_name, age):
return 'Пользователь: {first_name}. Возраст: {age}.'
def create_balance_message(balance):
return f'Баланс: {balance + "500"} руб.'
def create_result_message(number):
return f"Квадрат числа: {number ** 2'
Нужно:
- найти все ошибки;
- объяснить причину каждой ошибки;
- исправить функции;
- вызвать каждую функцию;
- сохранить возвращённые строки в переменные;
- вывести результаты через
print().