Python f-string 详解 f-string 是从Python 3.6开始引入的一个特性,目的是简化 format()
函数字符串格式化输出。
根据 f-string官方文档 的描述,完整的语法描述如下:
1 2 3 4 5 6 7 8 f_string ::= (literal_char | "{{" | "}}" | replacement_field)* replacement_field ::= "{" f_expression ["=" ] ["!" conversion] [":" format_spec] "}" f_expression ::= (conditional_expression | "*" or_expr) ("," conditional_expression | "," "*" or_expr)* ["," ] | yield_expression conversion ::= "s" | "r" | "a" format_spec ::= (literal_char | replacement_field)* literal_char ::= <any code point except "{" , "}" or NULL>
PEP 498 – Literal String Interpolation
基本用法 1 2 3 4 >>> name = 'Kevin' >>> age = 18 >>> print (f'{name} is {age} years old.' )Kevin is 18 years old.
之所以叫做f-string,是因为使用时有一个前缀f
, 也可以使用F
,比如 f'...'
或者F'...'
,引用变量时,变量放在 {}
之间。f-string本身还是一个字符串,所以可以使用单引号'
,双引号""
,以及三引号"""
或者 '''
1 2 3 4 5 6 >>> print (F'{name} is {age} years old.' )Kevin is 18 years old. >>> print (f"{name} is {age} years old." )Kevin is 18 years old. >>> print (f"""{name} is {age} years old.""" )Kevin is 18 years old.
格式化控制 f-string输出变量值时,可以在 {}
之间使用 :
来进一步控制输出格式。
输出左对齐,居中,右对齐 1 2 3 4 5 6 7 >>> s = 'python' >>> print (f'left: {s:*<20 } ' ) left: python************** >>> print (f'right: {s:*>20 } ' )right: **************python >>> print (f'center: {s:*^20 } ' )center: *******python*******
补零 1 2 3 >>> salary = 123456789 >>> print (f'zero padding: {salary:018} ' ) zero padding: 000000000123456789
千分位分隔符 1 2 3 4 5 6 7 8 9 >>> salary = 123456789.15556345 >>> print (f'comma: {salary:,} ' ) comma: 123 ,456 ,789.15556344 >>> print (f'comma: {salary:_} ' ) comma: 123_456_789.15556344 >>> print (f'comma: {salary:,.2 f} ' ) comma: 123 ,456 ,789.16 >>> print (f'comma: {salary:018,.2 f} ' ) comma: 000 ,123 ,456 ,789.16
二进制,八进制,十六进制表示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 >>> i = 255 >>> print (f'bin : {i:b} ' ) bin : 11111111 >>> print (f'oct : {i:o} ' ) oct : 377 >>> print (f'hex(lower): {i:x} ' ) hex (lower): ff>>> print (f'hex(upper): {i:X} ' ) hex (upper): FF>>> print (f'bin : {i:08b} ' ) bin : 11111111 >>> print (f'oct : {i:08o} ' ) oct : 00000377>>> print (f'hex(lower): {i:08x} ' ) hex (lower): 000000ff>>> print (f'hex(upper): {i:08X} ' ) hex (upper): 000000FF>>> print (f'bin : {i:#0 10b} ' ) bin : 0b11111111 >>> print (f'oct : {i:#0 10o} ' ) oct : 0o00000377 >>> print (f'hex(lower): {i:#0 10x} ' ) hex (lower): 0x000000ff >>> print (f'hex(upper): {i:#0 10X} ' ) hex (upper): 0X000000FF
小数点保留数字和有效数字
忘了什么是有效数字?
在数学中,有效数字是指在一个数中,从该数的第一个非零数字起,直到末尾数字止的数字称为有效数字,如0.618的有效数字有三个,分别是6,1,8。
1 2 3 4 5 >>> pi = 3.14159265 >>> print (f'小数点: {pi:.3 f} ' ) 小数点: 3.142 >>> print (f'有效数字: {pi:.3 g} ' ) 有效数字: 3.14
科学计数法 1 2 3 4 5 >>> f = 123.45624 >>> print (f'科学计数法: {f:.3 e} ' )科学计数法: 1.235e+02 >>> print (f'科学计数法: {f:.3 E} ' )科学计数法: 1.235E+02
百分数 1 2 3 >>> f = 0.12345 >>> print (f'百分数: {f:.2 %} ' )百分数: 12.35 %
时间日期 1 2 3 4 5 6 7 8 9 >>> from datetime import datetime>>> dt = datetime.now()datetime.datetime(2024 , 7 , 23 , 12 , 46 , 5 , 787642 ) >>> print (f'datetime: {dt} ' )datetime: 2024 -07-23 12 :46 :05.787642 >>> print (f'datetime: {dt:%A, %Y年%m月%d日 %H:%M:%S} ' )datetime: Tuesday, 2024 年07月23 日 12 :46 :05 >>> print (f'datetime: {dt.isoformat()} ' )datetime: 2024 -07-23T12:46 :05.787642
花括号转义 因为花括号已经在f-string中被使用,如果想输出花括号({}
),就使用双重花括号({{}}
)去转义。
1 2 3 >>> n = 123 >>> print (f'{{}}-{n} -{{{n} }}' ){}-123 -{123 }
嵌套变量动态格式控制 1 2 3 4 5 6 7 8 9 >>> pi = 3.14159265 >>> for i in range (5 ):... print (f'pi={pi:.{i} f}' ) ... pi=3 pi=3.1 pi=3.14 pi=3.142 pi=3.1416
等号表达式输出 从Python 3.8开始支持等号表达式的输出。
1 2 3 >>> i = 123 >>> print (f'{i=} ' )i=123
等号表达式中的空格也会保留:
1 2 3 4 5 >>> i = 123 >>> print (f'{i = } ' )i = 123 >>> print (f'{ i = } ' ) i = 123
等号表达式两侧都支持计算:
1 2 3 4 5 >>> i = 123 >>> print (f'{i = :#b} ' )i = 0b1111011 >>> print (f'{i * 2 = } ' )i * 2 = 246
对于列表和字典的动态计算也支持
1 2 3 4 5 6 >>> l = [0 , 10 , 20 ]>>> print (f'{l = } , {l[1 ] = } ' )l = [0 , 10 , 20 ], l[1 ] = 10 >>> d = {'key1' : 10 , 'key2' : 20 }>>> print (f'{d = } , {d["key1" ] = } ' )d = {'key1' : 10 , 'key2' : 20 }, d["key1" ] = 10
lambda
表达式也可以放入{}
中,但为避免 lambda
表达式的分号 :
带来的歧义,应将 lambda
表达式置于圆括号( )
中
1 2 >>> print (f'{(lambda x: x**2 )(10 )} ' )100