普通视图
Python f-Strings: String Formatting in Python 3
f-strings, short for formatted string literals, are the most concise and readable way to format strings in Python. Introduced in Python 3.6, they let you embed variables and expressions directly inside a string by prefixing it with f or F.
This guide explains how to use f-strings in Python, including expressions, format specifiers, number formatting, alignment, and the debugging shorthand introduced in Python 3.8.
Basic Syntax
An f-string is a string literal prefixed with f. Any expression inside curly braces {} is evaluated at runtime and its result is inserted into the string:
name = "Leia"
age = 30
print(f"My name is {name} and I am {age} years old.")My name is Leia and I am 30 years old.
Any valid Python expression can appear inside the braces — variables, attribute access, method calls, or arithmetic:
price = 49.99
quantity = 3
print(f"Total: {price * quantity}")Total: 149.97
Expressions Inside f-Strings
You can call methods and functions directly inside the braces:
name = "alice"
print(f"Hello, {name.upper()}!")Hello, ALICE!
Ternary expressions work as well:
age = 20
print(f"Status: {'adult' if age >= 18 else 'minor'}")Status: adult
You can also access dictionary keys and list items:
user = {"name": "Bob", "city": "Berlin"}
print(f"{user['name']} lives in {user['city']}.")Bob lives in Berlin.
Escaping Braces
To include a literal curly brace in an f-string, double it:
value = 42
print(f"{{value}} = {value}"){value} = 42
Multiline f-Strings
To build a multiline f-string, wrap it in triple quotes:
name = "Leia"
age = 30
message = f"""
Name: {name}
Age: {age}
"""
print(message)Name: Leia
Age: 30
Alternatively, use implicit string concatenation to keep each line short:
message = (
f"Name: {name}\n"
f"Age: {age}"
)Format Specifiers
f-strings support Python’s format specification mini-language. The full syntax is:
{value:[fill][align][sign][width][grouping][.precision][type]}Floats and Precision
Control the number of decimal places with :.Nf:
pi = 3.14159265
print(f"{pi:.2f}")
print(f"{pi:.4f}")3.14
3.1416
Thousands Separator
Use , to add a thousands separator:
population = 1_234_567
print(f"{population:,}")1,234,567
Percentage
Use :.N% to format a value as a percentage:
score = 0.875
print(f"Score: {score:.1%}")Score: 87.5%
Scientific Notation
Use :e for scientific notation:
distance = 149_600_000
print(f"{distance:e}")1.496000e+08
Alignment and Padding
Use <, >, and ^ to align text within a fixed width. Optionally specify a fill character before the alignment symbol:
print(f"{'left':<10}|")
print(f"{'right':>10}|")
print(f"{'center':^10}|")
print(f"{'padded':*^10}|")left |
right|
center |
**padded**|
Number Bases
Convert integers to binary, octal, or hexadecimal with the b, o, x, and X type codes:
n = 255
print(f"Binary: {n:b}")
print(f"Octal: {n:o}")
print(f"Hex (lower): {n:x}")
print(f"Hex (upper): {n:X}")Binary: 11111111
Octal: 377
Hex (lower): ff
Hex (upper): FF
Debugging with =
Python 3.8 introduced the = shorthand, which prints both the expression and its value. This is useful for quick debugging:
x = 42
items = [1, 2, 3]
print(f"{x=}")
print(f"{len(items)=}")x=42
len(items)=3
The = shorthand preserves the exact expression text, making it more informative than a plain print().
Quick Reference
| Syntax | Description |
|---|---|
f"{var}" |
Insert a variable |
f"{expr}" |
Insert any expression |
f"{val:.2f}" |
Float with 2 decimal places |
f"{val:,}" |
Integer with thousands separator |
f"{val:.1%}" |
Percentage with 1 decimal place |
f"{val:e}" |
Scientific notation |
f"{val:<10}" |
Left-align in 10 characters |
f"{val:>10}" |
Right-align in 10 characters |
f"{val:^10}" |
Center in 10 characters |
f"{val:*^10}" |
Center with * fill |
f"{val:b}" |
Binary |
f"{val:x}" |
Hexadecimal (lowercase) |
f"{val=}" |
Debug: print expression and value (3.8+) |
FAQ
What Python version do f-strings require?
f-strings were introduced in Python 3.6. If you are on Python 3.5 or earlier, use str.format() or % formatting instead.
What is the difference between f-strings and str.format()?
f-strings are evaluated at runtime and embed expressions inline. str.format() uses positional or keyword placeholders and is slightly more verbose. f-strings are generally faster and easier to read for straightforward formatting.
Can I use quotes inside an f-string expression?
Yes, but you must use a different quote type from the one wrapping the f-string. For example, if the f-string uses double quotes, use single quotes inside the braces: f"Hello, {user['name']}". In Python 3.12 and later, the same quote type can be reused inside the braces.
Can I use f-strings with multiline expressions?
Expressions inside {} cannot contain backslashes directly, but you can pre-compute the value in a variable first and reference that variable in the f-string.
Are f-strings faster than % formatting?
In many common cases, f-strings are faster than % formatting and str.format(), while also being easier to read. Exact performance depends on the expression and Python version, so readability is usually the more important reason to prefer them.
Conclusion
f-strings are the preferred way to format strings in Python 3.6 and later. They are concise, readable, and support the full format specification mini-language for controlling number precision, alignment, and type conversion. For related string operations, see Python String Replace and How to Split a String in Python .
![]()
Python Virtual Environments: venv and virtualenv
A Python virtual environment is a self-contained directory that includes its own Python interpreter and a set of installed packages, isolated from the system-wide Python installation. Using virtual environments lets each project maintain its own dependencies without affecting other projects on the same machine.
This guide explains how to create and manage virtual environments using venv (built into Python 3) and virtualenv (a popular third-party alternative) on Linux and macOS.
Quick Reference
| Task | Command |
|---|---|
| Install venv support (Ubuntu, Debian) | sudo apt install python3-venv |
| Create environment | python3 -m venv venv |
| Activate (Linux / macOS) | source venv/bin/activate |
| Deactivate | deactivate |
| Install a package | pip install package-name |
| Install specific version | pip install package==1.2.3 |
| List installed packages | pip list |
| Save dependencies | pip freeze > requirements.txt |
| Install from requirements file | pip install -r requirements.txt |
| Create with specific Python version | python3.11 -m venv venv |
| Install virtualenv | pip install virtualenv |
| Delete environment | rm -rf venv |
What Is a Python Virtual Environment?
When you install a package globally with pip install, it is available to every Python script on the system. This becomes a problem when two projects need different versions of the same library — for example, one requires requests==2.28.0 and another requires requests==2.31.0. Installing both globally is not possible.
A virtual environment solves this by giving each project its own isolated space for packages. Activating an environment prepends its bin/ directory to your PATH, so python and pip resolve to the versions inside the environment rather than the system-wide ones.
Installing venv
The venv module ships with Python 3 and requires no separate installation on most systems. On Ubuntu and Debian, the module is packaged separately:
sudo apt install python3-venvOn Fedora, RHEL, and Derivatives, venv is included with the Python package by default.
Verify your Python version before creating an environment:
python3 --versionFor more on checking your Python installation, see How to Check Python Version .
Creating a Virtual Environment
Navigate to your project directory and run:
python3 -m venv venvThe second venv is the name of the directory that will be created. The conventional names are venv or .venv. The directory contains a copy of the Python binary, pip, and the standard library.
To create the environment in a specific location rather than the current directory:
python3 -m venv ~/projects/myproject/venvActivating the Virtual Environment
Before using the environment, you need to activate it.
On Linux and macOS:
source venv/bin/activateOnce activated, your shell prompt changes to show the environment name:
(venv) user@host:~/myproject$
From this point on, python and pip refer to the versions inside the virtual environment, not the system-wide ones.
To deactivate the environment and return to the system Python:
deactivateInstalling Packages
With the environment active, install packages using pip as you normally would. If pip is not installed on your system, see How to Install Python Pip on Ubuntu
.
pip install requestsTo install a specific version:
pip install requests==2.31.0To list all packages installed in the current environment:
pip listPackages installed here are completely isolated from the system and from other virtual environments.
Managing Dependencies with requirements.txt
Sharing a project with others, or deploying it to another machine, requires a way to reproduce the same package versions. The convention is to save all dependencies to a requirements.txt file:
pip freeze > requirements.txtThe file lists every installed package and its exact version:
certifi==2024.2.2
charset-normalizer==3.3.2
idna==3.6
requests==2.31.0
urllib3==2.2.1
To install all packages from the file in a fresh environment:
pip install -r requirements.txtThis is the standard workflow for reproducing an environment on a different machine or in a CI/CD pipeline.
Using a Specific Python Version
By default, python3 -m venv uses whichever Python 3 version is the system default. If you have multiple Python versions installed, you can specify which one to use:
python3.11 -m venv venvThis creates an environment based on Python 3.11 regardless of the system default. To check which versions are available :
python3 --version
python3.11 --versionvirtualenv: An Alternative to venv
virtualenv is a third-party package that predates venv and offers a few additional features. Install it with pip:
pip install virtualenvCreating and activating an environment with virtualenv follows the same pattern:
virtualenv venv
source venv/bin/activateTo use a specific Python interpreter:
virtualenv -p python3.11 venvWhen to use virtualenv over venv:
- You need to create environments faster —
virtualenvis significantly faster on large projects. - You are working with Python 2 (legacy codebases only).
- You need features like
--copiesto copy binaries instead of symlinking.
For most modern Python 3 projects, venv is sufficient and has the advantage of requiring no installation.
Excluding the Environment from Version Control
The virtual environment directory should never be committed to version control. It is large, machine-specific, and fully reproducible from requirements.txt. Add it to your .gitignore:
echo "venv/" >> .gitignoreIf you named your environment .venv instead, add .venv/ to .gitignore.
Troubleshooting
python3 -m venv venv fails with “No module named venv”
On Ubuntu and Debian, the venv module is not included in the base Python package. Install it with sudo apt install python3-venv, then retry.
pip install installs packages globally instead of into the environment
The environment is not activated. Run source venv/bin/activate first. You can verify by checking which pip — it should point to a path inside your venv/ directory.
“command not found: python” after activating the environment
The environment uses python3 as the binary name if it was created with python3 -m venv. Use python3 explicitly, or check which python and which python3 inside the active environment.
The environment breaks after moving or renaming its directory
Virtual environments contain hardcoded absolute paths to the Python interpreter. Moving or renaming the directory invalidates those paths. Delete the directory and recreate the environment in the new location, then reinstall from requirements.txt.
FAQ
What is the difference between venv and virtualenv?venv is a standard library module included with Python 3 — no installation needed. virtualenv is a third-party package with a longer history, faster environment creation, and Python 2 support. For new Python 3 projects, venv is the recommended choice.
Should I commit the virtual environment to git?
No. Add venv/ (or .venv/) to your .gitignore and commit only requirements.txt. Anyone checking out the project can recreate the environment with pip install -r requirements.txt.
Do I need a virtual environment for every project?
It is strongly recommended. Without isolated environments, installing or upgrading a package for one project can break another. The overhead of creating a virtual environment is minimal.
What is the difference between pip freeze and pip list?pip list shows installed packages in a human-readable format. pip freeze outputs them in requirements.txt format (package==version) suitable for use with pip install -r.
Can I use a virtual environment with a different Python version than the system default?
Yes. Pass the path to the desired interpreter when creating the environment: python3.11 -m venv venv. The environment will use that interpreter for both python and pip commands.
Conclusion
Virtual environments are the standard way to manage Python project dependencies. Create one with python3 -m venv venv, activate it with source venv/bin/activate, and use pip freeze > requirements.txt to capture your dependencies. For more on managing Python installations, see How to Check Python Version
.
![]()
HelloGitHub 第 119 期
Python Switch Case Statement (match-case)
Unlike many other programming languages, Python does not have a traditional switch-case statement. Before Python 3.10, developers used if-elif-else chains or dictionary lookups to achieve similar functionality.
Python 3.10 introduced the match-case statement (also called structural pattern matching), which provides a cleaner way to handle multiple conditions.
This article explains how to implement switch-case behavior in Python using all three approaches with practical examples.
Using if-elif-else
The if-elif-else chain is the most straightforward way to handle multiple conditions. It works in all Python versions and is best suited for a small number of conditions.
Here is an example:
def get_day_type(day):
if day == "Saturday" or day == "Sunday":
return "Weekend"
elif day == "Monday":
return "Start of the work week"
elif day == "Friday":
return "End of the work week"
else:
return "Midweek"
print(get_day_type("Saturday"))
print(get_day_type("Monday"))
print(get_day_type("Wednesday"))Weekend
Start of the work week
Midweek
The function checks each condition in order. When a match is found, it returns the result and stops. If none of the conditions match, the else block runs.
This approach is easy to read and debug, but it gets verbose when you have many conditions.
Using Dictionary Lookup
A dictionary
can map values to results or functions, acting as a lookup table. This approach is more concise than if-elif-else when you have many simple mappings.
In the following example, we are using a dictionary to map HTTP status codes to their descriptions:
def http_status(code):
statuses = {
200: "OK",
301: "Moved Permanently",
404: "Not Found",
500: "Internal Server Error",
}
return statuses.get(code, "Unknown Status")
print(http_status(200))
print(http_status(404))
print(http_status(999))OK
Not Found
Unknown Status
The get() method returns the value for the given key. If the key is not found, it returns the default value ("Unknown Status").
You can also map keys to functions. In the code below, we are creating a simple calculator using a dictionary of functions:
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
operations = {
"+": add,
"-": subtract,
"*": multiply,
}
func = operations.get("+")
print(func(10, 5))15
Dictionary lookups are fast and scale well, but they cannot handle complex conditions like ranges or pattern matching.
Using match-case (Python 3.10+)
The match-case statement was introduced in Python 3.10
. It compares a value against a series of patterns and executes the matching block.
The match-case statement takes the following form:
match expression:
case pattern1:
statements
case pattern2:
statements
case _:
default statementsThe match keyword is followed by the expression to evaluate. Each case defines a pattern to match against. The case _ is the wildcard (default) case that matches any value not matched by previous patterns, similar to default in other languages.
Here is a basic example:
def http_error(status):
match status:
case 400:
return "Bad Request"
case 401 | 403:
return "Not Allowed"
case 404:
return "Not Found"
case _:
return "Unknown Error"
print(http_error(403))
print(http_error(404))
print(http_error(999))Not Allowed
Not Found
Unknown Error
You can combine multiple values in a single case using the | (or) operator, as shown with 401 | 403.
Let’s look at the different pattern matching capabilities of the match-case statement.
Matching with Variables
You can capture values from the matched expression and use them in the case block. In the following example, we are matching a tuple representing a point on a coordinate plane:
point = (3, 7)
match point:
case (0, 0):
print("Origin")
case (x, 0):
print(f"On x-axis at {x}")
case (0, y):
print(f"On y-axis at {y}")
case (x, y):
print(f"Point at ({x}, {y})")Point at (3, 7)
The variables x and y are assigned the values from the tuple when the pattern matches.
Matching with Guards
You can add an if condition (called a guard) to a case pattern for more precise matching:
def classify_age(age):
match age:
case n if n < 0:
return "Invalid"
case n if n < 18:
return "Minor"
case n if n < 65:
return "Adult"
case _:
return "Senior"
print(classify_age(10))
print(classify_age(30))
print(classify_age(70))Minor
Adult
Senior
The guard (if n < 18) adds an extra condition that must be true for the case to match.
Matching Dictionaries
The match-case statement can match against dictionary structures, which is useful when working with JSON data or API responses:
def process_command(command):
match command:
case {"action": "create", "name": name}:
print(f"Creating {name}")
case {"action": "delete", "name": name}:
print(f"Deleting {name}")
case {"action": action}:
print(f"Unknown action: {action}")
process_command({"action": "create", "name": "users"})
process_command({"action": "delete", "name": "logs"})
process_command({"action": "update"})Creating users
Deleting logs
Unknown action: update
The pattern only needs to match the specified keys. Extra keys in the dictionary are ignored.
Which Approach to Use
| Approach | Best For | Python Version |
|---|---|---|
if-elif-else |
Few conditions, complex boolean logic | All versions |
| Dictionary lookup | Many simple value-to-value mappings | All versions |
match-case |
Pattern matching, destructuring, complex data | 3.10+ |
Use if-elif-else when you have a handful of conditions or need complex boolean expressions. Use dictionary lookups when you are mapping values directly. Use match-case when you need to match against data structures, capture variables, or use guard conditions.
Quick Reference
# if-elif-else
if x == 1:
result = "one"
elif x == 2:
result = "two"
else:
result = "other"
# Dictionary lookup
result = {1: "one", 2: "two"}.get(x, "other")
# match-case (Python 3.10+)
match x:
case 1:
result = "one"
case 2:
result = "two"
case _:
result = "other"FAQ
Does Python have a switch statement?
Not a traditional one. Python uses if-elif-else chains, dictionary lookups, or the match-case statement (Python 3.10+) to achieve similar functionality.
What Python version do I need for match-case?
Python 3.10 or later. If you need to support older versions, use if-elif-else or dictionary lookups instead.
Is match-case faster than if-elif-else?
For most use cases the performance difference is negligible. Choose based on readability and the complexity of your conditions, not speed. Dictionary lookups are often the fastest for simple value mappings.
What happens if no case matches and there is no wildcard?
Nothing. If no pattern matches and there is no case _, the match statement completes without executing any block. No error is raised.
Can I use match-case with classes?
Yes. You can match against class instances using the case ClassName(attr=value) syntax. This is useful for handling different object types in a clean way.
Conclusion
Python does not have a built-in switch statement, but offers three alternatives. Use if-elif-else for simple conditions, dictionary lookups for direct value mappings, and match-case for pattern matching on complex data structures.
For more Python tutorials, see our guides on for loops , while loops , and dictionaries .
If you have any questions, feel free to leave a comment below.
![]()
How to Install Python on Ubuntu 24.04
Python is one of the most popular programming languages. It is used to build all kinds of applications, from simple scripts to complex machine-learning systems. With its straightforward syntax, Python is a good choice for both beginners and experienced developers.
Ubuntu 24.04 ships with Python 3.12 preinstalled. To check the version on your system:
python3 --versionPython 3.12.3
If you need a newer Python version such as 3.13 or 3.14, you can install it from the deadsnakes PPA or build it from source. Both methods install the new version alongside the system Python without replacing it. This guide shows how to install Python on Ubuntu 24.04 using both approaches.
Quick Reference
| Task | Command |
|---|---|
| Check installed Python version | python3 --version |
| Add deadsnakes PPA | sudo add-apt-repository ppa:deadsnakes/ppa |
| Install Python 3.13 from PPA | sudo apt install python3.13 |
| Install Python 3.14 from PPA | sudo apt install python3.14 |
| Install venv module | sudo apt install python3.13-venv |
| Build from source (configure) | ./configure --enable-optimizations |
| Build from source (compile) | make -j $(nproc) |
| Install from source | sudo make altinstall |
| Create a virtual environment | python3.13 -m venv myproject |
| Activate virtual environment | source myproject/bin/activate |
| Deactivate virtual environment | deactivate |
Installing Python from the Deadsnakes PPA
The deadsnakes PPA provides newer Python versions packaged for Ubuntu. This is the easiest way to install a different Python version.
-
Install the prerequisites and add the PPA:
Terminal sudo apt update sudo apt install software-properties-common sudo add-apt-repository ppa:deadsnakes/ppaPress
Enterwhen prompted to confirm. -
Install Python 3.13:
Terminal sudo apt update sudo apt install python3.13To install Python 3.14 instead, replace
python3.13withpython3.14in the command above. -
Verify the installation:
Terminal python3.13 --versionoutput Python 3.13.11You can also confirm the binary location:
Terminal which python3.13 -
Install the
venvmodule (needed for creating virtual environments):Terminal sudo apt install python3.13-venv -
If you need
pip, install thevenvpackage and create a virtual environment, then usepipinside the venv:Terminal python3.13 -m venv myproject source myproject/bin/activate python -m pip install --upgrade pipIf you need a system-level
pipfor that interpreter, run:Terminal python3.13 -m ensurepip --upgrade
python3 still points to Python 3.12. To use the newly installed version, run python3.13 or python3.14 explicitly.Installing Python from Source
Compiling Python from source allows you to install any version and customize the build options. However, you will not be able to manage the installation through the apt
package manager.
The following steps show how to compile Python 3.13. If you are installing a different version, replace the version number in the commands below.
-
Install the libraries and dependencies required to build Python:
Terminal sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev liblzma-dev -
Download the source code from the Python download page using
wget:Terminal wget https://www.python.org/ftp/python/3.13.11/Python-3.13.11.tgz -
Terminal tar -xf Python-3.13.11.tgz -
Navigate to the source directory and run the
configurescript:Terminal cd Python-3.13.11 ./configure --enable-optimizationsThe
--enable-optimizationsflag runs profile-guided optimization tests, which makes the build slower but produces a faster Python binary. -
Start the build process:
Terminal make -j $(nproc)The
-j $(nproc)option uses all available CPU cores for a faster build. -
Install the Python binaries using
altinstall. Do not useinstall, as it overwrites the systempython3binary and can break system tools that depend on it:Terminal sudo make altinstall -
Verify the installation:
Terminal python3.13 --versionoutput Python 3.13.11
Setting Up a Virtual Environment
After installing a new Python version, create a virtual environment for your project to keep dependencies isolated:
python3.13 -m venv myprojectActivate the virtual environment:
source myproject/bin/activateYour shell prompt will change to show the environment name. Inside the virtual environment, python and pip point to the version you used to create it.
To deactivate the virtual environment:
deactivateFor more details, see our guide on how to create Python virtual environments .
Uninstalling the PPA Version (Optional)
To remove the PPA version:
sudo apt remove python3.13 python3.13-venvTo remove the PPA itself:
sudo add-apt-repository --remove ppa:deadsnakes/ppaFAQ
Should I use the PPA or build from source?
The deadsnakes PPA is the recommended method for most users. It is easier to install, receives security updates through apt, and does not require build tools. Build from source only if you need a custom build configuration or a version not available in the PPA.
Will installing a new Python version break my system?
No. Both methods install the new version alongside the system Python 3.12. The system python3 command is not affected. You access the new version with python3.13 or python3.14.
How do I make the new Python version the default?
You can use update-alternatives to configure it, but this is not recommended. Many Ubuntu system tools depend on the default python3 being the version that shipped with the OS. Use virtual environments instead.
How do I install pip for the new Python version?
The recommended approach is to use a virtual environment. Install python3.13-venv, create a venv, and use pip inside it. If you need a system-level pip for that interpreter, run python3.13 -m ensurepip --upgrade.
What is the difference between install and altinstall when building from source?altinstall installs the binary as python3.13 without creating a python3 symlink. install creates the symlink, which overwrites the system Python and can break Ubuntu system tools.
Does Ubuntu 24.04 include pip by default?
Ubuntu 24.04 includes Python 3.12 but does not include pip in the base installation. Install it with sudo apt install python3-pip. For newer Python versions, use python3.13 -m pip inside a virtual environment.
Conclusion
Ubuntu 24.04 ships with Python 3.12. To install a newer version, use the deadsnakes PPA for a simple apt-based installation, or build from source for full control over the build. Use virtual environments to manage project dependencies without affecting the system Python.
For more on Python package management, see our guide on how to use pip .
If you have any questions, feel free to leave a comment below.
![]()