Document

Input and Output - formatted-string-literals | python docs

Python format 格式化函数 | 菜鸟教程

使用 f-strings

f-strings 是 Python 从 3.6 版本开始引入的一种字符串格式化方式,其全称为“格式化字符串字面量”。f-strings 使用更加简洁的语法,并且具有更高的可读性和性能。

f-strings 的语法使得可以直接在字符串中使用 {} 嵌入变量和python表达式,并允许在 : 后添加格式化字符说明。

1
2
3
name, age, height = "zhang", 18, 1.7
print(f"My name is {name}, I'm {age} years old and {height:.2f} meter tall.")
# My name is zhang, I'm 18 years old and 1.70 meter tall.
1
2
3
4
5
6
7
decimals = [1/deno for deno in range(1, 10)]
print(decimals)
# [1.0, 0.5, 0.3333333333333333, 0.25, 0.2, 0.16666666666666666, 0.14285714285714285, 0.125, 0.1111111111111111]
print([f'{num:0.4f}' for num in decimals])
# ['1.0000', '0.5000', '0.3333', '0.2500', '0.2000', '0.1667', '0.1429', '0.1250', '0.1111']
print([float(f'{num:0.4f}') for num in decimals])
# [1.0, 0.5, 0.3333, 0.25, 0.2, 0.1667, 0.1429, 0.125, 0.1111]

语法

在冒号 : 后面加上 format specification 形如 f":format_specification" 格式,用于规范输出的格式。详细的参数如下:

1
format_spec ::=  ":[[fill]align][sign][#][0][width][,][.precision][type]"

关于其中参数可选项的说明:

1
2
3
4
5
6
fill        ::=  Any Character
align ::= "<" | ">" | "=" | "^"
sign ::= "+" | "-" | " "
width ::= integer
precision ::= integer
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

align 对齐方式

可选项

符号 描述 示例
< 左对齐 f"{42:<5}" → 42
> 右对齐 f"{42:>5}" → 42
^ 居中对齐 f"{42:^5}" → 42
= 填充符紧跟符号 f"{-42:=+5}" → -0042

sign 符号

表示是否需要在数字前面加正负号+-,其中 + 只对正数和 0 有效果,对负数不起作用;负数默认会带上 - 号,所以 - 并没有额外添加的必要;空格 " " 表示在正数和 0 前面加空格,用于占位,目的是和符数的 - 对齐。

1
2
3
4
print(f"{42:^}")   # 42
print(f"{-42:^}") # -42
print(f"{42:^ }") # 42
print(f"{42:^+}") # +42

width 宽度 fill 填充

宽度控制输出的最小长度,不足时用填充字符补齐。这个宽度表示当前 {...} 输出一共占多少字符,包括 .% 等字符。

填充字符可以是任何 Character,不填则默认为空格。

1
2
print(f"{3.14:0>8.2f}")  # 00003.14
print(f"{3.14:_>8.2f}") # ____3.14

数字格式

数字格式化用于控制整数和浮点数的显示形式。

整数类型

符号 描述 示例
d 十进制整数 f"{42:d}" → 42
b 二进制 f"{42:b}" → 101010
o 八进制 f"{42:o}" → 52
x 十六进制(小写) f"{42:x}" → 2a
X 十六进制(大写) f"{42:X}" → 2A
n 本地化的十进制(带分隔符) f"{1000:n}" → 1,000

浮点数类型

符号 描述 示例
f 定点小数表示法 f"{3.14159:.2f}" → 3.14
e 科学计数法,小写 e f"{1234.567:e}" → 1.234567e+03
E 科学计数法,大写 E f"{1234.567:E}" → 1.234567E+03
g 根据值自动选择 f 或 e f"{0.00001:g}" → 1e-05
% 百分比表示法,自动乘以 100 f"{0.12345:.2%}" → 12.35%

一些示例

1
2
3
4
5
6
7
8
pis = [3.1415926*i for i in range(4)]
for pi in pis:
print(f"|{pi:x^+#012,.2f}|{pi:^10.4f}|{pi:>10.2%}|")
# |xxx+0.00xxxx| 0.0000 | 0.00%|
# |xxx+3.14xxxx| 3.1416 | 314.16%|
# |xxx+6.28xxxx| 6.2832 | 628.32%|
# |xxx+9.42xxxx| 9.4248 | 942.48%|
# \____12____/ \___10___/ \___10___/

技巧

使用 = 号简化输出

使用 f"{var = }" 这种语法可以简化变量的输出,等价于 f"var = {var}"。其中 = 号两边加不加空格会对应到输出中。

1
2
3
4
5
pi = 3.14
print(f"{pi = }")
# pi = 3.14
print(f"{type(pi)=}")
# type(pi)=<class 'float'>

多行书写

1
2
print(f"pi: {3.1415926}\n"
f"e: {2.71828}")

numpy.set_printoptions

使用 numpy.set_printoptions 可以统一设置 numpy array 输出格式, 而不需要单独对每一个 array 元素进行 f-string 的格式化

1
2
3
4
import numpy as np
np.set_printoptions(precision=4)
print(np.array([3.14159265, 2.71828182]))
# [1.23 6.79]
1
2
3
4
5
import numpy as np
np.set_printoptions(formatter={'float_kind': lambda x: f"{x:.2f}%"})
data = np.array([0.12345, 0.6789, 0.00123])
print(data)
# [12.35% 67.89% 0.12%]