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

📝 主旨内容

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

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

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

先说下%-formattingstr.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表达式。

相关推荐
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng1 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
paopaokaka_luck6 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
码农小旋风7 小时前
详解K8S--声明式API
后端
Peter_chq7 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml48 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~8 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616888 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
睡觉谁叫~~~9 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust