Перейти к содержимому
Editor

Форматирование строк в Python: f-строки, format() и оператор %

Начальный20 min5 упр.75 XP

Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе

0/5 упр.

Представьте, что вы печатаете чек для кофейни. Нужно собрать название товара, цену и количество в одну аккуратную строку. Можно склеивать строки через +, но код быстро превращается в кашу.

Форматирование строк похоже на бланк с пропусками. Вы один раз пишете структуру предложения, а затем подставляете значения туда, где им место. Так чище, быстрее и гораздо легче читать.

В Python есть три способа форматировать строки: f-строки, метод `.format()` и оператор `%`. В этом уроке вы освоите все три и узнаете, какой из них когда использовать.

Почему форматирование строк лучше конкатенации

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

Конкатенация (громоздко)
name = "Latte"
price = 4.5
qty = 2
print("Item: " + name + " | Price: $" + str(price) + " | Qty: " + str(qty))
f-строка (аккуратно)
name = "Latte"
price = 4.5
qty = 2
print(f"Item: {name} | Price: ${price} | Qty: {qty}")

Обе строки выводят одно и то же. Но вариант с f-строкой короче, его легче читать, и вам никогда не придётся самостоятельно вызывать str(). Python выполняет преобразование автоматически.

Как использовать f-строки в Python

f-строка (форматированный строковый литерал) начинается с буквы f перед открывающей кавычкой. Внутри строки переменные или выражения записываются в фигурных скобках {}.

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

Простая f-строка
name = "Alice"
age = 30
city = "Seattle"
print(f"My name is {name}.")
print(f"I am {age} years old.")
print(f"I live in {city}.")
Вывод
My name is Alice.
I am 30 years old.
I live in Seattle.

Всё дело в букве f перед кавычками. Без неё Python вывел бы текст {name} как есть, а не значение переменной.

Что будет без префикса f
# Without the f prefix - curly braces are printed literally
name = "Alice"
print("Hello, {name}!") # No f prefix
print(f"Hello, {name}!") # With f prefix
Вывод
Hello, {name}!
Hello, Alice!

Какие выражения можно писать внутри f-строк?

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

Выражения внутри f-строк
# Math expressions
width = 10
height = 5
print(f"Area: {width * height} square units")
# Function calls
name = "python"
print(f"Uppercase: {name.upper()}")
# Conditional expressions
score = 85
print(f"Result: {'Pass' if score >= 60 else 'Fail'}")
Вывод
Area: 50 square units
Uppercase: PYTHON
Result: Pass

Представьте каждую пару {} как маленький калькулятор. Python вычисляет выражение, превращает результат в строку и ставит его на место.


Как форматировать числа в f-строках Python

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

Знаки после запятой: .Nf

Используйте :.Nf, чтобы показать ровно N знаков после запятой. Буква f означает запись с фиксированной точкой (fixed-point). Без этого не обойтись при выводе цен, размеров и результатов.

Управление числом знаков после запятой
price = 4.5
pi = 3.14159265
print(f"Price: ${price:.2f}") # 2 decimal places
print(f"Pi: {pi:.4f}") # 4 decimal places
print(f"Rounded: {pi:.1f}") # 1 decimal place
Вывод
Price: $4.50
Pi: 3.1416
Rounded: 3.1

Разделители разрядов для больших чисел

Используйте :,, чтобы разделить разряды большого числа запятыми. Так числа вроде 1000000 гораздо легче прочитать с одного взгляда.

Добавление разделителей разрядов
population = 8900000
salary = 75000.50
print(f"Population: {population:,}")
print(f"Salary: ${salary:,.2f}")
Вывод
Population: 8,900,000
Salary: $75,000.50

Проценты с помощью %

Используйте :.N%, чтобы показать десятичную дробь в процентах. Python сам умножит значение на 100 и добавит знак %.

Форматирование процентов
completion = 0.756
tax_rate = 0.0825
print(f"Progress: {completion:.1%}") # 75.6%
print(f"Tax rate: {tax_rate:.2%}") # 8.25%
Вывод
Progress: 75.6%
Tax rate: 8.25%

Ширина поля и выравнивание

Можно задать минимальную ширину для значения и выбрать выравнивание: по левому краю, по правому краю или по центру. Это идеально подходит для аккуратного выровненного вывода, например таблиц.

Ширина поля и выравнивание
# Width and alignment
print(f"|{'Left':<15}|") # Left-aligned, 15 chars wide
print(f"|{'Center':^15}|") # Center-aligned
print(f"|{'Right':>15}|") # Right-aligned
# Numbers default to right-aligned
print(f"|{42:>10}|") # Right-aligned number
print(f"|{42:010}|") # Zero-padded to 10 digits
Вывод
|Left           |
|    Center     |
|          Right|
|        42|
|0000000042|

Как использовать метод .format()

До появления f-строк разработчики на Python пользовались методом .format(). В строку ставятся пустые заполнители {}, а затем вызывается .format() со значениями, которые нужно подставить.

Использование .format()
name = "Bob"
age = 25
# Positional arguments
print("Hello, {}! You are {} years old.".format(name, age))
# Numbered positions
print("Hello, {0}! You are {1} years old. Nice to meet you, {0}!".format(name, age))
# Named arguments
print("Hello, {n}! You are {a} years old.".format(n=name, a=age))
Вывод
Hello, Bob! You are 25 years old.
Hello, Bob! You are 25 years old. Nice to meet you, Bob!
Hello, Bob! You are 25 years old.

Метод .format() поддерживает те же спецификаторы формата, что и f-строки. Всё, что стоит после двоеточия, работает точно так же.

Форматирование чисел с помощью .format()
price = 19.99
print("Price: ${:.2f}".format(price))
print("Big number: {:,}".format(1000000))
Вывод
Price: $19.99
Big number: 1,000,000

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


Оператор % для форматирования строк (старый стиль)

Оператор % является самым старым способом форматирования строк в Python. Он позаимствован у функции printf из языка C. Вы встретите его в старом коде и должны его узнавать, но в новом коде использовать его не нужно.

Форматирование через % в старом стиле
name = "Charlie"
age = 35
price = 9.99
print("Hello, %s! You are %d years old." % (name, age))
print("Price: $%.2f" % price)
Вывод
Hello, Charlie! You are 35 years old.
Price: $9.99

%s означает «вставить сюда строку», %d означает «вставить целое число», а %f означает «вставить число с плавающей точкой». Сами значения указываются в конце, после оператора %.


f-строки, format() или оператор %: что выбрать?

Все три подхода дают одинаковый результат. Разница в читаемости и удобстве. Вот один и тот же вывод, записанный тремя способами:

Три способа отформатировать одну и ту же строку
item = "Coffee"
price = 4.50
# f-string (Python 3.6+) - recommended
print(f"{item}: ${price:.2f}")
# .format() method (Python 2.6+)
print("{}: ${:.2f}".format(item, price))
# % operator (oldest style)
print("%s: $%.2f" % (item, price))
Вывод
Coffee: $4.50
Coffee: $4.50
Coffee: $4.50

Многострочные f-строки и приёмы из реальных программ

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

Многострочная f-строка
name = "Alice"
order_id = 4821
total = 37.50
message = f"""Hi {name},
Your order #{order_id} has been confirmed.
Total: ${total:.2f}
Thank you for shopping with us!"""
print(message)
Вывод
Hi Alice,

Your order #4821 has been confirmed.
Total: $37.50

Thank you for shopping with us!

Вот практический пример: построение отформатированной таблицы. Благодаря спецификаторам выравнивания все столбцы выстраиваются ровно.

Построение отформатированной таблицы
# Simple formatted table
products = [
("Laptop", 999.99, 1),
("Mouse", 29.50, 3),
("Keyboard", 74.00, 2),
]
print(f"{'Product':<12} {'Price':>8} {'Qty':>5} {'Total':>10}")
print("-" * 37)
for name, price, qty in products:
total = price * qty
print(f"{name:<12} {price:>8.2f} {qty:>5} {total:>10.2f}")
Вывод
Product         Price   Qty      Total
-------------------------------------
Laptop         999.99     1     999.99
Mouse           29.50     3      88.50
Keyboard        74.00     2     148.00
Сокращение = для отладки
# Debug trick (Python 3.8+)
x = 42
y = 17
print(f"{x=}")
print(f"{y=}")
print(f"{x + y=}")
Вывод
x=42
y=17
x + y=59

Практические упражнения

Отформатируйте строку чека
Напишите код

Создайте переменную item со значением "Cappuccino" и переменную price со значением 4.5. Затем с помощью f-строки выведите строку чека точно в таком виде:

Cappuccino .......... $4.50

Название товара должно стоять слева, а цена должна выводиться ровно с 2 знаками после запятой. Между названием и ценой используйте строку " .......... $".

# Create the variables and print the formatted receipt line
Отформатируйте большое число с разделителями
Напишите код

Создайте переменную population со значением 7900000000. Выведите её с помощью f-строки с запятыми между разрядами, чтобы получилось:

World population: 7,900,000,000
# Format the population with commas
Создайте отформатированную строку таблицы
Напишите код

Создайте три переменные: name = "Alice", score = 95.8 и grade = "A+". Выведите отформатированную строку таблицы, в которой:

  • имя выровнено по левому краю в поле шириной 10 символов
  • балл выровнен по правому краю в поле шириной 8 символов, с 1 знаком после запятой
  • оценка выровнена по центру в поле шириной 6 символов
  • Ожидаемый вывод (символы | входят в вывод):

    | Alice      |     95.8 |   A+  |
    # Create the variables and print the formatted table row
    Исправьте сломанную f-строку
    Исправьте ошибку

    Код ниже должен выводить "Hello, Sam! You scored 92.5%.", но в нём есть ошибки. Найдите и исправьте их.

    Нужно исправить 2 ошибки.

    name = "Sam"
    score = 0.925
    print("Hello, {name}! You scored {score:.1%}.")
    Создайте персональное приветствие для письма
    Напишите код

    Создайте переменные:

  • first_name = "Jordan"
  • items = 3
  • total = 89.95
  • Затем с помощью многострочной f-строки (в тройных кавычках) выведите точно такое сообщение:

    Hi Jordan,
    
    Thank you for your purchase of 3 items.
    Your total is $89.95.
    
    Have a great day!

    Проследите, чтобы сумма выводилась ровно с 2 знаками после запятой.

    # Create the variables and print the email greeting

    Похожие уроки

    Урок был полезен?