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

相关推荐
宋小黑24 分钟前
JDK 6到25 全版本网盘合集 (Windows + Mac + Linux)
java·后端
念何架构之路33 分钟前
Go进阶之panic
开发语言·后端·golang
先跑起来再说36 分钟前
Git 入门到实战:一篇搞懂安装、命令、远程仓库与 IDEA 集成
ide·git·后端·elasticsearch·golang·intellij-idea
码农阿豪1 小时前
Flask应用上下文问题解析与解决方案:从错误日志到完美修复
后端·python·flask
威迪斯特1 小时前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
毕设源码-钟学长2 小时前
【开题答辩全过程】以 基于Springboot的扶贫众筹平台为例,包含答辩的问题和答案
java·spring boot·后端
程序员良许2 小时前
三极管推挽输出电路分析
后端·嵌入式
Java水解2 小时前
【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析
后端·spring
Java水解2 小时前
Spring Boot 4 升级指南:告别RestTemplate,拥抱现代HTTP客户端
spring boot·后端
宫水三叶的刷题日记3 小时前
工商银行今年的年终奖。。
后端