前言

我们在使用print输出结果的时候,有时候会需要指定特定的格式。比如打印保留两位小数,这时候可能会直接想到round方法将结果多进行一次处理。事实上还有更简单的格式化方法。

1
print(f'{num1:.2f}')

本篇博客会总结一些常用的输出格式化形式。

大数字格式化

假设你定义了一个值为10000000000的变量。如果直接输出的话非常不直观,因为你很难一次性看清到底有多少个零。

在生活中我们常见处理方法是每三个零添加一个分隔符,如10,000,000,000

Python中也提供了相应的方法:

1
2
3
num: int = 10000000000
print(f'{num:,}') # 10,000,000,000
print(f'{num:_}') # 10_000_000_000

事实上默认只支持这两个分隔符

字符串格式化

有时候字符串输出长短不一,为了美观输出,我们通常会使用\t制表符(相当于八个字符长度)来填充字符来达到整齐格式输出的效果。

现在有了更加简便的方法:

1
2
var: str = 'Hello'
print(f'{var:^10}World') # Hello World

其中数字10表示将输出填充到10个字符,假如字符串不到10个字符,默认使用空格进行填充,也可以在冒号后指定符号进行填充,如:_,.,*

中间的符号含义为:

  • ^ 居中对齐
  • < 左对齐
  • > 右对齐

这样可以灵活定制各种输出格式

1
2
3
print(f"{var:_>10}World") # _____HelloWorld
print(f'{var:.<10}World') # Hello.....World
print(f'{var:*^10}World') # **Hello***World

日期格式化

我们使用各种时间库获取的时间都是时间戳的形式,可以使用各种哭将其转化为我们想要的格式

1
2
3
4
5
6
7
8
from datetime import datetime
from babel.dates import format_datetime
from time import strftime

now: datetime = datetime.now()
print(format_datetime(now, 'yyyy-MM-dd HH:mm:ss', locale='en')) # 2024-05-23 16:44:10
print(strftime('%Y-%m-%d %H:%M:%S')) # 2024-05-23 16:44:10
print(datetime.now().strftime('%Y-%m-%d %H:%M:%S')) # 2024-05-23 16:44:10

如果只想输出的话,可以使用更加简单的方法:

1
2
3
4
from datetime import datetime
now: datetime = datetime.now()

print(f'{now:%Y-%m-%d %H:%M:%S}') # 2024-05-23 16:44:10

关键参数的解释:

  • %Y-%m-%d 依次为 年-月-日
  • %H:%M:%S 依次为 时-分-秒 默认为24小时制
  • %p 表示上午或下午的标识,AM 或 PM。
  • %c 表示日期和时间的完整格式,例如:’Tue Aug 16 21:30:00 1988’。
  • %x 表示日期(月/日/年)的格式
  • %I 表示12小时制
  • %H 表示24小时制
  • %A 表示星期

可以使用这些参数灵活输出时间信息。

1
2
3
4
5
6
7
print(f'{now:%Y-%m-%d %I:%M:%S %p}') # 2024-05-23 04:44:10 PM
print(f'{now:%Y-%m-%d}') # 2024-05-23
print(f'{now:%c}') # Tue May 23 16:44:10 2024
print(f'{now:%x}') # 05/23/24
print(f'{now:%A}') # Tuesday
print(f'{now:%I%p}') # 04PM
print(f'{now:%H%p}') # 16PM

浮点数格式化

根据项目要求的精度的不同,我们可能需要不同的精度格式。

1
2
3
4
n: float = 1234.5678
print(f'{n:,.2f}') # 1,234.57
print(f'{n:.2%}') # 123456.78%
print(f'{n:.2e}') # 1.23e+03

甚至支持进制的相互转化

1
2
3
4
5
6
7
8
9
10
11
12
num: int = 10000000000

# 小写16进制
print(f'{num:x}') # 2540be400
# 大写16进制
print(f'{num:X}') # 2540BE400
# 二进制
print(f'{num:b}') # 101111101000000110101000000000000
# 八进制
print(f'{num:o}') # 113705140000
# 十进制
print(f'{num:d}') # 10000000000

奇怪的特性

我们在输出等式的时候一般都会这么做

1
2
3
a:int = 2
b:int = 3
print(f"a+b = {a+b}")

事实上在Python3.8之后引入了一个新的特性,我们可以省去前面的说明文字,直接使用{表达式=}的形式

1
2
3
4
5
6
7
a: int = 5
b: int = 10
my_var: str = 'Format Hit'

print(f"{a+b=}") # a+b=15
print(f"{bool(a) = }") # bool(a) = True
print(f"{my_var = }") # my_var = 'Format Hit'