68. 格式化输出有几种方式

常见的有三种方法来格式化字符串,分别为:

  • %格式化字符串,
  • 字符串方法format,
  • F字符串。

例如:

name="openwrt"
print('book name is  %s' % name)       #%
print('book name is  {}'.format(name)) #format
print(f'book name is  {name}')         #f字符串

首先我们来学习一下用百分号格式化输出。

%格式化字符串(printf风格)

“%”是Python风格的字符串格式化操作符,非常类似C语言里的printf()函数的字符串格式化。 他对字符串进行操作,然后返回一个字符串。以format % values 形式进行计算,format是 一个字符串,其中包含要输出的对象占位符和格式。格式的%转换规范被替换为零或更多的 值元素。

示例:

#格式化输出字符串,整型和浮点型
>>> print('book name is %s, price is %d, read %f' % ("openwrt", 69, 1/3) )
book name is openwrt, price is 69, read 0.333333

还可以控制输出的格式, 例如精度,占用的字符宽度等等

print('read %.2f’ % 1/3)  #控制输出小数点后占两位
print('read %10d’ % 69)   #控制输出宽度为10
print('%02d' % 5)         #至少占用两个字符位置,不足前面补零
print('book name is %15s' % "openwrt")  #控制宽度占15个字符位置

转换说明符包含两个或多个字符,并具有以下组件,必须以这个顺序出现:

1, “%”字符,标志着转换说明符的开始。

2, 映射键(可选),由一个括号的字符序列组成(例如,(somename))。

3, 转换标志(可选),它影响某些转换类型的结果。

4, 最小宽度(可选)。如果指定为’*’(星号),则实际的宽度将从值的元组的下一个 元素中读取,并且在最小字段宽度和可选精度之后转换。

5, 精度(可选),作为一个”.”(点)接着是精度。如果指定为’*’(星号),则从值的 元组的下一个元素读取实际的精度,并在精度之后进行转换。

6, 长度修改器(可选)。

7, 转换类型。

常见的转换类型有:

=========   ===================
转换字符    含义
=========   ===================
'd'          整型数字
'i'          有符号整型数字
'o'          八进制数据
'x'          十六进制数据
'f'          浮点型数据
's'          字符串
=========   ===================

详细内容,请参考https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting

printf风格的字符串输出已经不建议使用,请使用最新的 f字符串 来替代该功能。

字符串方法format

format方法原型为:

   str.format(*args, **kwargs)

* args表示可以传递任意个位置参数,他根据位置来决定参数的含义及使用。
* kwargs表示关键字参数, 以key=value形式进行传递参数。

str.format()函数执行字符串格式化操作。该方法所调用的字符串可以包含文本或替换字段, 由括号{}分隔。每个替换字段包含一个位置参数的数值索引,或者一个关键字参数的名称。 它返回一个新的字符串的副本,其中每个替换字段替换为相应参数的字符串值。例如:

>>> name="beijing"
>>> "hello {k1}".format(k1=name)
'hello beijing'
>>> "hello {0}".format(name)
'hello beijing'

替换字段格式为”{” [field_name] [“!” conversion] [“:” format_spec] “}” 包含三部分:

  • field_name开始,该字段指定要格式化的对象,并将其插入到输出中。 field_name是可选的。
  • 后面是一个转换字段,前面是一个感叹号!。
  • 最后有一个format_spec,前面是冒号’:’。这些指定了替换值的非默认格式。

在括号里面,可以指定参数的格式化方式。他是用冒号“:”开始来指定格式化方式。

print('read {:.2f}'.format(1/3))  #控制输出小数点后占两位 read 0.33
print('read {:10d}'.format(69))   #控制输出宽度为10
print('{:<8}'.format(69))         #右对齐,占用8个字符宽度
print('read {:02d}'.format(5))     #至少占用两个字符位置,不足前面补零
print('book name is {:>15}'.format("openwrt"))  #右侧对齐,控制字符串宽度占15个字符