Python从菜鸟到高手(15):字符串格式化

1. 字符串格式化基础

字符串格式化相当于字符串模板。也就是说,如果一个字符串有一部分是固定的,而另一部分是动态变化的,那么就可以将固定的部分做成模板,然后那些动态变化的部分使用字符串格式化操作符(%) 替换。如一句问候语:“Hello 李宁”,其中“Hello”是固定的,但“李宁”可能变成任何一个人的名字,如“乔布斯”,所以在这个字符串中,“Hello”是固定的部分,而“李宁”是动态变化的部分,因此,需要用“%”操作符替换“李宁”,这样就形成了一个模板。
Hello %s

上面的代码中,“%”后面的s是什么呢?其实字符串格式化操作符后面需要跟着动态值的数据类型,以及更细节的格式(如对于浮点数来说,小数点后要保留几位),这里的“%s”表示动态部分要被替换成字符串类型的值。如果在字符串模板中有多个要被替换的部分,需要按顺序用“%”表示,然后在格式化字符串时,传入的值也要符合这个顺序。例5.2为我们演示了格式化字符串的基本用法。

本例首先定义了一个字符串模板,然后传入了两个字符串类型的值来格式化字符串,最后将格式化后的字符串输出。

#  定义字符串模板
formatStr = "Hello %s. Today is %s, Are there any activities today?"
#  初始化字符串格式化参数值,此处必须使用元组,不能使用列表
values = (‘Mike‘, ‘Wednesday‘)
#  格式化字符串
print(formatStr % values)

程序运行结果如下图所示。

从上面的代码可以看出,不仅在为字符串模板指定格式化参数时要使用百分号(%),在格式化字符串时,也要像取模一样使用“%”操作符。还有就是指定字符串格式化参数值要使用元组,在这里不能使用列表。

在上图中,只是使用了字符串作为格式化参数,但在实际的应用中,可能会有其他类型的字符串格式化参数。如果遇到这种情况,可以使用str函数将这些数据类型的值转换为字符串类型的值,然后再传入字符串模板,这么做在大多数情况下是可行的,但如果要对格式化参数值有更进一步的要求,光使用str函数就做不到了,这就要使用能表示这些数据类型的格式化参数,如“%f”表示浮点类型的格式化参数。

在下面代码的字符串模板中包含了字符串、整数和浮点数类型的模板。

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

程序的运行结果如下图所示。

在上面的代码中,为格式化字符串指定了不同数据类型的格式化参数。如果要在格式化字符串中显示百分号(%),就要使用两个百分号(%%)表示。当传入的参数值的数量与格式化参数的数量不匹配时,就会抛出异常。

模板字符串

在string模块中提供了一个用于格式化字符串的Template类,该类的功能是用同一个值替换所有相同的格式化参数。Template类的格式化参数用美元符号($)开头,后面跟着格式化参数名称,相当于变量名。在格式化时,需要使用Template类的substitute方法,该方法用于指定格式化参数对应的值。

from string import Template
template = Template("$s  $s  $s ")
template.substitute(s = "Hello")       # 这种参数被称为关键字参数,会在后面的章节详细介绍

在上面的代码中,通过Template类的构造方法传入了一个格式化字符串,在这个格式化字符串中包含了3个“$s”,然后调用了substitute方法格式化这个字符串,该方法指定了s参数值为“Hello”,最后的替换结果是“Hello Hello Hello”,也就是说,在格式化字符串中,有多少个“$s”,就替换多少个“$s”。substitute方法还可以通过字典(见下一章)设置格式化参数的值。例5.4完整地演示了如何使用Template类格式化字符串。

使用Template格式化字符串,当格式化参数是一个字符串的一部分时,需要用一对大括号({})将格式化参数变量括起来。

# 引用string模块中的Template类
from string import Template
template1 = Template("$s是我最喜欢的编程语言, $s非常容易学习,而且功能强大")
# 指定格式化参数s的值是Python
print(template1.substitute(s=‘Python‘))
# 当格式化参数是一个字符串的一部分时,为了和字符串的其他部分区分开,
# 需要用一对大括号将格式化参数变量括起来
template2 = Template("${s}stitute")
print(template2.substitute(s=‘sub‘))

template3 = Template("$dollar$$相当于多少$pounds")
# 替换两个格式化参数变量
print(template3.substitute(dollar=20,pounds=‘英磅‘))

template4 = Template("$dollar$$相当于多少$pounds")
data = {}
data[‘dollar‘] = 100
data[‘pounds‘] = ‘英磅‘
# 使用字典指定格式化参数值
print(template4.substitute(data))

程序运行结果如下图所示。

字符串的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方法参数值的一部分。哇,接连抛出了这么多功能,可能很多读者有点应接不暇了,别着急,例5.5会为我们演示format方法的一些常用使用方式。

本例分别使用一对大括号“{}”、命名格式化参数和顺序格式化参数3中方式格式化字符串。

# 包含了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 Gates
print("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 PI
print(s5.format(mod = math))

程序运行结果如下图所示。

原文地址:http://blog.51cto.com/androidguy/2175680

时间: 2024-10-07 08:18:51

Python从菜鸟到高手(15):字符串格式化的相关文章

Python从菜鸟到高手(7):字符串

1. 单引号字符串和转义符   字符串与数字一样,都是值,可以直接使用,在Python控制台中直接输入字符串,如"Hello World",会按原样输出该字符串,只不过用单引号括了起来. >>> "Hello World" 'Hello World'   那么用双引号和单引号括起来的字符串有什么区别呢?其实没有任何区别.只不过在输出单引号或双引号时方便而已.例如,在Python控制台输入'Let's go!',会抛出如下的错误. >>&

Python从菜鸟到高手(5):数字

1 基础知识 ??Python语言与其他编程语言一样,也支持四则运算(加.减.乘.除),以及圆括号运算符.在Python语言中,数字分为整数和浮点数.整数就是无小数部分的数,浮点数就是有小数部分的数.例如,下面的代码是标准的四则运算表达式. 2 + 4 4 * 5 + 20 5.3 / 7 (30 + 2) * 12 ??如果要计算两个数的除法,不管分子和分母是整数还是浮点数,使用除法运算符(/)的计算结果都是浮点数.例如1/2的计算结果是0.5,2/2的计算结果是1.0.要想让Python解释

Python从菜鸟到高手(6):获取用户输入、函数与注释

1. 获取用户输入   要编写一个有实际价值的程序,就需要与用户交互.当然,与用户交互有很多方法,例如,GUI(图形用户接口)就是一种非常好的与用户交互的方式,不过我们先不讨论GUI的交互方式,本节会采用一种原始,但很有效的方式与用户交互,这就是命令行交互方式,也就是说,用户通过命令行方式输入数据,程序会读取这些数据,并做进一步的处理.   从命令行接收用户的输入数据,需要使用input函数.input函数接收一个字符串类型的参数,用于作为输入的提示.input函数的返回值就是用户在命令行中录入

Python从菜鸟到高手(8):print函数、赋值与代码块

1.神奇的print函数 ??print函数相信读者一定对它不陌生,因为在前面的章节,几乎每个例子都使用了print函数,这个函数的功能就是在控制台输出文本.不过print在输出文本时还可以进行一些设置,以及输出多参数字符串. ??如果为print函数传入多个参数值,那么print函数会将所有的参数值首尾相接输出. # 输出结果:a b c d e print("a","b","c","d","e"); ?

Python从菜鸟到高手(9):条件和条件语句

1.布尔(Boolean)值和布尔变量 ??在讲条件语句之前,首先应该了解一下布尔类型.条件语句(if)需要为其指定布尔值或布尔类型的变量,才能根据条件判断是否要指定代码块中的语句.布尔值只有两个值:True和False,可以将这两个值翻译成"真"和"假". ??现在我们已经了解了布尔值是用来做什么的,但Python语言会将哪些值看做布尔值呢?其实在Python语言中,每一种类型的值都可以被解释成布尔类型的值.例如,下面的值都会被解释成布尔值中的False. Non

Python从菜鸟到高手(10):循环

  我们现在已经知道了如何使用if语句让程序沿着不同的路径执行,不过程序最大的用处就是利用CPU和GPU强大的执行能力不断重复执行某段代码,想想Google的AlphaGo与柯洁的那场人机大战,尽管表面上是人工智能的胜利,其实人工智能只是算法,人工只能算法之所以会快速完成海量的数据分享,循环在其中的作用功不可没.   对于初次接触程序设计的读者,可能还不太理解循环到底什么东西.下面先看一下循环的伪代码. 查看银行卡余额 没有发工资,等待1分钟,继续执行1 Oh,yeah,已经发工资了,继续执行4

Python从菜鸟到高手(11):列表的基础操作

  列表可以使用所有适用于序列的标准操作,例如索引.分片.连接和乘法.但列表还有一些属于自己的操作,如修改列表本身的操作,这些操作包括元素赋值.元素删除.分片赋值以及下一节要将的列表方法. 1. 列表元素赋值   如果要修改列表中的某一个元素,可以像使用数组一样对列表中的特定元素赋值,也就是使用一对中括号指定元素在列表中的索引,然后使用赋值运算符(=)进行赋值.   本例修改了列表s中的前两个元素值. s = ["Bill", "Mike", "John&

Python从菜鸟到高手(12):通过索引操作序列元素

1.定义序列   本文将介绍一下在Python语言中如何定义序列.定义序列的语法与Java中的数组类似,使用一对中括号将序列中的元素值括起来.下面的例子创建一个元素类型是字符串的序列,实现代码如下: names = ["Bill", "Mary", "Jack"]   同一个序列,不仅可以包含相同类型的值,还可以包含不同类型的值.下面的例子在一个序列中放置不同类型的值,实现代码如下: values = ["Bill", 30,

Python从菜鸟到高手(14):序列的加法和乘法

1 序列的加法   序列也可以相加,但要注意,这里的相加,并不是相对应的序列元素值相加,而是序列首尾相接.由于字符串属于字符序列,所以字符串相加也可以看做是序列相加.但一个字符串不能和一个序列相加,否则会抛出异常.   本例演示了两个序列之间的加法,以及序列和字符串之间相加后会抛出异常. print([1,2,3] + [6,7,8]) # 运行结果:[1,2,3,6,7,8] print("Hello" + " world") # 运行结果:Hello world

python关键字、转义符和字符串格式化

最近在学learn python the hard way,学习到第37章,进行了关于关键字.转义符和字符串格式化的总结.看手头上的中文版没有及时更新.于是就把这些翻译过来,以作查阅. 关键字: 关键字 描述 例子 and 逻辑与 True and False == False as 作为with-as语句的一部分 with X as Y: pass assert 保证某些事情为真 assert False, "Error!" break 马上停止循环 while True: brea