简介
根据PEP 498,Python从3.6开始支持f-string
语法
初试
import datetime
name = 'XerCis'
age = 23
anniversary = datetime.date(1997, 6, 19)
print(f'My name is {name}, my age next year is {age + 1}, my anniversary is {anniversary:%A, %B %d, %Y}.')
print(f'He said his name is {name!r}.')
# My name is XerCis, my age next year is 24, my anniversary is Thursday, June 19, 1997.
# He said his name is 'XerCis'.
对比
便捷性
f-string
> str.format()
> %s
a = 2
b = 3
print('%d/%d=%f' % (a, b, a / b)) # 2/3=0.666667
print('{}/{}={}'.format(a, b, a / b)) # 2/3=0.6666666666666666
print(f'{a}/{b}={a / b}') # 2/3=0.6666666666666666
print(f'{a}/{b}={(a / b):.2f}') # 2/3=0.67
速度
f-string
> str.format()
> %s
import timeit
a = 1
print(timeit.timeit('%d' % a, number=10 ** 8)) # 1.171477
print(timeit.timeit('{}'.format(a), number=10 ** 8)) # 1.029289
print(timeit.timeit(f'{a}', number=10 ** 8)) # 0.926162
功能
f-string
> str.format()
> %s
兼容性
%s
> str.format()
(Python 2.6+) > f-string
(Python 3.6+)
f-string格式符
格式符 | 功能 |
---|---|
!s | 调用str() |
!r | 调用repr() |
!a | 调用ascii() |
:.2f | 浮点数精度 |
:% | 百分数 |
:.2% | 保留两位的百分数 |
:, | 千位分隔数字 |
:.2e | 科学记数法 |
进制转换
字符串填充
打印时间
import datetime
now = datetime.datetime.now()
ten_days_ago = now - datetime.timedelta(days=10)
print(f'{ten_days_ago:%Y-%m-%d %H:%M:%S}')
print(f'{now:%Y-%m-%d %H:%M:%S}')
# 2020-11-01 12:00:00
# 2020-11-11 12:00:00
更多格式符查看对应数据结构的格式符。
注意:不允许有反斜杠!!!
# print(f"newline: {ord('\n')}") # raises SyntaxError
newline = ord('\n')
print(f"newline: {newline}")
Python 3.8 更强大功能
加=
,自动记录表达式,便于调试
示例1
from datetime import date
user = 'eric_idle'
member_since = date(1975, 7, 31)
print(f'{user=} {member_since=}')
# user='eric_idle' member_since=datetime.date(1975, 7, 31)
示例2
from datetime import datetime
today = datetime(year=2017, month=1, day=27)
print(f'{today=:%B %d, %Y}')
# today=January 27, 2017
推荐使用:
对齐输出
import random
for _ in range(10):
a = ''.join(chr(random.randint(65, 122)) for _ in range(random.randint(1, 10)))
b = ''.join(chr(random.randint(65, 122)) for _ in range(random.randint(1, 10)))
print(f'{a.ljust(50)} : {b.rjust(50)}')
# HdsrEuCCc : ]Q
# g^SYe_l : Ipn
# bX_HkmGL^ : L
# XZlO] : ryWmKmQ
# rDx : cuD
# cM^a[ : LV
# kNBm : z
# H]MgL_usD : LMdFiK
# K : mFJ
# NMFN : eeyR[
总结
f-string
不允许用反斜杠,在需要换行、制表符时不适用,str.format()
较为通用