DEV Community

Cover image for Python String Formatting: From Basics to F-Strings
Aaron Rose
Aaron Rose

Posted on

Python String Formatting: From Basics to F-Strings

You've mastered accessing precise parts of your data with slicing. Now, let's learn how to seamlessly combine that data into clear, dynamic text. Whether you're generating reports, creating user messages, or logging output, string formatting is the key to turning raw data into readable information.

Python has evolved several ways to format strings, each more powerful than the last. We'll focus on the modern, recommended method: f-strings.


1. The Old Ways: A Quick Look

For context, it's helpful to know the older methods you might encounter in legacy code.

String Concatenation (The Basic but Messy Way):

name = "Alice"
age = 30
message = "Hello, " + name + ". You are " + str(age) + " years old."
print(message)  # Output: Hello, Alice. You are 30 years old.
Enter fullscreen mode Exit fullscreen mode

This gets cumbersome quickly and is prone to errors.

The .format() Method (The Flexible Way):

name = "Bob"
score = 95.5
message = "Hello, {}. Your score is {:.1f}%.".format(name, score)
print(message)  # Output: Hello, Bob. Your score is 95.5%.
Enter fullscreen mode Exit fullscreen mode

This is more readable than concatenation and allows for formatting (like the :.1f for one decimal place).

2. F-Strings: The Modern Pythonic Way (Python 3.6+)

F-strings (formatted string literals) are the fastest, most readable, and most concise way to format strings. Simply prefix your string with f or F and embed expressions and variables directly inside curly braces {}.

Basic Syntax:

name = "Charlie"
age = 25
message = f"Hello, {name}. You are {age} years old."
print(message)  # Output: Hello, Charlie. You are 25 years old.
Enter fullscreen mode Exit fullscreen mode

3. The Power of F-Strings: Expressions and Formatting

The real power of f-strings is that you can put any valid Python expression inside the curly braces.

Using Expressions:

price = 19.99
quantity = 3
total = f"Total: ${price * quantity:.2f}" # Calculate and format in one step
print(total)  # Output: Total: $59.97
Enter fullscreen mode Exit fullscreen mode

Formatting Numbers:
You can use format specifiers inside the braces to control the output.

import math

number = 1234.5678

print(f"Round to 2 decimals: {number:.2f}")    # Output: 1234.57
print(f"Percent: {0.255:.1%}")                 # Output: 25.5%
print(f"Hex: {255:#x}")                        # Output: 0xff
print(f"Pi: {math.pi:.3f}")                    # Output: 3.142
Enter fullscreen mode Exit fullscreen mode

4. Alignment and Padding

F-strings give you precise control over text alignment and width, which is perfect for creating clean tables or reports.

names = ["Alice", "Bob", "Charlie"]
scores = [95, 87, 100]

for name, score in zip(names, scores):
    # Left-align name in 10 spaces, right-align score in 5 spaces
    print(f"{name:<10} | {score:>5}")

# Output:
# Alice      |    95
# Bob        |    87
# Charlie    |   100
Enter fullscreen mode Exit fullscreen mode
  • :<10 left-aligns in a 10-character wide field.
  • :>5 right-aligns in a 5-character wide field.
  • :^10 would center the text.

5. Pro Tips: Debugging and Multi-Line Strings

F-strings have some incredible quality-of-life features.

Debugging with =:
The = specifier prints both the expression and its value, which is a huge time-saver for debugging.

x = 10
y = 25
print(f"{x=}, {y=}, {x + y=}") # Output: x=10, y=25, x+y=35
Enter fullscreen mode Exit fullscreen mode

Multi-Line F-Strings:
You can create complex, formatted blocks of text using triple quotes.

name = "Data Report"
value = 100
report = f"""
Report: {name}
===============
Value: {value:>10}
Status: {'OK' if value > 50 else 'Check'}
"""
print(report)
Enter fullscreen mode Exit fullscreen mode

6. F-Strings and Slicing: A Powerful Combo

Combine your new slicing skills with f-strings for powerful data presentation.

data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

# Show the first 3 and last 3 items in a readable way
summary = f"The data starts with {data[:3]} and ends with {data[-3:]}."
print(summary)
# Output: The data starts with [10, 20, 30] and ends with [80, 90, 100].
Enter fullscreen mode Exit fullscreen mode

Key Takeaways and Best Practices

  • Use f-strings for almost all string formatting in modern Python (3.6+). They are the most readable and efficient method.
  • You can embed expressions, function calls, and computations directly inside {}.
  • Use format specifiers (like :.2f) to control number formatting, alignment, and padding.
  • Use the = specifier for quick and easy debugging.
  • F-strings combine powerfully with other skills, like slicing, to create dynamic summaries of your data.

Mastering f-strings will make your code cleaner, more professional, and much easier to debug. It’s the final piece in the puzzle of transforming raw data into meaningful output.


Up Next: Now that we can skillfully manipulate and present data, let's learn how to save it for later. We'll explore File Handling in Python: Reading and Writing Data to persist your results beyond a single program run.


Aaron Rose is a software engineer and technology writer at tech-reader.blog and the author of Think Like a Genius.

Top comments (0)