这是Python第一代格式化字符串法方法,伴随着python语言的诞生(original generation)。请记住,不建议使用%格式。
格式化字符串时,Python使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式。
比如下面的例子:
1
2
|
name = "Tom"
print("Hello, %s." % name) #输出Hello, Tom.
|
“Hello, %s.“为我们的模板。%s为第一个格式符,表示一个字符串。变量name的值Tom为替换%s的真实值。在模板和变量name之间,有一个%号分隔,它代表了格式化操作。
整个”Hello, %s.” % name实际上构成一个字符串表达式。我们可以像一个正常的字符串那样,将它赋值给某个变量。比如:
1
2
3
|
name = "Tom"
str = "Hello, %s." % name
print(str) #输出Hello, Tom.
|
为了插入多个变量,您必须使用这些变量的元组。以下是你如何做到这一点:
1
2
3
4
5
|
name = "Tom"
age = 56
#变量name和age组成一个元组。
str ="Hello, %s. You are %s." % (name, age)
print(str) #输出Hello, Tom. You are 56.
|
我们还可以用词典来传递值。如下:
1
2
|
str = "Hello, %(name)s. You are %(age)d." % {'name':'Tom', 'age':56}
print(str) #输出Hello, Tom. You are 56.
|
可以看到,我们对两个格式符进行了命名。命名使用()括起来。每个命名对应词典的一个key。
%格式语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
格式:%[(name)][flags][width][.precision]typecode
(name) 可选,用于选择指定的key
flags 可选,可供选择的值有:
+ 右对齐;正数前加正号,负数前加负号;
- 左对齐;正数前无符号,负数前加负号;
空格 右对齐;正数前加空格,负数前加负号;
0 右对齐;正数前无符号,负数前加负号;用0填充空白处
width 可选,占有宽度
.precision 可选,小数点后保留的位数,进行四舍五入计算。
typecode 必选
s : 获取传入对象的__str__方法的返回值,并将其格式化到指定位置
r : 获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
c : 如果是整数的话,将数字转换成其unicode对应的值,10进制范围为0 <= i <= 1114111(py27则只支持0-255);如果是字符的话,将字符添加到指定位置
o : 将整数转换成八进制表示,并将其格式化到指定位置
x : 将整数转换成十六进制表示,并将其格式化到指定位置
d : 将整数、浮点数转换成十进制表示,并将其格式化到指定位置
e : 将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
E : 将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
f : 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
F : 同上
g : 自动调整将整数、浮点数转换成浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
G : 自动调整将整数、浮点数转换成浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
% : 当字符串中存在格式化标志时,需要用 %%表示一个百分号;
|
示例 %[(name)]typecode
1
2
3
4
5
|
#字典d,name和age是键。
d = {'name':'Tom', 'age':56}
#第一个格式化字符串的名字是name,第二个格式化字符串的名字是age。name和age必须和字典d的键名一一对应。负责会报找不到的错误。第一个格式化字符串的类型是s,表示调用对象的__str__方法显示。第二个是d,十进制显示。
str = "Hello, %(name)s. You are %(age)d." % d
print(str) #输出Hello, Tom. You are 56.
|
示例 %[flags][width]typecode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#字典d,name,age,money是键。
d = {'name':'Tom', 'age':56, 'money':-100}
#+符号,右对齐;正数前加正号,负数前加负号
str = "Hello, %(name)+10s. You are %(age)+10d. Money is %(money)+10d." % d
print(str)
#-符号,左对齐;正数前无符号,负数前加负号;
str2 = "Hello, %(name)-10s. You are %(age)-10d. Money is %(money)-10d." % d
print(str2)
#空格符号,右对齐;正数前加空格,负数前加负号;
str3 = "Hello, %(name) 10s. You are %(age) 10d. Money is %(money) 10d." % d
print(str3)
#数组0符号,右对齐;正数前无符号,负数前加负号;用0填充空白处
str4 = "Hello, %(name)010s. You are %(age)010d. Money is %(money)010d." % d
print(str4)
|
执行以上程序会输出如下结果:
1
2
3
4
|
Hello, Tom. You are +56. Money is -100.
Hello, Tom . You are 56 . Money is -100 .
Hello, Tom. You are 56. Money is -100.
Hello, Tom. You are 0000000056. Money is -000000100.
|
示例 %[flags][width][.precision]typecode
1
2
3
4
5
6
7
8
|
#字典d,name,age,money是键。
d = {'name':'Tom', 'age':56, 'money':-100.99}
#第二个格式化保留2位小数点后数字,第三个格式化保留3位小数点后数字,进行四舍五入计算
str = "Hello, %(name)+10s. You are %(age)+10.2f. Money is %(money)+10.3f." % d
print(str)
#第二个格式化保留2位小数点后数字,第三个格式化保留1位小数点后数字,进行四舍五入计算。-100.99转变为-101.0
str2 = "Hello, %(name)+10s. You are %(age)+10.2f. Money is %(money)+10.1f." % d
print(str2)
|
执行以上程序会输出如下结果:
1
2
|
Hello, Tom. You are +56.00. Money is -100.990.
Hello, Tom. You are +56.00. Money is -101.0.
|
示例 %typecode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
print("%c" % 97)
print("%c" % 'A')
print("%o" % 97)
print("%x" % 97)
print("%d" % 97)
print("%e" % 97)
print("%E" % 97)
print("%f" % 97)
print("%F" % 97)
print("%g" % 97000000)
print("%G" % 97000000)
#%%表示一个百分号
print("%d%%" % 50)
|
执行以上程序会输出如下结果:
1
2
3
4
5
6
7
8
9
10
11
12
|
a
A
141
61
97
9.700000e+01
9.700000E+01
97.000000
97.000000
9.7e+07
9.7E+07
50%
|
为什么 %-formatting不好用?
使用几个参数和更长的字符串,你的代码将很快变得不太容易阅读。容易出错。
1
2
3
4
5
6
7
|
first_name = "Eric"
last_name = "Idle"
age = 74
profession = "comedian"
affiliation = "Monty Python"
str = "Hello, %s %s. You are %s. You are %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
print(str)
|
执行以上程序会输出如下结果:
1
|
Hello, Eric Idle. You are 74. You are comedian. You were a member of Monty Python.
|
转载请注明本网址。