📝 主旨内容
在Python 3.6之前,有两种将Python表达式嵌入到字符串文本中进行格式化的主要方法:%-formatting
和str.format()
。
从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快!
在后文中f-string被称为F字符串。
先说下%-formatting
和str.format()
的使用,以及它们的局限性。
1️⃣ %-formatting
方法
%-formatting
是Python早期的一种格式化字符串的方法,使用起来繁琐且容易出错,如无法正确显示元组和字典的情况。
python
name = "Ber"
age = 18
print("Hello, %s. You are %s." % (name, age))
# Hello, Ber. You are 18.
如果需要使用的参数过多,代码就变得不易阅读了,甚至感觉凌乱。并且这种方式不支持元组或字典。
2️⃣ str.format()
方法
str.format()
方法是对%-formatting
的改进,是python2.6引入的,能够更灵活地处理字符串格式化,并且支持索引、命名参数等功能,使用正常的函数调用语法,可以通过对要转换为字符串的对象的__format __()
方法进行扩展。
我们通过如下示例演示了如何使用str.format()
来格式化字符串。
python
name = "Ber"
age = 18
print("Hello, {}. You are {}.".format(name, age))
# Hello, Ber. You are 18.
默认规则是顺序索引嵌入字符串,也可以通过索引改变嵌入字符串的次序。
python
name = "Ber"
age = 18
print("Hello, {1}. You are {0}. Your sister is {0}.".format(age, name))
# Hello, Ber. You are 18. Your sister is 18.
将索引改为变量名也是可以的,但必须在format()引用参数。
python
name = "Ber"
age = 18
print("Hello, {name}. You are {age}.".format(age=age, name=name))
# Hello, Ber. You are 18.
如果采用字典定义,则可以通过**
来实现参数引用。
python
person = {
name : "Ber",
age : 18
}
print("Hello, {name}. You are {age}.".format(**person))
# Hello, Ber. You are 18.
3️⃣ f-string
方法
f-string
方法也可以称为格式化字符串,F字符串是开头有一个f的字符串文字,以及包含表达式的大括号将被其值替换。表达式在运行时进行渲染,然后使用__format__
协议进行格式化。
语法与str.format()
使用的语法类似,但不需要结尾补充.format()
。
ini
name = "Ber"
age = 18
print(f"Hello, {name}. You are {age}.")
# Hello, Ber. You are 18.
f
改为 F
也是生效的。
由于f字符串是在运行时进行渲染的,因此可以将任何有效的Python表达式放入其中。如计算、函数调用,甚至可以创建对象。
python
name = "Ber"
age = 18
print(f"Hello, {name.lower()}. You are {age+1}.")
# Hello, ber. You are 19.
python
class User:
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_user = User("Ber", "Pai", "18")
print(f"{new_user}")
print(f"{new_user!r}")
# Ber Pai is 18.
# Ber Pai is 18. Surprise!
__str __()
和__repr __()
方法在Python中用于定义对象如何呈现为字符串形式。在类定义中,至少应该包含其中一个方法。如果只能选择一个,建议使用__repr __()
,因为它可以替代__str __()
方法。
-
__str __()
方法返回的字符串应该是对象的非正式表示形式,通常更易读。它用于提供对象的人类可读版本。 -
__repr __()
方法返回的字符串应该是对象的官方表示形式,更加明确。它用于提供对象的机器可读版本。调用str()
和repr()
函数比直接使用__str __()
和__repr __()
方法更好,因为能够获得更加标准化的输出。
在f-string中,默认情况下会使用__str __()
方法来格式化对象,但如果在f-string中使用转换标志!r
,则会强制使用__repr __()
方法来表示对象。
多行文字可以使用三重引号"""
来表示,这种表示方法使得可以跨越多行书写较长的文本内容,方便阅读和管理。
python
message = f"""
Hi {name}.
You are {age}.
Your sister is {age}.
"""
# \n Hi Ber. \n You are 18. \n Your sister is 18.\n
注意
在使用F字符串需要注意:
1.如果在字典键周围使用与在F字符串外部使用相同类型的引号,则第一个字典键开头的引号将被解释为字符串的结尾。
2.如果字符串本身有大括号 ,为了使字符串出现大括号,必须使用双大括号。
3.F字符串可以使用反斜杠转义符,但是不能在F字符串的表达式部分中使用。
4.lambda表达式,如果
!
:
}
不在括号中,会被解释为表达式结尾,需要在()
中定义lambda表达式。