%-formatting

这是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.

转载请注明本网址。