浅谈python字符串格式化

转自:微点阅读  https://www.weidianyuedu.com/content/0717441960625.html

字符串格式化,就是将字符常量和变量相结合,同时控制其显示格式。在python中,支持多种字符串格式化的语法

1. printf 风格

类似C语言中sprintf函数的代码风格,用%占位符来表示变量,基本用法示意如下

>>> "name : %s, age: %d" % ("andy", 24)

"name : andy, age: 24"%标识需要替换的变量位置,其中%s表示输出字符串,%d对应整数,后面为对应变量构成的元组。

百分号之后可以添加很多的修饰符号,按照顺序,列表如下

mapping key,由圆括号包围的字符串,比如(some),此时,后面的变量用字典来表示,用法如下

conversion flags, 转换标志,用来控制对应方式等

minimum filed width, 字段宽度的最小值,如果待格式化的字符串长度小于该值,则进行填充

precision, 精度,以小数点加数字的格式进行标记,比如保留小数点后4位.4

conversion type, 需要转换的变量的类型,支持多种类型,常用的包括表示字符串的%s, 表示整数的%d, 表示浮点数的%f, 表示百分比号的%%

mapping key的用法如下

>>> "name : %(name)s, age: %(age)d" % {"name" : "andy", "age" : 24}

"name : andy, age: 24"conversion flag取值范围包括 0, -, ,,+ 等,常和minimum filed width连用来发挥作用,用法如下

# 5表示最小长度,默认空格填充,右对齐

>>> "age: %5d" % (24)

"age: 24"

# 0表示用0填充,仅针数值

>>> "age: %05d" % (24)

"age: 00024"

# 空格表示在输出字符串前添加一个空格

>>> "age: % 05d" % (24)

"age: 0024"

# 负号将对齐方式变为左对齐

>>> "age: %-5d" % (24)

"age: 24 "

# 加号表示在正数前添加正好,在负数前添加负号

>>> "age: %+5d" % (24)

"age: +24"

>>> "age: %+5d" % -(24)

"age: -24"precision控制显示的精度,主要用于控制浮点数,用法如下

# 默认小数点后6位

>>> "age: %f" % (3.1415)

"age: 3.141500"

# 通过精度修改为后两位

>>> "age: %.2f" % (3.1415)

"age: 3.14"2. format方法

format方法是字符串内置的方法,支持更加强大和灵活的格式化,用大括号{}作为占位符,基本用法如下

>>> "name:{}, age: {}".format("andy", 24)

"name:andy, age: 24"默认情况下,根据每个大括号的索引,将后面元组中的值依次带入,上面的写法等价于

>>> "name:{0}, age: {1}".format("andy", 24)

"name:andy, age: 24"除了位置索引,还可以用类似mapping key的方法,用法如下

>>> "name:{name}, age: {age}".format(name = "andy", age = 24)

"name:andy, age: 24"

>>> "name:{name}, age: {age}".format(age = 24, name = "andy")

"name:andy, age: 24"该方法的好处就是元组中的元素可以乱序,除了简单替换,该方法也支持格式化,在大括号中添加各种修饰符来实现,修饰符放在冒号:后面,按照顺序,列表如下

fill,指定填充用的字符,默认为空格

align, 控制对齐方式,<表示左对齐,>表示右对齐,^表示居中,=表示在符号之后,数字之前进行填充,比如输出+00025这种形式

sign, 只针对数值类型,在输出字段前添加负号,+表示添加正数前添加正号,负数前添加负号,-表示只有负数前添加负号,空格表示添加正数前添加空格,负数前添加负号

width,字符串最小宽度,如果待格式化的字符串长度小于该值,则进行填充

grouping_option, 只针对数值类型, 分组标识符,,表示

precision,精度

type, 类型很多,常用的整数对应d, 浮点数对应f, 字符串对应s, 百分号对应%

fill. align, width常连用来发挥作用,用法如下

# 字符串默认左对齐

>>> "name:{:6}".format("andy")

"name:andy "

# 数值默认右对齐

>>> "age:{:6}".format(24)

"age:24"

# 指定填充字符,对齐方式

>>> "name:{:A<6}".format("andy")

"name:andyAA"sign和grouping_option的用法如下

# sign

>>> "age:{:+}".format(24)

"age:+24"

>>> "age:{:+}".format(-24)

"age:-24"

>>> "age:{:-}".format(24)

"age:24"

>>> "age:{:-}".format(-24)

"age:-24"

>>> "age:{: }".format(-24)

"age:-24"

>>> "age:{: }".format(24)

"age:24"

# grouping_option

# 用逗号分隔千分位

>>> "number:{:,}".format(1000000)

"number:1,000,000"

# 用下换线分隔

>>> "number:{:_}".format(1000000)

"number:1_000_000"除了冒号修饰符,还支持实现对参数进行转换,用感叹号!加修饰符表示,用法如下

# 相当于调用repr函数

>>> "name:{!r}".format("andy")

"name:"andy""

# 相当于调用ascii函数

>>> "name:{!a}".format("andy")

"name:"andy""

# 相当于调用str函数

>>> "name:{!s}".format("andy")

"name:andy"感叹号修饰符仅支持上述三种转换,需要注意的是,感叹号和冒号修饰符不可连用。

3. f-string

在python3.6版本引入的新功能, 在字符串前面添加f前缀,同样用大括号作为占位符,与format方法不同的是,直接在大括号内书写需要格式化的变量,基本用法如下

>>> name = "andy"

>>> age = 24

>>> f"name:{name}, age:{age}"

"name:andy, age:24"在变量名之后,和format方法类似,也支持感叹号对应的转换操作,和冒号开头的格式说明符,而且语法完全相同,示意如下

>>> f"name:{name:A<6}"

"name:andyAA"f-string把变量和对应的格式化操作同时绑定在了一个大括号中,而format方法则分隔成了前后两个部分。单就从格式化的效率来看,f-string的运行速度更快。

f-string更加强大的地方,可以直接将表达式写在大括号里,用法如下

# 调用简单函数

>>> f"name:{name.upper():a<6}"

"name:ANDYaa"

# 自定义函数

>>> f"name:{(lambda x: x.upper())(name):a<6}"

"name:ANDYaa"这样,可以进一步减少代码量。如果你的python版本在3.6以上,建议使用f-string来格式化字符串。

上一篇:Empire C:游戏篇(1)


下一篇:boost的named_mutex的一些坑