近期看一些框架的文档时发现, python的
f-strings
有
f"{xxx!r}"
的写法, 就官网看了一波文档, 特此记录一下, 顺便完善一下
f-strings
的使用
f-strings的由来
目前, python有三种字符串格式化方法:
%
/
format
/
f-strings
, 简单使用见: Python格式化输出
f-strings
主要是有人认为
%
和
format
使用起来太麻烦了而提出的. 由于
f-strings
晚于
%
和
format
, 所以
f-strings
既有
%
方法的简便, 又有
format
方法的强大.
详见: PEP 498 — Literal String Interpolation
总的来说,
f-string
在功能方面不逊于其余两种方法,同时性能又优于二者,且使用起来也更加简洁明了但需要注意的是, python的版本不低于
3.6
f-strings的使用
语法
格式如下:
f"<text>{<key> <optional !s,!r,!a> <optional :[填充][对齐][宽度][数字分隔][精度][类型]>}<text> ... "
>>> name = "lczmx">>> age = 20>>> score = 59.99>>> f"student name {name}, age {age}, score {score}"\'student name lczmx, age 20, score 59.99\'>>> f"student name {name}, age {age}, score {score:.1f}"\'student name lczmx, age 20, score 60.0\'
{}
里面的格式和
format
方法一致, 这里: format 方法
例子
一般使用
>>> name = "lczmx">>> f"username: {name}"\'username: lczmx\'
!s/!r/!a
使用
!s
在表达式上调用
str()
,
!r
调用表达式上的
repr()
,
!a
调用表达式上的
ascii()
关于
ascii
, 见: ascii()
>>> class A:... def __str__(self):... return "str A对象"... def __repr__(self):... return "repr A对象"...>>> a_obj = A()>>> f"str: {a_obj!s} repr: {a_obj!r} ascii: {a_obj!a}"\'str: str A对象 repr: repr A对象 ascii: repr A\\\\u5bf9\\\\u8c61\'
{=}
表达式
>>> name = "lczmx">>> f"{name=}""name=\'lczmx\'">>> f"{name=!s}"\'name=lczmx\'>>> f"{name =: >7}"\'name = lczmx\'
其他例子
# {index/key:[填充][对齐][宽度][数字分隔][精度][类型]}name = "lczmx"# ############## 填充 + 对齐 + 宽度# lczmx---------------print(f"{name:-<20}")# -------lczmx--------print(f"{name:-^20}")# ---------------lczmxprint(f"{name:->20}")# ############## 数字分隔符number = 123456789# 123,456,789print(f"{number:,}")# 123_456_789print(f"{number:_}")# ############## 精度pi = 3.1415926# pi = 3.14print(f"{pi = :.2f}")# pi = 3print(f"{pi = :.0f}")# ############## 类型转换num = 15# 1111print(f"{num:b}")# 17print(f"{num:o}")# 15print(f"{num:d}")# fprint(f"{num:x}")# 0xfprint(f"{num:#x}")# 0XFprint(f"{num:#X}")value = 0.452# 45.2%print(f"{value:.1%}")# 1.23e+08print(f"{number:.2e}")
更多语法, 见: 格式规格迷你语言
与
datetime
结合
和
.strftime()
的格式一样, 这里用一个表格列出了
格式描述符 | 含义 | 显示样例 |
---|---|---|
%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 datetimet = datetime.datetime.now()# the time is 2021-12-11 12:05:02print(f\'the time is {t:%Y-%m-%d %X}\')
调用方法
f-strings
可以在
{}
中像正常的python代码一样使用
data = {"username": "lczmx","password": "123456"}# username = lczmx, password = 123456print(f"username = {data[\'username\']}, password = {data.get(\'password\')}")