Python - String Formatting

Overview

Estimated time: 25–35 minutes

Python offers multiple ways to format strings. This lesson builds a clear mental model for the str.format() mini-language and modern f-strings, when to use each, and how to avoid common pitfalls.

Learning Objectives

  • Use f"..." and "...".format() to interpolate values safely and readably.
  • Apply the format mini-language for numbers, dates, alignment, and width/precision.
  • Recognize security/perf pitfalls and choose the right approach for logging and internationalization.

Prerequisites

  • Basics of variables, numbers, and strings
  • Python 3.8+ recommended (examples note features requiring 3.10+ when applicable)

Examples

Prefer f-strings for most formatting: they are concise and fast.

name = "Ada"
age = 36
msg = f"{name} is {age} years old"
print(msg)

Expected Output:

Ada is 36 years old

Use : to apply format specifiers:

pi = 3.14159
print(f"{pi:.2f}")      # 2 decimal places
print(f"{pi:8.2f}")     # width 8, aligned right
print(f"{pi:<8.2f}")    # left align, width 8

Guidance & Patterns

  • Contrast concatenation ("Hello, " + name) vs f-strings for readability and type-safety.
  • Show format specifiers: alignment (< ^ >), width, precision, type (d f x %), thousands separators (,).
  • Practice converting a poorly formatted print block into readable f-strings.

Best Practices

  • Logging: Prefer lazy formatting via logger methods (e.g., logger.info("user=%s id=%s", user, id)) or structured logs to avoid formatting cost when disabled.
  • Security: Never feed untrusted templates to format() or f-strings; avoid eval patterns.
  • i18n: Avoid concatenation; use placeholders compatible with translation tools.

Examples

from datetime import datetime
price = 1234.5
print(f"Price: ${price:,.2f}")
print("Hex: {:#x}".format(48879))
print(f"Now: {datetime(2024, 5, 17):%Y-%m-%d}")

Expected Output (approx):

Price: $1,234.50
Hex: 0xbeef
Now: 2024-05-17

Common Pitfalls

  • For f-strings, expressions are evaluated immediately—do not include expensive calls repeatedly inside f-strings in hot loops.
  • Be careful with %-formatting legacy style; prefer f-strings or str.format unless interacting with older code.
  • For Decimal, format with appropriate context to avoid float surprises.

Checks for Understanding

  1. How do you format a number with thousands separators and two decimals?
  2. When should you prefer logger parameterization over f-strings?
Show answers
  1. f"{n:,.2f}"
  2. To avoid formatting cost when the log level disables the message and to keep logs structured.

Exercises

  1. Print a table with columns aligned: name, quantity, price. Use width and alignment specifiers.
  2. Format a datetime as YYYY-MM-DD HH:MM and as ISO 8601.