字符串格式化方法调用——高级格式化方法示例

未匹配的标注

可以看到:在格式化方法中,语法可以很复杂。因为在这些情况下的最好盟友通常是交互式提示符,让我们看一些例子。如下,{0:10} 意味着第一个位置的参数在一个10字符宽的字段中,{1:<10}意味着第二个位置的参数在一个10字符宽的字段中左对齐,{0.platform:>10}意味着第一个参数的platform属性在一个10字符宽的字段中右对齐(再次注意从关键字参数创建字典的dict()的使用,在第4章第8章有讲述):

>>> '{0:10} = {1:10}'.format('spam', 123.4567) # 在 Python 3.3
'spam = 123.4567'
>>> '{0:>10} = {1:<10}'.format('spam', 123.4567)
' spam = 123.4567 '
>>> '{0.platform:>10} = {1[kind]:<10}'.format(sys, dict(kind='laptop'))
' win32 = laptop '

在所有例子中,从Python 2.7 和 3.1 开始,如果使用相对的自动编号从左到右来选择参数,就可以省略掉它们——然而这会让代码不那么明确,因此抵消了一个官方声称的格式化方法优于格式化表达式的优点(参见接下来相关的说明):

>>> '{:10} = {:10}'.format('spam', 123.4567)
'spam = 123.4567'
>>> '{:>10} = {:<10}'.format('spam', 123.4567)
' spam = 123.4567 '
>>> '{.platform:>10} = {[kind]:<10}'.format(sys, dict(kind='laptop'))
' win32 = laptop '

在格式化方法调用中,浮点数支持和在 %表达式中同样的类型码和格式化特性。比如,如下的 {2:g}意味着第三参数默认根据”g“ 浮点表示法来格式化,{1:.2f}指定”f“只有两个小数位的浮点格式,{2:06.2f}填加了一个字段,它宽度为6个字符且左边被0填充:

>>> '{0:e}, {1:.3e}, {2:g}'.format(3.14159, 3.14159, 3.14159)
'3.141590e+00, 3.142e+00, 3.14159'
>>> '{0:f}, {1:.2f}, {2:06.2f}'.format(3.14159, 3.14159, 3.14159)
'3.141590, 3.14, 003.14'

format方法也支持16, 8 和 2 进制格式。事实上,字符串格式化是一些内置函数把整数格式化为指定底数(进制)的可选方法:

>>> '{0:X}, {1:o}, {2:b}'.format(255, 255, 255) # 16, 8, 2进制
'FF, 377, 11111111'
>>> bin(255), int('11111111', 2), 0b11111111 # 其它的 2进制相互转换方法
('0b11111111', 255, 255)
>>> hex(255), int('FF', 16), 0xFF # 其它的 8进制相互转换方法
('0xff', 255, 255)
>>> oct(255), int('377', 8), 0o377 # 在 3.X 中,其它的 8进制相互转换方法
('0o377', 255, 255) # 2.X prints and accepts 0377

格式化参数可以在格式字符串中硬编码或通过嵌套的格式语法从参数列表中动态获取,很像在格式化表达式的宽度和精度中的 * 语法:

>>> '{0:.2f}'.format(1 / 3.0) # 参数硬编码
'0.33'
>>> '%.2f' % (1 / 3.0) # 同上(对表达式)
'0.33'
>>> '{0:.{1}f}'.format(1 / 3.0, 4) # 从参数获取值
'0.3333'
>>> '%.*f' % (4, 1 / 3.0) # 同上(对表达式)
'0.3333'

最后, Python 2.6 和 3.0 还引入了一个新的内置format函数,它可以被用来格式化单个项。它是字符串format方法的一个更简洁的可选方法,且大致类似于使用 % 格式化表达式来格式化单个项:

>>> '{0:.2f}'.format(1.2345) # 字符串方法
'1.23'
>>> format(1.2345, '.2f') # 内置函数
'1.23'
>>> '%.2f' % 1.2345 # 表达式
'1.23'

技术上讲,format内置函数运行了被作用对象的 __format__方法(str.format方法在内部为格式字符串中的每个被格式化的项都运行了该方法)。然而,同样的功能,它仍比原来的 % 表达式要更啰嗦——这将我们引向下一节。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~