URLhttps://learnscript.net/zh/python/data-types/text-types/printf/
    复制链接转到说明  示例

    Python 旧式 printf 风格的字符串格式化使用说明

    我被代码海扁署名-非商业-禁演绎
    阅读 7:25·字数 2229·发布 

    由于使用 Python 旧式 printf 风格进行字符串格式化可能导致一些问题,因此,建议使用str类型的format方法,你可以查看如何格式化 Python 字符串?format,format_map 方法,Formatter 类介绍一节来了解更多信息。

    旧式 printf 风格的字符串格式化

    Python 旧式的 printf 风格字符串格式化,可以完成与str类型的format方法类似的效果,其语法格式如下。

    format % values

    format 值

    format是需要进行格式化的字符串,字符串中包含若干以%开头的转换符,这些转换符将被values提供的值代替。

    values 值

    values是一个元组或字典对象,元组中的元素或字典中的键值对将代替字符串中的转换符。如果在format对应的字符串中,仅包含一个转换符,那么values可以是其他类型的对象。

    如果values是元组,那么该元组中的元素将依次替换字符串中的转换符,此时元组所包含的元素的个数需要与字符串中的转换符的个数相同,否则会引发异常TypeError: not enough arguments for format stringTypeError: not all arguments converted during string formatting。如果values是字典,那么该字典所包含的键值对应能够替换字符串中所有的转换符,否则将引发异常KeyError

    '%f %s' % (1.23, 4.56)
    '1.230000 4.56'
    '%(name)s %(age)d' % {'name': 'Jack', 'age': 12, 'passed': True}
    'Jack 12'
    '%f' % 123
    '123.000000'

    旧式 printf 风格中的转换符

    在使用旧式 printf 风格对字符串进行格式化时,以%开头的转换符将被替换为其他内容,转换符的格式如下。

    %[(key)][sign][width][.precision]type[length]

    key 值

    values是一个字典时,key为字典某个键值对的键,该键值对的值将替换转换符。

    sign 值

    如果sign包含0,那么在拥有剩余空间的情况下,将自动为数字添加字符0。如果sign包含--会使0失效),那么将在可用的空间内进行左对齐。如果sign包含 (空格),那么将在正数前添加一个 (空格)。如果sign+-会使 失效),那么将在数字前添加正号+或负号-。如果sign包含#,那么将为整数显示相关前缀,比如0o(八进制),0x0X(十六进制),或者强制为浮点数显示小数点。

    width 值

    width表示转换符占用的最小空间(长度),如果忽略他,则转换符的空间由其对应的值来决定。如果width被设置为*,那么values需要是一个元组,且元组接下来的元素表示转换符占用的最小空间,而不是转换符对应的值。

    precision 值

    precision表示转换符的精度(数字超出精度时将被舍入),当typefFeE时,精度是指小数点后的位数(将自动补0)。当typegG时,精度是指小数点前后的所有位数(不会自动补0)。如果转换符对应的值是字符串,那么字符串的长度会被精度限制。如果precision被设置为*,那么values需要是一个元组,且元组接下来的元素表示转换符的精度,而不是转换符对应的值。

    type 值

    type用于设置数字或字符串的具体呈现方式。

    length 值

    length可以被设置为hlL,但不会产生任何实际效果。

    '%+010d' % 1
    '+000000001'
    '%-010g' % 1.2
    '1.2       '
    '%(num)+#x' % {'num': 12}
    '+0xc'
    '%(num) #o' % {'num': 12}
    ' 0o14'
    '%*d' % (5, 1234)
    ' 1234'
    '%*f' % (5, 1234.56789)
    '1234.567890'
    '%.5e' % 1.23456789
    '1.23457e+00'
    '%.5g' % 1.23456789
    '1.2346'
    '%.*f' % (5, 1.23456789)
    '1.23457'

    为数字和字符串设置具体呈现方式

    在使用旧式 printf 风格对字符串进行格式化时,通过指定转换符中的type,可以为转换符对应的数字或字符串设置具体的呈现方式,其具体的取值如下。

    d(等价于已弃用的u),i表示将数字显示为十进制格式,o表示将数字显示为八进制格式,x表示将数字显示为十六进制格式,其中字母为小写,X同样表示将数字显示为十六进制格式,但字母为大写。

    e表示将数字显示为科学计数法,此时转换符中的precision表示小数点后的位数,如果未指定precision,则精度默认为6Ee类似,但会采用大写字母。

    f表示将数字显示为定点数,此时转换符中的precision表示小数点后的位数,如果未指定precision,则精度默认为6Ff类似,但会采用大写字母。

    g表示根据转换符中的precision(精度为0会被视为1)和数字的值来选择是否使用科学计数法显示数字,数字末尾无意义的0和小数点会被省略(除非使用#),如果未指定precision,则精度默认为6Gg类似,但会采用大写字母。

    c表示将数字转换为对应的 Unicode 字符。

    %表示将转换符显示为%自身,而不是替换为某个值。

    s表示会调用str的构造器(构造函数)来格式化转换符对应的值,r会调用 Python 的repr函数,a会调用 Python 的ascii函数。

    '%d' % 123.456
    '123'
    '%e' % 1.2345678
    '1.234568e+00'
    '%.3f' % 1.2345678
    '1.235'
    '%.0g' % 12345678.9
    '1e+07'
    '%.3g' % 12345678.9
    '1.23e+07'
    '%.10g' % 12.0000000001
    '12'
    '%#.10g' % 12.0000000001
    '12.00000000'
    '%c' % 65
    'A'
    '%d%%' % 10
    '10%'

    格式化 bytes 或 bytearray 对象表示的字节串

    Python 旧式 printf 风格,除了可以格式化字符串,还可以格式化bytesbytearray对象表示的字节串,他们仅在转换符的type的取值中存在一些差异,具体如下。

    b(等价于已弃用的s)表示将values提供的值转换为字节串,该值需要是一个bytesbytearray对象,或遵守缓冲协议的对象,或拥有__bytes__方法的对象。

    ar表示将使用表达式repr(obj).encode('ascii','backslashreplace')来转换values提供的值。

    b'%b' % bytearray(b'Jack')
    b'Jack'
    b'%b' % b'Jack'
    b'Jack'
    b'%a' % 'Jack,你好'
    b"'Jack\\uff0c\\u4f60\\u597d'"
    bytearray(b'%a') % b'Jack'
    bytearray(b"b\'Jack\'")

    在下面的示例中,我们定义了一个用于格式化的类Data,该类定义了方法__bytes__,使其可用于%b表示的格式化。

    custom.py
    # 一个用于格式化的类
    class Data:
    	# 定义了 __bytes__ 方法
    	def __bytes__(self):
    		return bytes(b'__bytes__')
    
    print(b'%b' % Data())
    b'__bytes__'

    源码

    src/zh/data_types/text_types/printf·codebeatme/python·GitHub