一个程序的输出有好多种方式,数据既可以用人们读懂的形式打印出来或者写入到文件以便将来使用。这章就讨论这些问题。
5.1 格式化输出
目前我们已经接触了两种输出值方式: 表达式语句和print()函数。(第三种就是使用file对象中的write()方法;标准的文件输出可参考sys.stdout库文件)
常常你会想控制输出格式化的数据而不是简单用空格分隔的字符。这里有两种方式用来格式化你的输出数据。第一种方式就是由你自己处理所有的字符串,用字符串中的切分或者链接操作你可以创建任何你想要是的字符。标准模块string包含一些将字符串填充到指定列宽度的有用操作,随后将会讨论这些。第二种方法就是使用str.format()方法。
String模块中包含一个template类,它提供另一种方法来将值转化为字符串形式。当然存在一个问题:你如何把值转化为字符串? 幸运的是,python已经提供了任何值转化为字符串的各种方法:把值传给方法repr()或者str();
Str()函数用来返回一个更方便人读的形式。而repr()方法用来产生一个解释器方便的形式。(如果没有相等的语句就会产生syntaxerror)。对于一个没有可以提供可供人方便读的特殊形式,str()返回值与repr()返回值相同。对于更多的值例如数字或者类似于列表和字典的结构, 都用这两种方法可以产生同样的表现形式。 特别地,字符串有两个不同的表现实现。
例如:
>>> s = ’Hello, world.’
>>> str(s)
’Hello, world.’
>>> repr(s)
"’Hello, world.’"
>>> str(1/7)
’0.14285714285714285’
>>> x = 10*3.25
>>> y = 200*200
>>> s = ’The value of x is ’ + repr(x) + ’, and y is ’ + repr(y) + ’...’
>>> print(s)
The value of x is 32.5, and y is 40000...
>>> # The repr() of a string adds string quotes and backslashes:
... hello = ’hello, world\n’
>>> hellos = repr(hello)
>>> print(hellos)
’hello, world\n’
>>> # The argument to repr() may be any Python object:
... repr((x, y, (’spam’, ’eggs’)))
"(32.5, 40000, (’spam’, ’eggs’))"
这有两种方法来输出平方和立方的表格:
>>> for x in range(1, 11):
... print(repr(x).rjust(2), repr(x*x).rjust(3), end=’ ’)
... # Note use of ’end’ on previous line
... print(repr(x*x*x).rjust(4))
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
>>> for x in range(1, 11):
... print(’{0:2d} {1:3d} {2:4d}’.format(x, x*x, x*x*x))
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
(注意在第一个例子中,用方法print()在每列中添加了空格:它也可以会在参数之间添加空格)
在例子的方法描述了字符串类中的str.rjust()方法应用。它通过在字符串左侧填充指定宽度的空格以致右对齐。还有两个类似的方法:str.ljust()和str.center()、这些方法不是用来写任何数据,它们会返回一个新的字符串。如果输入的字符串太长,它们不会截断它,而是原样返回。这也许是你的列表局混乱,但是比截断更好,那样会输出错误的值(如果你想截断,你总会可以使用切片操作,如x.ljust(n)[:n])
还有一个方法:zfile(),使用零在数字字符串左侧填充(到指定宽度)。它可以理解正负号。
>>> ’12’.zfill(5)
’00012’
>>> ’-3.14’.zfill(7)
’-003.14’
>>> ’3.14159265359’.zfill(5)
’3.14159265359’
Str.format()方法的基本用法就像下面一样:
>>> print(’We are the {} who say "{}!"’.format(’knights’, ’Ni’))
We are the knights who say "Ni!"
括号以及包含的字符(称为格式域)会被传入str.format()的对象所替代。在括号中的数据
指代传递给格式化方法对象的位置。
>>> print(’{0} and {1}’.format(’spam’, ’eggs’))
spam and eggs
>>> print(’{1} and {0}’.format(’spam’, ’eggs’))
eggs and spam
如果关键字参数在str.format()方法中使用时,它们的值通过参数名指定。
>>> print(’This {food} is {adjective}.’.format(
... food=’spam’, adjective=’absolutely horrible’))
This spam is absolutely horrible.
位置和关键字参数可以随意结合使用。
>>> print(’The story of {0}, {1}, and {other}.’.format(’Bill’, ’Manfred’,
other=’Georg’))
The story of Bill, Manfred, and Georg.
’!a’ (apply ascii()), ’!s’ (apply str()) and ’!r’ (apply repr())这些方法可以用来在格式化前转化数值。
>>> import math>>> print(’The value of PI is approximately {}.’.format(math.pi))
The value of PI is approximately 3.14159265359.
>>> print(’The value of PI is approximately {!r}.’.format(math.pi))
The value of PI is approximately 3.141592653589793.
字符名称后面可以跟一个可选的“:”符号和格式化分类符,这也是如何更好的控制格式化值得方法。下面的实例将PI小数点后截取为三位。
>>> import math
>>> print(’The value of PI is approximately {0:.3f}.’.format(math.pi))
The value of PI is approximately 3.142.
在“:”后传递一个整数将会设置这个字符宽度的最小字数。这个对美化表格很有用途。
>>> table = {’Sjoerd’: 4127, ’Jack’: 4098, ’Dcab’: 7678}
>>> for name, phone in table.items():
... print(’{0:10} ==> {1:10d}’.format(name, phone))
...
Jack ==> 4098
Dcab ==> 7678
Sjoerd ==> 4127
如果你有一个比较长的格式化字符,但是你不想把它分开, 使用名称代替位置来引用被各式化的变量将更好,这可以简单通过传递一个字典,并且使用方括号‘【】’访问所有的主键。
>>> table = {’Sjoerd’: 4127, ’Jack’: 4098, ’Dcab’: 8637678}
>>> print(’Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; ’
’Dcab: {0[Dcab]:d}’.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
通过用“**”把表作为关键字参数来实现这个功能,例如
>>> table = {’Sjoerd’: 4127, ’Jack’: 4098, ’Dcab’: 8637678}
>>> print(’Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}’.format(
**
table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
这在与新的内置函数vars()结合时尤为有用,它返回一个包含所有本地变量的字典,字符串格式化方法str.format()的完成介绍请参考Format String Syntax
5.1.1 旧式字符串格式化
%操作符也可以用来格式化字符串,它像:cfunc:’sprintf-’格式化字符串风格一样解释左参数并作用于右参数,并且从该格式化操作中返回字符串结果,例如:
>>> import math
>>> print(’The value of PI is approximately %5.3f.’ % math.pi)
The value of PI is approximately 3.142.
由于str.format()是新增方法,python的许多代码仍然用%操作符。但是,由于这个旧格式化风格最终会从语言中移除掉。Str.format就会普遍应用。
更多的信息请查看旧式字符串格式化 部分。