中传入字符串_Python编程思想:格式化字符串

李宁老师已经在「极客起源」 微信公众号推出《Python编程思想》电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法。读者可以在「极客起源」 公众号中输入 160442 开始学习,或点击「极客起源」公众号下方的「编程思想」 >  「Python编程思想------------正文----------前面讲的字符串都是静态的,也就是说,一旦指定一个字符串,就固定不变了。但在很多场景下,需要替换字符串中的某一部分。当然,要实现这种操作最简单的方式就是使用字符串连接,不过这太麻烦。在Python中为了解决这个问题,提供了各种格式化字符串的方式。所谓格式化字符串,其实就是在字符串中包含一些占位符,然后用另外一些字符串来替换这些占位符。本文将介绍Python中常用的字符串格式化方法。字符串格式化相当于字符串模板。也就是说,如果一个字符串有一部分是固定的,而另一部分是动态变化的,那么就可以将固定的部分做成模板,然后那些动态变化的部分使用字符串格式化操作符(%)替换。如一句问候语:“Hello 李宁”,其中“Hello”是固定的,但“李宁”可能变成任何一个人的名字,如“乔布斯”,所以在这个字符串中,“Hello”是固定的部分,而“李宁”是动态变化的部分,因此,需要用“%”操作符替换“李宁”,这样就形成了一个模板。
Hello %s
上面的代码中,“%”后面的s是什么呢?其实字符串格式化操作符后面需要跟着动态值的数据类型,以及更细节的格式(如对于浮点数来说,小数点后要保留几位),这里的“%s”表示动态部分要被替换成字符串类型的值。如果在字符串模板中有多个要被替换的部分,需要按顺序用“%”表示,然后在格式化字符串时,传入的值也要符合这个顺序。下面的例子演示了格式化字符串的基本用法。

示例代码:基本的格式化字符串方法.py

#  定义字符串模板formatStr = "Hello %s. Today is %s, Are there any activities today?"#  初始化字符串格式化参数值,此处必须使用元组,不能使用列表values = ('Mike', 'Wednesday')# Hello Mike. Today is Wednesday, Are there any activities today?print(formatStr % values)  # 格式化字符串
从上面的代码可以看出,不仅在为字符串模板指定格式化参数时要使用百分号(%),在格式化字符串时,也要像取模一样使用“%”操作符。还有就是指定字符串格式化参数值要使用元组,在这里不能使用列表。在上面的例子中,只是使用了字符串作为格式化参数,但在实际的应用中,可能会有其他类型的字符串格式化参数。如果遇到这种情况,可以使用str函数将这些数据类型的值转换为字符串类型的值,然后再传入字符串模板,这么做在大多数情况下是可行的,但如果要对格式化参数值有更进一步的要求,光使用str函数就做不到了,这就要使用能表示这些数据类型的格式化参数,如“%f”表示浮点类型的格式化参数。

示例代码:用各种类型的值格式化字符串.py

# 在这个字符串模板中,包含了浮点数和整数类型的格式化参数formatStr1 = "PI是圆周率,他的值是%.4f(保留小数点后%d位)"#  导入math模块中的pi变量from math import pi#  定义与formatStr1对应的格式化参数值values1 = (pi, 4)#  格式化字符串,运行结果:PI是圆周率,他的值是3.1416(保留小数点后4位)#  PI是圆周率,他的值是3.1416(保留小数点后4位)print(formatStr1 % values1)#  在这个字符串模板中,包含了整数和字符串类型的格式化参数formatStr2 = "这件事的成功率是%d%%, 如果有%s参与的话,成功率会提升至%d%%"values2 = (56, "John",70)# 运行结果:这件事的成功率是56%, 如果有John参与的话,成功率会提升至70%# 这件事的成功率是56%, 如果有John参与的话,成功率会提升至70%print(formatStr2 % values2)values3 = (66,"Mike")#  由于指定的参数值的数量和格式化参数的数量不匹配,所以会抛出异常# print(formatStr2 % values3)
在上面的代码中,为格式化字符串指定了不同数据类型的格式化参数。如果要在格式化字符串中显示百分号(%),就要使用两个百分号(%%)表示。当传入的参数值的数量与格式化参数的数量不匹配时,就会抛出异常。

2. 模板字符串

在string模块中提供了一个用于格式化字符串的Template类,该类的功能是用同一个值替换所有相同的格式化参数。Template类的格式化参数用美元符号($)开头,后面跟着格式化参数名称,相当于变量名。在格式化时,需要使用Template类的substitute方法,该方法用于指定格式化参数对应的值。
from string import Templatetemplate = Template("$s  $s  $s ")template.substitute(s = "Hello")
在上面的代码中,通过Template类的构造方法传入了一个格式化字符串,在这个格式化字符串中包含了3个“$s”,然后调用了substitute方法格式化这个字符串,该方法指定了s参数值为“Hello”,最后的替换结果是“Hello Hello Hello”,也就是说,在格式化字符串中,有多少个“$s”,就替换多少个“$s”。substitute方法还可以通过字典(见下一章)设置格式化参数的值。下面的例子完整地演示了如何使用Template类格式化字符串。

示例代码:模板字符串.py

# 引用string模块中的Template类from string import Templatetemplate1 = Template("$s是我最喜欢的编程语言, $s非常容易学习,而且功能强大")# 指定格式化参数s的值是Python# Python是我最喜欢的编程语言, Python非常容易学习,而且功能强大print(template1.substitute(s='Python'))# 当格式化参数是一个字符串的一部分时,为了和字符串的其他部分区分开,# 需要用一对大括号将格式化参数变量括起来template2 = Template("${s}stitute")# substituteprint(template2.substitute(s='sub'))template3 = Template("$dollar$$相当于多少$pounds")# 替换两个格式化参数变量# 20$相当于多少英磅print(template3.substitute(dollar=20, pounds='英磅'))template4 = Template("$dollar$$相当于多少$pounds")data = {}data['dollar'] = 100data['pounds'] = '英磅'# 使用字典指定格式化参数值# 100$相当于多少英磅print(template4.substitute(data))

3. 字符串的format方法

字符串本身也有一个format方法用于格式化当前的字符串。这个format方法和前面讲的格式化操作符(%)不太一样。字符串格式化参数并不是用百分号(%)表示,而是用一对大括号({}),而且支持按顺序指定格式化参数值和关键字格式化参数。例如,下面的代码通过format方法按顺序为格式化字符串指定了参数值。
print("{}  {}  {}".format(1,2,3))   # 运行结果:1  2  3
我们可以看到,上面的代码在字符串中指定了3对空的大括号,这代表3个格式化参数,不需要指定数据类型,可以向其传递Python语言支持的任何值。通过format方法传入3个值(1,2,3),这3个值会按顺序替换格式化字符串中的3对空的大括号。命名格式化参数是指在一对大括号中指定一个名称,然后调用format方法时也要指定这个名称。
print("{a}  {b}  {c}".format(a = 1,c = 2,b = 3))   # 运行结果:1  3  2
上面的代码在3对大括号中分别添加了“a”、“b”、“c”。通过format方法指定了这3个关键字参数的值。我们可以看到,并没有按顺序指定关键字参数的值。这也是使用关键字参数的好处,只要名字正确,fomat参数的顺序可以任意指定。当然,顺序方式和关键字参数方式可以混合使用,而且还可以指定顺序方式中格式化参数从format方法提取参数值的顺序,甚至可以取format方法参数值的一部分。哇,接连抛出了这么多功能,可能很多读者有点应接不暇了,别着急,下面的例子为我们演示format方法的一些常用使用方式。

示例代码:format方法.py

# 包含了2个空的大括号,format方法需要按顺序指定格式化参数值s1 = "Today is {}, the temperature is {} degrees."# format方法的第1个参数值对应s1的第1对大括号,第2个参数值对应s1的第2对大括号# Today is Saturday, the temperature is 24 degrees.print(s1.format("Saturday", 24))#  包含了2个命名格式化参数,一个是{week},另一个是{degree}s2 = "Today is {week}, the temperature is {degree} degrees."#  format方法的第1个参数指定了{degree}的值,第2个参数指定了{week}的值,#  可以将degree和week调换,s2.format(week ="Sunday", degree = 22)#  Today is Sunday, the temperature is 22 degrees.print(s2.format(degree=22, week="Sunday"))# 混合了顺序格式化参数和关键字格式化参数两种方式s3 = "Today is {week}, {},the {} temperature is {degree} degrees."#  format方法的参数,前面应该是按顺序传递的格式化参数值,后面是关键字格式化参数值,顺序不能调换#  这样做是错误的:s3.format(degree = 22, "aaaaa", 12345, week ="Sunday")#  Today is Sunday, aaaaa,the 12345 temperature is 22 degrees.print(s3.format("aaaaa", 12345, degree=22, week="Sunday"))#  为顺序格式化参数指定了从format方法获取参数值的顺序,{1}表示从format方法的第2个参数取值#  {0}表示从format方法的第1个参数取值s4 = "Today is {week}, {1},the {0} temperature is {degree} degrees."# Today is Sunday, 12345,the aaaaa temperature is 22 degrees.print(s4.format("aaaaa", 12345, degree=22, week="Sunday"))#  定义了一个列表fullname = ["Bill", "Gates"]# {name[1]}取fullname列表中的第2个值(Gates)# format方法通过关键字参数,为name名字指定了fullname列表。运行结果:Mr Gatesprint("Mr {name[1]}".format(name=fullname))# 导入math模块import math# 访问math模块中的“__name__”变量来获取模块的名字,访问math模块中的pi变量获取PI的值s5 = "The {mod.__name__} module defines the value {mod.pi} for PI"# format方法为mod关键字参数指定了math模块# The math module defines the value 3.141592653589793 for PIprint(s5.format(mod=math))

4. 更进一步控制字符串格式化参数

format方法的功能远不止这些,在一对大括号中添加一些字符串格式化类型符,可以对格式化字符串进行更多的控制。例如,下面的代码会将一个字符串类型的格式化参数值按原样输出、通过repr函数输出,以及输出其Unicode编码。
print("{first!s}  {first!r}  {first!a}".format(first = "中"))

执行这行代码,会输出如下的结果。

中  '中'  '\u4e2d' 
除此之外,format方法还支持很多其他的控制符,例如,可以将整数按浮点数输出,也可以将十进制数按二进制、八进制、十六进制格式输出。下面的例子为我们演示了如何使用这些控制符格式化字符串。

示例代码:控制符格式化字符串.py

# 原样输出:中  调用repr函数:'中'  输出Unicode编码:'\u4e2d'print("原样输出:{first!s}  调用repr函数:{first!r}  输出Unicode编码:{first!a}".format(first = "中"))# 将21按浮点数输出# 整数:21  浮点数:21.000000print("整数:{num}  浮点数:{num:f}".format(num = 21))#  将56按十进制、二进制、八进制和十六进制格式输出#  十进制:56  二进制:111000  八进制:70  十六进制:38print("十进制:{num}  二进制:{num:b}  八进制:{num:o}  十六进制:{num:x}".format(num = 56))# 将533按科学计数法格式输出# 科学计数法:5.330000e+02print("科学计数法:{num:e}".format(num = 533))# 将0.56按百分比格式输出,运行结果:百分比:56.000000%# 百分比:56.000000%print("百分比:{num:%}".format(num = 0.56))

下图是format支持的一些常用的字符串格式化类型符。

0f76fd0b56b032b55c1f0b0fcad516e7.png

往期回顾

Python编程思想(1):开发环境搭建

Python编程思想(2):Python主要特性、命名规则与代码缩进

Python编程思想(3):数字及其相关运算

Python编程思想(4):字符串类型

Python编程思想(5):列表与元组的基础知识

bb371529f408830cb213d7565fcf934a.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值