python3.6 的三种字符串处理,formatting、str.format()、f-string

2 阅读4分钟

📝 主旨内容

在Python 3.6之前,有两种将Python表达式嵌入到字符串文本中进行格式化的主要方法:%-formattingstr.format()

从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快!

在后文中f-string被称为F字符串。

先说下%-formattingstr.format() 的使用,以及它们的局限性。

1️⃣ %-formatting 方法

%-formatting是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()来格式化字符串。

name = "Ber"
age = 18
print("Hello, {}. You are {}.".format(name, age))

# Hello, Ber. You are 18.

默认规则是顺序索引嵌入字符串,也可以通过索引改变嵌入字符串的次序。

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()引用参数。

name = "Ber"
age = 18
print("Hello, {name}. You are {age}.".format(age=age, name=name))

# Hello, Ber. You are 18. 

如果采用字典定义,则可以通过**来实现参数引用。

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()

name = "Ber"
age = 18
print(f"Hello, {name}. You are {age}.")

# Hello, Ber. You are 18. 

f 改为 F 也是生效的。

由于f字符串是在运行时进行渲染的,因此可以将任何有效的Python表达式放入其中。如计算、函数调用,甚至可以创建对象。

name = "Ber"
age = 18
print(f"Hello, {name.lower()}. You are {age+1}.")

# Hello, ber. You are 19. 
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 __()方法来表示对象。

多行文字可以使用三重引号"""来表示,这种表示方法使得可以跨越多行书写较长的文本内容,方便阅读和管理。

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表达式。