Python3.6+ f-Strings:更简洁高效的字符串格式化指南

Leo
Leo
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析Python 3.6引入的f-Strings增强型字符串格式化方法。通过对比传统的%-格式化和str.format(),展示f-String在可读性、执行效率及灵活性上的优势。内容涵盖单行与多行f-String写法、任意表达式求值、__str__与__repr__的使用及!r标识符技巧,帮助开发者掌握现代Python字符串处理的最佳实践。

Python 3.6版本引入了f-Strings这一全新的字符串格式化语法。它不仅让代码更加简洁易读,相比其他格式化方式更不容易出错,而且执行速度也更快。阅读完本文后,你将掌握f-Strings的使用方法及其背后的原理。在深入探讨之前,我们先回顾一下传统的字符串格式化方式。

1. 旧式字符串格式化

在Python 3.6发布之前,主要存在两种字符串格式化方式:%-格式化和str.format()。接下来我们将分别介绍这两种方式的具体用法及其局限性。

1.1 %-格式化

这是Python早期的官方字符串格式化方法,自语言诞生起便已存在。官方文档明确指出不推荐使用此方式,建议采用其他方法以避免潜在错误。

String对象内置了%操作符,用于执行字符串格式化,具体示例如下:


>>> name = "Eric"
>>> "Hello, %s." % name
'Hello, Eric.'

若需插入多个变量,则必须使用元组进行传递:


>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'

上述两个示例较为直观,但当参数增多且字符串变长时,代码可读性会显著下降。由于冗长的代码容易引发错误,因此官方不建议继续使用这种方式。

1.2. 使用 str.format()方法

这种较新的格式化方式自Python 2.6版本开始提供,是对%格式化的改进版。它通过常规的方法调用来实现字符串转换,内部依赖于类的__format__()方法。在字符串中,需要被替换的位置使用花括号进行标记。

以下是一个简单的示例:


>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'

此外,还可以通过索引方式引用变量:


>>> "Hello, {1}. You are {0}.".format(age, name)
'Hello, Eric. You are 74.'

然而,如果参数是变量名,而值对应的是对象属性,则需要在实际参数中显式传入该对象。


>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(name=person['name'], age=person['age'])
'Hello, Eric. You are 74.'

我们可以利用**操作符来简化字典的传递过程:


>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'

str.format()方式虽然对%格式化进行了有限升级,但仍非最优解。当传入多个参数时,代码依然显得冗余且易错。虽然可以通过.format(**some_dict)解包字典并使用键索引对应值,但存在更简便的处理方案。

2. 增强版字符串格式化方式 f-Strings

f-Strings能够解决上述问题,且使用简单、效率极高。该功能于2015年8月在Python 3.6版本中正式提供。f-Strings也被称为格式化字符串字面量,以f或F开头的字符串中,花括号内的变量会被替换。该表达式在运行时被求值,并使用__format__方法进行格式化。具体示例如下:


>>> name = "Eric"
>>> age = 74
>>> f"Hello, {name}. You are {age}."
'Hello, Eric. You are 74.'

与str.format()方法类似,但写法更为简洁。使用大写字符F同样可行:


>>> F"Hello, {name}. You are {age}."
'Hello, Eric. You are 74.'

2.1. 格式化任意表达式

由于f-string是在运行时进行求值,因此可以在花括号内放入任何有效的Python表达式,从而实现许多便捷的操作。


>>> f"{2 * 37}"
'74'

直接调用函数:


>>> def to_lowercase(input):
...  return input.lower()

>>> name = "Eric Idle"
>>> f"{to_lowercase(name)} is funny."
'eric idle is funny.'

或者直接调用对象方法:


>>> f"{name.lower()} is funny."
'eric idle is funny.'

当然,这同样适用于自定义类。假设我们定义了如下类:


class Comedian:
 def __init__(self, first_name, last_name, age):
  self.first_name = first_name
  self.last_name = last_name
  self.age = age

 def __str__(self):
  return f"{self.first_name} {self.last_name} is {self.age}."

 def __repr__(self):
  return f"{self.first_name} {self.last_name} is {self.age}. Surprise!"

调用该类方法的代码如下:


>>> new_comedian = Comedian("Eric", "Idle", "74")
>>> f"{new_comedian}"
'Eric Idle is 74.'

str()和repr()方法用于实现对象的字符串表示。因此,在定义类时,确保至少包含其中一个方法。若需二选一,推荐选择__repr__(),因为在使用__str__()的地方通常也可以使用__repr__()。

由__str__()返回的字符串是对象的非正式字符串表示,应当具备可读性。而由__repr__()返回的字符串是官方表示,应当明确(外层多包含引号,长度通常为原长度加2)。直接调用str()和repr()比直接使用__str__()和__repr__()更为稳妥。

默认情况下使用str函数,但可以使用!r标识符明确调用repr:


>>> f"{new_comedian}"
'Eric Idle is 74.'
>>> f"{new_comedian!r}"
'Eric Idle is 74. Surprise!'

2.2. 多行f-strings

我们可以对多行字符串进行格式化:


>>> name = "Eric"
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> message = (
...  f"Hi {name}. "
...  f"You are a {profession}. "
...  f"You were in {affiliation}."
... )
>>> message
'Hi Eric. You are a comedian. You were in Monty Python.'

但需要在每一行前面都加上f前缀。以下代码无法正常工作:


>>> message = (
...  f"Hi {name}. "
...  "You are a {profession}. "
...  "You were in {affiliation}."
... )
>>> message
'Hi Eric. You are a {profession}. You were in {affiliation}.'

我们可以看到,没有f前缀的行未被解析。

对于多行字符串,我们也可以使用反斜杠进行换行处理:


>>> message = f"Hi {name}. " \
...   f"You are a {profession}. " \
...   f"You were in {affiliation}."
...
>>> message
'Hi Eric. You are a comedian. You were in Monty Python.'

那么如何使用三个双引号(""")来处理呢:


>>> message = f"""
...  Hi {name}. 
...  You are a {profession}. 
...  You were in {affiliation}.
... """
...
>>> message
'\n Hi Eric.\n You are a comedian.\n You were in Monty Python.\n'

3. 总结

本文介绍了Python 3.6提供的增强型字符串格式化方法。通过与前两种旧式方法的对比,可以看出f-string在简洁性和易读性上具有明显优势。

至此,关于Python3中f-Strings增强版字符串格式化方法的介绍到此结束。如需了解更多Python格式化字符串f-string的相关内容,请搜索本站历史文章或继续浏览后续文章。希望大家今后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。