本文所有代码、方法都已在python3.7.3下测试执行通过
字符串包含有关如何设置格式的信息,而这些信息是使用一种微型格式指定语言
(mini-language)指定的。每个值都被插入字符串中,以替换用花括号括起的替换字段。
在格式字符串中,最激动人心的部分为替换字段。替换字段由如下部分组成,其中每个部分
都是可选的。
最简单的情况下 向format提供其格式的未命名参数 并在格式字符串中使用未命名参数
此时按照顺序将字段与参数匹配
s = '{}, world!'.format('hello')
token = 'asdasf{}asdas'.format(1)
lst = 'asdf{}asd'.format([1, 2, 3])
print(token)
print(s)
print(lst)
打印结果为
asdasf1asdas
hello, world!
asdf[1, 2, 3]asd
当然 也可以为参数指定名称 或者或者通过索引指定在某个字段中使用相应的未命名参数
名称和索引可以混用
s = '{foo} {} {bar} {}'.format(1, 2, bar=4, foo=3)
token = '{foo} {1} {bar} {0}'.format(1, 2, bar=4, foo=3)
print(token)
print(s)
打印结果为
3 2 4 1
3 1 4 2
记住不能同时使用手工索引和自动索引 这样会让代码变得很混乱以及降低可读性
替换内容并非只能提供值本身 还可以访问其组成部分 例如下面的代码
import math
fullname = ["Alfred", "Smoketoomuch"]
name = "Mr {name[1]}".format(name=fullname)
tmpl = "The {mod.__name__} module defines the value {mod.pi} for π"
s = tmpl.format(mod=math)
print(name)
print(s)
程序运行结果为
Mr Smoketoomuch
The math module defines the value 3.141592653589793 for π
如上面的代码 可使用索引 还可使用句点表示法来访问导入的模块中的方法 属性 变量和函数
指定要在字段中包含的值后 可以添加有关如何设置格式的命令
首先 我们来看提供一个转换标志的情况
print("{pi!s} {pi!r} {pi!a}".format(pi="π"))
程序运行结果为
π 'π' '\u03c0'
上述三个标志(s r和a)指定分别使用str repr和ascii 进行转换
函数 str 通常创建外观普通的字符串版本(这里没有对输入字符串做任何处理)
函数 repr 尝试创建给定值的Python表示(这里是一个字符串字面量)
函数 ascii 创建只包含ASCII字符的表示 类似于Python 2中的repr
此外 还可指定要转换的值是哪种类型 或者说将其视为那种类型
print('The number is {num}'.format(num=42)) # 整数格式输出
print('The number is {num:f}'.format(num=42)) # 浮点数格式输出
print('The number is {num:b}'.format(num=42)) # 二进制格式输出
程序执行结果为
The number is 42
The number is 42.000000
The number is 101010
设置浮点数的格式时 默认在小数点后显示六位小数 并且根据需要设置字段的宽度 不进行任何形式的填充
实际应用中 我们可以根据个人需求指定宽度和精度
字符串和数字的对齐方式是不同的
print('{num:10}'.format(num=3))
print('{name:10}'.format(name='Bob'))
程序运行结果为
3(这个地方是告诉你这一行到此为止)
Bob (这个地方是告诉你这一行到此为止)
浮点数指定精度和宽度如下
from math import pi
print('{pi:10.2f}'.format(pi=pi))
程序运行结果为
3.14
对于其他类型我们也可以指定精度 不过一般不会有这种需求
例如字符串类型指定精度
print('{:.5}'.format('Guido van Rossum'))
Guido
可使用逗号添加千位分隔符
print('{:,}'.format(1000*1000))
1,000,000