程序的输出可以有多种形式:我们可以将数据以人类可读的形式打印到屏幕上,或者将其写入到文件中以供后续使用。
格式化输出
迄今为止,在 Python 中存在两种输出值的方法:表达式语句以及 print() 函数。(第三种方法是使用文件对象的 write() 方法;标准文件输出可以参考 sys.stdout 方法,其详细内容请查阅库参考手册。)
通常,相较于简单地打印以空格为分隔符的值,你会想要对程序的输出结果进行更多的格式控制。在 Python 中,存在如下几种格式化输出的方法:
使用 f-strings 字符串。这类字符串需要在引号标记之前,以 f 或者 F 作为字符串的开头。你可以使用 { 和 } 包裹想要嵌入到字符串中的 Python 表达式。该表达式可以是某个变量或字面值 。
>>> year = 2016 ; event = 'Referendum' >>> f'Results of the {year} {event}' 'Results of the 2016 Referendum'
str.format() 是格式化字符串的第二种方法。相较于第一种方法,该方法需要你进行更多的操作。你仍然可以在字符串中使用 { 和 } 来内嵌变量,也可以进行详细的格式化设计。但这要求你提供与之对应的被格式化的内容。
当然,你也可以通过字符串的切片操作和连接操作来完成字符串的格式化处理。这种方法可以创建任何你想要的格式化形式。在 string 类型中,包含了一些能够将字符串按指定列宽填充的方法。
如果你仅仅想要在调试时打印某些变量,而不进行格式化输出,那么你也可以使用 repr() 函数或者 str() 函数将任意值转化成字符串。
str() 函数能够将值以人类可读的形式呈现,而 repr() 函数则是将值以解释器可读的形式呈现(如果没有与之对应的转换语法,则会产生 SyntaxError 异常)。若某个对象没有适用于人类可读的形式,则 str() 函数的返回值与 repr() 函数相同。在 Python 中,诸如数值、或者是链表、字典这样的结构,上述两种函数各自有统一的呈现方式。但是对于字符串,上述两种函数各自有独特的呈现方式。
如下示例:
>>> 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... >>> # 对于字符串,repr() 函数会添加引号以及反斜杠: ... hello = 'hello, world\n' >>> hellos = repr(hello) >>> print(hellos) 'hello, world\n' >>> # repr() 函数的参数也可以是某个 Python 对象: ... repr((x, y, ('spam', 'eggs'))) "(32.5, 40000, ('spam', 'eggs'))"
string 模块包含 Template 类来提供额外的在字符串中嵌入变量的方法。该方法使用占位符,比如 $x 来内嵌变量,变量的值存放在字典中。这种方法对字符串的格式化控制较少。
格式化字符串文字
格式化字符串文字 (简称 f-strings )允许你在字符串中包含 Python 表达式的值,方法是在字符串前面加上 f 或者 F ,并将表达式写成 {expression} 格式。
在表达式后面可以加上格式说明符。这样能够更好地控制表达式值的输出格式。下面的例子将 PI 舍入到小数位数后三位。
>>> import math >>> print(f'The value of pi is approximately {math.pi:.3f}.')
在 ':' 之后加上一个整数表示该字段的最小字符数,这对于列排序很有用。
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678} >>> for name, phone in table.items(): ... print(f'{name:10} ==> {phone:10d}') ... Sjoerd ==> 4127 Jack ==> 4098 Dcab ==> 7678
也可用其他修饰符来转换要格式化的值。 '!a' 表示应用 ascii()函数 , '!s' 表示应用 str() 函数, 另外 '!r' 表示应用 repr() 函数:
>>> animals = 'eels' >>> print(f'My hovercraft is full of {animals}.') My hovercraft is full of eels. >>> print('My hovercraft is full of {animals !r}.') My hovercraft is full of 'eels'.
有关这些格式规范的参考,请参阅参考指南 最小字符串格式化。
format () 字符串格式化方法
str.format() 的基本使用方法如下:
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni')) We are the knights who say "Ni!"
其中的括号和字符(称为格式字段)将用传入 str.format() 方法中的对象来替换。括号中的数字可用于表示传递给 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.
如果你有一个不想拆分的长字符,使用名称而不是位置来进行格式化将会是一个更好的方法。这可以简单的使用 '[]'符号来获取字典中的键
>>> 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
传统字符串格式化方法
操作符 '%' 同样可以被用来格式化字符串。它将该操作符左侧参数解释为'sprintf ()' 样式的字符串应用到操作符右侧参数,并且返回字符串。例如:
>>> import math >>> print('The value of pi is approximately %5.3f.' % math.pi) The value of pi is approximately 3.142.