python格式化输出详解(占位符:%、format、f表达式)——上篇理论篇0 - 占位符介绍
要实现字符串的拼接,使⽤占位符是的⼀种⾼效、常⽤的⽅式。
举个例⼦,下⾯是不使⽤占位符的⼀种写法,直接使⽤加号拼接字符串
name = "Li hua"
age = 24
print("Hello "+name+", you are " + str(age) + " years old")
换成使⽤占位符的,可以写为
name = "Li hua"
age = 24
print("Hello %s, you are %d years old" % (name, age))
其中%s、%d便是占位符,顾名思义,其作⽤就是替后⾯的变量站住这个位置,
字符串后⾯的%是⼀个特殊的操作符,该操作符会将后⾯的变量值,替换掉前⾯字符串中的占位符。
对⽐两种写法,会发现使⽤占位符可以
将字符串中⽤到变量集中在⼀起,⽅便查和修改
避免了反复使⽤引号,导致的引号对应识别困难
能够更直接通顺的看出句⼦的内容
实际上,占位符的优点还有很多,具体可以在下⾯的使⽤中去体会。
⽬前常⽤的占位符写法有三种
%
format
f表达式
每种⽅法下,占位符的写法和意思⼜有不同。
下⾯依次介绍下这三种并给出⼏个使⽤⽰例。
1 - %
参考⽂献:
上⽂已介绍过,%是⼀个特殊的操作符,该操作符会将后⾯的变量值,替换掉前⾯字符串中的占位符。
其详细语法格式如下:
"... %[key][flags][width][.precision][length type]conversion type ..." % values
其中
%[key][flags][width][.precision][length type]conversion type
是该⽅法下,占位符详细语法的格式。
依次介绍下上⾯占位符每个符号每个字段的意思
%: 必须要有的符号。它标记占位符的开始。
key: 选填。映射的键,由带括号的字符序列组成,⼀般⽤于后⾯的values是是字典的场景。
flags: 选填。转换标志(Conversion flags), 会影响某些转换类型的结果。
width: 选填。最⼩字段宽度。如果指定为“*”(星号),则实际宽度从值中元组的下⼀个元素读取,要转换的对象位于最⼩字段宽度和可选精度之后。
precision: 选填。精度,写法为.precision(点+精度)。如果指定为“*”(星号),则实际宽度从值中元组的下⼀个元素读取,要转换的值位于精度之后。
length type: 选填。长度修改器。
Conversion type: 必须要有的符号。转换类型,也标记占位符的开始。
下⾯依次使⽤⼀个⼩⽰例展⽰下上⾯每个字段的⽤法
Conversion type
由于这个字段是必选字段,所以最先介绍(%写法是固定的,Conversion type则必须要选择⼀个转换类型)
类型有很多,只介绍三个⾮常常⽤的,(更多的建议查阅官⽅⽂档:)
Conversion type说明
s字符串(使⽤str()⽅法转换任何Python对象)
d⼗进制整数
f⼗进制浮点数(⼩数), ⾃动保留六位⼩数。
⽰例:
>>> "%s %s %s" % ("hello", 3, 3.1415)
'hello 3 3.1415'
>>> "%s %d %d" % ("hello", 3, 3.1415)
'hello 3 3'
>>> "%s %d %f" % ("hello", 3, 3.1415)
'hello 3 3.141500'
>>> "%s %f %f" % ("hello", 3, 3.1415)
'hello 3.000000 3.141500'
观察上⾯的⽰例,不难看出s是⼀个⾮常通⽤的类型,所以很多不讲究的场景,Conversion type我通通都⽤s。
precision
对于有⼩数的场景,设置精度是基本操作。
其写法为.precision(点+精度)。
不设置的话,浮点数默认精度值是6。
⽰例如下
>>> '%f' % 3.14
'3.140000'
>>> '%.1f' % 3.14
'3.1'
>>> '%.2f' % 3.14
'3.14'
>>> '%.3f' % 3.14
'3.140'
>>> '%.4f' % 3.14
'3.1400'
⼀般来说,%操作符下占位符了解到这⾥就够了,下⾯的是⽐较少⽤的⽣僻内容。⽽且也不实⽤,复杂的对齐操作推荐使⽤format或f表达式。
key (不常⽤)
这个选填字段是搭配字典格式的values使⽤的
⽰例如下
>>> "%(name)s %(age)s" % {"name": "Lihua", "age": 20}
'Lihua 20'
>>> "%(name)s %(age)s" % ({"name": "Lihua", "age": 20})
'Lihua 20'
>>> "%(0)s %(1)s" % ("Lihua", 20)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: format requires a mapping
flags (不常⽤)
该类型可选择的值有:#、0、-、、+;
这⾥只介绍其中⼏种,(更多的建议查阅官⽅⽂档:)
flags说明
0数值的转换将被零填充,需搭配width使⽤(⽰例见下⾯的width中的)。
-转化结果左对齐,需搭配width使⽤(⽰例见下⾯的width中的),该标志符会覆盖0标志符。
空格, 在带符号的转换产⽣的正数(或空字符串), 之前留⼀个空格(⽅便正负数最后对齐)。
+转换数字后,数字前⾯将会展⽰其正负号(“+”或“-”), 该标志符会覆盖标志符。
⽰例如下
>>> "% d %+d" % (1234, 1234)
' 1234 +1234'
>>> "% d %+d" % (-1234, -1234)
'-1234 -1234'
width
设置字段的最⼩占位宽度,默认右对齐,内容不够时使⽤空格填充。
>>> "%4d,%6d,%10f" % (12, 1234, 3.14)
' 12, 1234, 3.140000'
>>> "%04d,%06d,%010f" % (12, 1234, 3.14) # use '0' flag
'0012,001234,003.140000'
>>> "%-4d,%-6d,%-10f" % (12, 1234, 3.14) # use '-' flag
'12 ,1234 ,3.140000 '
>>> "%0-4d,%0-6d,%0-10f" % (12, 1234, 3.14) # '-' flag will override '0' flag
'12 ,1234 ,3.140000 '
length type (使⽤⽅式未知)
2 - format
str.format()是Python2.6开始的新功能,是字符串格式化⽅法之⼀,它允许多个替换、值格式化。
这个⽅法允许我们通过位置,格式化连接字符串中的元素。
这个⽅法是⼀个⾮常实⽤且强⼤的⽅法。
对于复杂的对齐要求,⾸选该⽅法。
其总的语法格式如下
"... {[field_name][!conversion][:format_spec]} ...".format(arguments)
arguments
⾸先介绍下arguments,其有两种情况:
位置参数(Positional Arguments)
>>> "{} {}".format("Li hua", 24)
'Li hua 24'
>>> "{0} {1} {1} {0}".format("Li hua", 24)
'Li hua 24 24 Li hua'
>>> "{} {} {} {}".format("Li hua", 24)
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: tuple index out of range
关键字参数(Keyword Arguments)
>>> "{name} {age}".format(name="Li hua", age=24)
'Li hua 24'
>>> "{name} {age} {age} {name}".format("Li hua", 24)
'Li hua 24 24 Li hua'
>>> "{} {}".format(name="Li hua", age=24)
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: tuple index out of range
补充:其实位置参数和关键字参数可以混⽤,但是不推荐
然后介绍下该语法下的占位符格式:
{[field_name][!conversion][:format_spec]}
field_name: 选填。字段名,常使⽤其基础格式arg_name来指定使⽤arguments哪⼀个。
对于关键词参数,arg_name必须为其中的关键字,(此时该字段是必填项)
⽐如"{name} {age}".format(name="Li hua", age=24)
对于位置参数,arg_name必须为序号,(此时该字段可不填,不填则默认第⼀个为0,从前往后依次+1)
⽐如"{0} {1}".format("Li hua", 24),"{} {}".format("Li hua", 24)
两者效果⼀样。
拓展:该字段完整语法格式为arg_name(.attribute_name | [element_index])*,是在arg_name对应的值为对象、列表或字典时使⽤,获取其进⼀步的属性值或者内部值。这⾥举⼀个例⼦:
>>> "{0[name]} {0[age]}, {1[0]} {1[1]}".format({"name": "Li hua", "age": 24}, ["Zhang san",24])
'Li hua 24, Zhang san 24'
conversion
选填。变换,不常⽤。
指定时要⽤!来开头,指定后会在格式化之前将arguments中对应的值进⾏类型变换。
其有三个值可以指定,分别为
conversion说明
s调⽤结果对象的str⽅法进⾏转换
r调⽤结果对象的repr⽅法进⾏转换
a调⽤结果对象的ascii⽅法进⾏转换
format_spec
选填,格式化具体规范,核⼼内容,超常⽤。
填写时要⽤:来开头,填写后,会按照其指定的规则来进⾏格式化。
其详细语法为
[[fill]align][sign][#][0][width][grouping_option][.precision][type]
其中所有字段均为选填,下⾯依次介绍下(其中加粗的为常⽤),
fill: 填充内容,如果指定了宽度,但变量长度不够,会使⽤该字段值进⾏填充。设置了fill,后⾯必须显式设置align。
align: 对齐⽅式,有以下值:
align说明
<;强制左对齐(绝⼤多数对象默认使⽤)
sign: 符号展现格式,仅对数字类型有效。有以下值:
#: 复杂⽣僻,基本不使⽤,不介绍,有需要的可查阅官⽅⽂档(见本部分开头)。
0: 当没有设置对齐⽅式align 时, 在宽度字段前⾯加⼀个零('0')字符,将等价于填充字符fill 为0且对齐⽅式align 为<。
width: 最⼩字段宽度,不设置则字段宽度将始终与填充它的数据长度相同(此时对齐⽅式align 没有意义)。grouping_option: 分组选择,有两个选项可选:
precision: 精度,指定时要⽤.来开头,是⼀个⼗进制数,指定⽤'f'和'f'格式化的浮点值在⼩数点后应该显⽰多少位,即保留⼏位⼩数。
type: 类型,决定数据应该如何显⽰。有很多值,这⾥只介绍⼏个常⽤的:
补充说明1: fill, align只有设置了width才能⽣效。
简单⽰例
>>> "{:4}{:6},{:10}".format("1", "2", 3.14) # set width
'1 2 , 3.14'
>>> "{:4}{:>6}, {:^10}".format("1", "2", 3.14) # set width, align
'1 2, 3.14 '
>>> "{:_<4}{:0>6}, {:^10}".format("1", "2", 3.14) # set width, align, fill
'1___000002, 3.14 '
>>> "{:_<4}{:0>6}, {:^10.4f}".format("1", "2", 3.14) # set width, align, fill, precision, type
'1___000002, 3.1400 '
3 - f 表达式
这是从Python 3.6开始的⼀个新功能。
f表达式(f-string), ⼜名(formatted string literal), 是前缀为“f”或“f”, ⽤花括号{}包裹替换字段的字符串⽂字。
其简易格式为: f'{name} is {age} years old'。
其中花括号{}包裹的是替换字段replacement_field ,相当于上⾯的占位符,
但是不同于占位符是先占住位置最后标明变量进⾏替换,f表达式⾥的替换字段直接在花括号⾥⾯进⾏变量替换。
上⾯的例⼦就是⽤name 变量值替换{name}字段,⽤age 变量值替换{age}字段。
f表达式详细格式为:
f'(literal_char | {{ | }} | replacement_field)*'
F'(literal_char | {{ | }} | replacement_field)*'
以上说明f表达式中的字符串内容,是由任意个literal_char 、{{、}}、replacement_field ⾃由组成的。
其中literal_char是除花括号{}外的任意字符或空。
f表达式中要表⽰花括号{}⽂本,需要进⾏转义,转义⽅式为{{, }},
replacement_field 是替换字段,是f 表达式的核⼼。
<
强制左对齐(绝⼤多数对象默认使⽤)>
强制右对齐(数字类型默认使⽤)=
强制将填充内容放在符号(如果有)之后但数字之前,⽐如输出成+000000120这样的格式。此对齐选项仅对数字类型有效。(当'0'紧接在字段宽度width 之前时,它将成为默认值。)^强制居中对齐
sign
说明+
正数负数都展现符号,正数⽤+,负数⽤-。-(默认值),仅负数展现符号。
负数展现符号,正数前⾯使⽤⼀个空格来占位对齐。
grouping_option
说明,
表⽰使⽤逗号作为千位分隔符。_复杂⽣僻,基本不使⽤,不介绍.
type
说明s
字符串格式。这是字符串的默认类型,可以省略(不填)d
⼗进制整数f ⼗进制浮点数(⼩数), 默认保留六位⼩数字符串截取拼接不固定
其格式为
{f_expression[=][!conversion][:format_spec]}
替换字段由花括号包裹
f_expression: 必填内容,常规Python表达式,⼀般要被圆括号包围,只有少数注意事项:
不允许使⽤空表达式。
lambda和赋值表达式:=必须⽤显式括号括起来。
替换表达式可以包含换⾏符(例如在三重引号字符串中),但不能包含注释。
每个表达式在格式化字符串⽂本出现的上下⽂中按从左到右的顺序进⾏计算。
其完整格式为:
(conditional_expression | * or_expr) (, conditional_expression | , * or_expr)* [,] | yield_expression
=: 选填(3.8新版功能), 在表达式后添加等号'=', 可以显⽰表达式⽂本及其求值后的值(在调试中很有⽤),。
conversion: 选填。转换,指定时要在开头添加!,指定后对表达式求值的结果在格式化之前进⾏转换。
下⽅⽰例中, name = "Ståle"
conversion说明⽰例输出
s对结果调⽤str()⽅法f"His name is {name!s}."'His name is Ståle.'
r对结果调⽤repr()⽅法f"His name is {name!r}.""His name is 'Ståle'."
a对结果调⽤ascii()⽅法f"His name is {name!a}.""His name is 'St\xe5le'."
format_spec: 格式规范,和本⽂第⼆部分format中的format_spec格式规范是⼀样的。
不过这⾥的可以嵌套使⽤replacement_field指定其中的值。
>>> line = "The output will have the expression text"
>>> f"{line = }" # use "=" sign, require python 3.8 or above
'line = "The output will have the expression text"'
>>> width = 10
>>> precision = 4
>>> value = 12.34567
>>> f"result: {value:{10}.{4}}" # set format_spec
'result: 12.35'
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论