使用变量名
f-string用大括号 {} 表示被替换字段,其中直接填入替换内容:
>>> name = 'Eric'
>>> f'Hello, my name is {name}'
'Hello, my name is Eric'
>>> number = 7
>>> f'My lucky number is {number}'
'My lucky number is 7'
>>> price = 19.99
>>> f'The price of this book is {price}'
'The price of this book is 19.99'
懒得再敲一遍变量名
str_value = "hello,python coders"
print(f"{ str_value = }")
# str_value = 'hello,python coders'
直接改变输出结果
num_value = 123
print(f"{num_value % 2 = }")
# num_value % 2 = 1
直接格式化日期
格式描述符 | 含义与作用 | 示例 |
---|---|---|
%a | 星期几(缩写) | ‘Sun’ |
%A | 星期几(全名) | ‘Sunday’ |
%w | 星期几(数字,0 是周日,6 是周六) | ‘0’ |
%u | 星期几(数字,1 是周一,7 是周日) | ‘7’ |
%d | 日(数字,以 0 补足两位) | ‘07’ |
%b | 月(缩写) | ‘Aug’ |
%B | 月(全名) | ‘August’ |
%m | 月(数字,以 0 补足两位) | ‘08’ |
%y | 年(后两位数字,以 0 补足两位) | ‘14’ |
%Y | 年(完整数字,不补零) | ‘2014’ |
%H | 小时(24小时制,以 0 补足两位) | ‘23’ |
%I | 小时(12小时制,以 0 补足两位) | ‘11’ |
%p | 上午/下午 | ‘PM’ |
%M | 分钟(以 0 补足两位) | ‘23’ |
%S | 秒钟(以 0 补足两位) | ‘56’ |
%f | 微秒(以 0 补足六位) | ‘553777’ |
%z | UTC偏移量(格式是 ±HHMM[SS],未指定时区则返回空字符串) | ‘+1030’ |
%Z | 时区名(未指定时区则返回空字符串) | ‘EST’ |
%j | 一年中的第几天(以 0 补足三位) | ‘195’ |
%U | 一年中的第几周(以全年首个周日后的星期为第0周,以 0 补足两位) | ‘27’ |
%w | 一年中的第几周(以全年首个周一后的星期为第0周,以 0 补足两位) | ‘28’ |
%V | 一年中的第几周(以全年首个包含1月4日的星期为第1周,以 0 补足两位) | ‘28’ |
import datetime
today = datetime.date.today()
print(f"{today: %Y%m%d}")
# 20211019
print(f"{today =: %Y%m%d}")
# today = 20211019
>>> from datetime import datetime
e = datetime.now()
'the time is 2021-12-18 10:06:42'
>>> start_time = datetime.now()
>>> f'{start_time = :%F %X}'
start_time = 2021-12-27 18:48:03
2/8/16 进制输出真的太简单
格式描述符 | 含义与作用 |
---|---|
# | 切换数字显示方式 |
注1:仅适用于数值类型。
注2:# 对不同数值类型的作用效果不同,详见下表:
数值类型不加#(默认)加#区别
数值类型 | 不加#(默认) | 加# | 区别 |
---|---|---|---|
二进制整数 | ‘1111011’ | ‘0b1111011’ | 开头是否显示 0b |
八进制整数 | ‘173’ | ‘0o173’ | 开头是否显示 0o |
十进制整数 | ‘123’ | ‘123’ | 无区别 |
十六进制整数(小写字母) | ‘7b’ | ‘0x7b’ | 开头是否显示 0x |
十六进制整数(大写字母) | ‘7B’ | ‘0X7B’ | 开头是否显示 0X |
>>> a = 42
>>> f"{a:b}" # 2进制
'101010'
>>> f"{a:o}" # 8进制
'52'
>>> f"{a:x}" # 16进制,小写字母
'2a'
>>> f"{a:X}" # 16进制,大写字母
'2A'
>>> f"{a:c}" # ascii 码
'*'
格式化浮点数
>>> num_value = 123.456
>>> f'{num_value = :.2f}' #保留 2 位小数
'num_value = 123.46'
>>> nested_format = ".2f" #可以作为变量
>>> print(f'{num_value:{nested_format}}')
123.46
字符串对齐
格式描述符含义与作用
格式描述符 | 含义与作用 |
---|---|
< | 左对齐(字符串默认对齐方式) |
> | 右对齐(数值默认对齐方式) |
^ | 居中 |
>>> x = 'test'
>>> f'{x:>10}' # 右对齐,左边补空格
' test'
>>> f'{x:*<10}' # 左对齐,右边补*
'test******'
>>> f'{x:=^10}' # 居中,左右补=
'===test==='
>>> x, n = 'test', 10
>>> f'{x:~^{n}}' # 可以传入变量 n
'~~~test~~~'
>>>
格式描述符含义与作用
width | 整数 width 指定宽度 |
---|---|
0width | 整数 width 指定宽度,开头的 0 指定高位用 0 补足宽度 |
width.precision | 整数 width 指定宽度,整数 precision 指定显示精度 |
注1:0width 不可用于复数类型和非数值类型,width.precision 不可用于整数类型。
注2:width.precision 用于不同格式类型的浮点数、复数时的含义也不同:用于 f、F、e、E 和 % 时 precision 指定的是小数点后的位数,用于 g 和 G 时 precision 指定的是有效数字位数(小数点前位数+小数点后位数)。
注3:width.precision 除浮点数、复数外还可用于字符串,此时 precision 含义是只使用字符串中前 precision 位字符。
示例:
>>> a = 123.456
>>> f'a is {a:8.2f}'
'a is 123.46'
>>> f'a is {a:08.2f}'
'a is 00123.46'
>>> f'a is {a:8.2e}'
'a is 1.23e+02'
>>> f'a is {a:8.2%}'
'a is 12345.60%'
>>> f'a is {a:8.2g}'
'a is 1.2e+02'
>>> s = 'hello'
>>> f's is {s:8s}'
's is hello '
>>> f's is {s:8.3s}'
's is hel '
千位分隔符相关格式描述符
格式描述符 | 含义与作用 |
---|---|
, | 使用,作为千位分隔符 |
_ | 使用_作为千位分隔符 |
注1:若不指定 , 或 ,则f-string不使用任何千位分隔符,此为默认设置。
注2:, 仅适用于浮点数、复数与十进制整数:对于浮点数和复数,, 只分隔小数点前的数位。
注3: 适用于浮点数、复数与二、八、十、十六进制整数:对于浮点数和复数,_ 只分隔小数点前的数位;对于二、八、十六进制整数,固定从低位到高位每隔四位插入一个 _(十进制整数是每隔三位插入一个 _)。
示例:
>>> a = 1234567890.098765
>>> f'a is {a:f}'
'a is 1234567890.098765'
>>> f'a is {a:,f}'
'a is 1,234,567,890.098765'
>>> f'a is {a:_f}'
'a is 1_234_567_890.098765'
>>> b = 1234567890
>>> f'b is {b:_b}'
'b is 100_1001_1001_0110_0000_0010_1101_0010'
>>> f'b is {b:_o}'
'b is 111_4540_1322'
>>> f'b is {b:_d}'
'b is 1_234_567_890'
>>> f'b is {b:_x}'
'b is 4996_02d2'
使用 !s,!r
>>> x = '中'
>>> f"{x!s}" # 相当于 str(x)
'中'
>>> f"{x!r}" # 相当于 repr(x)
"'中'"
自定义格式
class MyClass:
def __format__(self, format_spec) -> str:
print(f'MyClass __format__ called with {format_spec=!r}')
return "MyClass()"
print(f'{MyClass():bala bala %%MYFORMAT%%}')
输出如下:
MyClass __format__ called with format_spec='bala bala %%MYFORMAT%%'
MyClass()
表达式求值与函数调用
f-string的大括号 {} 可以填入表达式或调用函数,Python会求出其结果并填入返回的字符串内:
>>> f'A total number of {24 * 8 + 4}'
'A total number of 196'
>>> f'Complex number {(2 + 2j) / (2 - 3j)}'
'Complex number (-0.15384615384615388+0.7692307692307692j)'
>>> name = 'ERIC'
>>> f'My name is {name.lower()}'
'My name is eric'
>>> import math
>>> f'The answer is {math.log(math.pi)}'
'The answer is 1.1447298858494002'
引号、大括号与反斜杠
f-string大括号内所用的引号不能和大括号外的引号定界符冲突,可根据情况灵活切换 ’ 和 ":
>>> f'I am {"Eric"}'
'I am Eric'
>>> f'I am {'Eric'}'
File "<stdin>", line 1
f'I am {'Eric'}'
^
SyntaxError: invalid syntax
若 ’ 和 " 不足以满足要求,还可以使用 ‘’’ 和 “”":
>>> f"He said {"I'm Eric"}"
File "<stdin>", line 1
f"He said {"I'm Eric"}"
^
SyntaxError: invalid syntax
>>> f'He said {"I'm Eric"}'
File "<stdin>", line 1
f'He said {"I'm Eric"}'
^
SyntaxError: invalid syntax
>>> f"""He said {"I'm Eric"}"""
"He said I'm Eric"
>>> f'''He said {"I'm Eric"}'''
"He said I'm Eric"
大括号外的引号还可以使用 \ 转义,但大括号内不能使用 \ 转义:
>>> f'''He\'ll say {"I'm Eric"}'''
"He'll say I'm Eric"
>>> f'''He'll say {"I\'m Eric"}'''
File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash
f-string大括号外如果需要显示大括号,则应输入连续两个大括号 {{ 和 }}:
>>> f'5 {"{stars}"}'
'5 {stars}'
>>> f'{{5}} {"stars"}'
'{5} stars'
上面提到,f-string大括号内不能使用 \ 转义,事实上不仅如此,f-string大括号内根本就不允许出现 \。如果确实需要 \,则应首先将包含 \ 的内容用一个变量表示,再在f-string大括号内填入变量名:
>>> f"newline: {ord('\n')}"
File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash
>>> newline = ord('\n')
>>> f'newline: {newline}'
'newline: 10'
多行f-string
f-string还可用于多行字符串:
>>> name = 'Eric'
>>> age = 27
>>> f"Hello!" \
... f"I'm {name}." \
... f"I'm {age}."
"Hello!I'm Eric.I'm 27."
>>> f"""Hello!
... I'm {name}.
... I'm {age}."""
"Hello!\n I'm Eric.\n I'm 27."
lambda表达式
f-string大括号内也可填入lambda表达式,但lambda表达式的 : 会被f-string误认为是表达式与格式描述符之间的分隔符,为避免歧义,需要将lambda表达式置于括号 () 内:
>>> f'result is {lambda x: x ** 2 + 1 (2)}'
File "<fstring>", line 1
(lambda x)
^
SyntaxError: unexpected EOF while parsing
>>> f'result is {(lambda x: x ** 2 + 1) (2)}'
'result is 5'
>>> f'result is {(lambda x: x ** 2 + 1) (2):<+7.2f}'
'result is +5.00 '
原文参考:
https://mp.weixin.qq.com/s/1a5u4QZxdd3V8Z4eJeTA5A
https://blog.csdn.net/sunxb10/article/details/81036693