Python 3.6引入了一个新的格式化字符串的方法:f-string(formatted string),它可以直接把变量写在字符串中,使得格式化的字符串看起来很直观,下面对f-string进行简单介绍。
f-string的简单使用
name = "admin"
age = 21
print(f"Name: {name}, age: {age}.")
# Name: admin, age: 21.
Python使用小写字母f或者大写字母F来标识一个f-string,在需要插入变量的地方用花括号将变量名括起来即可。如果花括号没有正确对应,那么会产生一个SyntaxError。
表达式及函数调用
f-string支持在花括号内使用表达式、函数调用,lambda等方式对变量进行处理。
print(f"{1 + 2 * 3}")
# 7
import math
print(f"{math.pow(2, 3)}")
# 8.0
print(f"{(lambda x: 2 * x)(3)}")
# 6
使用lambda表达式时需要注意把表达式的定义用括号括起来,否则会报错。
转义字符
如果需要在f-string中使用花括号,则使用 {{ 或者 }} ,两个花括号放在一起即可。其他的转移字符串如双引号 \” 、单引号 \’ 、制表符 \t 、换行符 \n 等与普通字符串一致,但是只能在花括号外转义,在花括号内使用就会报错。
如果希望避免引号产生冲突的话,可以考虑将单引号、双引号和三引号交替进行使用。
格式化
f-string的格式化与Python之前提供的format函数的格式化方法比较接近,因此可以参考format的格式化方法进行学习。格式化的基本语法如下:
pi = 3.1415926
print(f"{pi:.2f}")
# 3.14
在花括号内,使用冒号 : 分隔变量与格式化的描述符,其中.2f表示取浮点数的小数点后两位。
填充/截断
name = "admin 1234"
print(f"{name:_<20}")
# admin 1234__________
print(f"{name:_>20}")
# __________admin 1234
print(f"{name:_^20}")
# _____admin 1234_____
在冒号后面首先指定填充的符号,然后指定对齐方式,最后指定字符串的位数。
也可以指定变量的长度,如果格式化的位数不足变量的长度,那么就会发生截断:
print(f"{name:_>20.100}") # 在.后面指定选取变量的长度,因为100大于10,所以不会截断
# __________admin 1234
print(f"{name:_>20.5}") # 格式化长度不足时就会发生截断
# _______________admin
数字格式化
pi = 3.1415926
print(f"{pi:010.2f}")
# 0000003.14
big = 12345678
print(f"{big:_d}")
# 12_345_678
第一个例子表示字符串全长为10,截取小数点后两位,高位用0补齐。
第二个例子表示将数字各位之间用分隔符分开,可以指定为 , 或者 _ ,具体格式化方法参见附录。
时间/日期格式化
from datetime import date
today = date.today() # datetime.date(2023, 3, 4),是这篇博客的编写时间
print(f"{today:%m-%d %Y}")
# 03-04 2023
格式化描述符的横线不是必选项,可以使用其他符号分隔年月日的不同字段,具体描述符见附录。
附录:格式化描述符速查表
填充/截断描述符
格式描述符 | 含义与作用 |
< | 左对齐(字符串默认对齐方式) |
> | 右对齐(数值默认对齐方式) |
^ | 居中 |
数字格式化描述符
数字符号格式化描述符
格式描述符 | 含义与作用 |
+ | 负数前加负号(-),正数前加正号(+) |
- | 负数前加负号(-),正数前不加任何符号(默认) |
(空格) | 负数前加负号(-),正数前加一个空格 |
数字展示方式描述符
格式描述符 | 含义与作用 |
# | 切换数字显示方式 |
数字类型 | 不加“#”(默认情况) | 加上“#” | 加上后的变化 |
二进制 | 111 1101 | 0b111 1101 | 前面显示“0b” |
八进制 | 175 | 0o175 | 前面显示“0o” |
十进制 | 125 | 125 | 无 |
十六进制 | 7D | 0x7D | 前面显示0X或0x(视原数字是否使用大写字母而定) |
数字分隔描述符
格式描述符 | 含义与作用 |
, | 使用 , 作为千位分隔符 |
_ | 使用 _ 作为千位分隔符 |
其中逗号适用于浮点数、复数和十进制整数;下划线适用于浮点数、复数和所有进制的整数;如果不指定分隔符,那么默认不使用分隔符。
格式描述符
格式描述符 | 含义与作用 | 适用变量类型 |
s | 普通字符串 | 字符串 |
b | 二进制整数 | 整数 |
c | 字符格式,按Unicode编码转换为对应字符 | 整数 |
d | 十进制整数 | 整数 |
o | 八进制整数 | 整数 |
x | 十六进制整数,使用小写字母 | 整数 |
X | 十六进制整数,使用大写字母 | 整数 |
e | 科学计数法,用 e 表示阶数 | 浮点数、复数、整数(自动转换成浮点数) |
E | 与e等价,用 E 表示阶数 | 浮点数、复数、整数(自动转换成浮点数) |
f | 小数,默认精度为6 | 浮点数、复数、整数(自动转换成浮点数) |
F | 与f等价,但将nan和inf转成大写 | 浮点数、复数、整数(自动转换为浮点数) |
g | 通用小数的格式,小数用f;大数用e | 浮点数、复数、整数(自动转换为浮点数) |
G | 与G等价,但使用大写字符 | 浮点数、复数、整数(自动转换为浮点数) |
% | 百分比格式 | 浮点数、整数(自动转换为浮点数) |
宽度描述符
格式描述符 | 含义与作用 |
width | 整数 width 指定宽度 |
0width | 整数 width 指定宽度,开头的 0 指定高位用 0 补足宽度 |
width.precision | 整数 width 指定宽度,整数 precision 指定显示精度 |
其中width适用于字符串,不适用于数字;0width适用于数字,不适用于字符串;width.precision的precision如果用在字符串上,则指定是前n位,如果用在浮点数上,则指定小数点后n位。
时间/日期格式化
格式描述符 | 含义 | 显示样例 |
%a | 星期几,使用缩写 | Sun |
%A | 星期几,使用完整名称 | Sunday |
%w | 星期几,从周日算起,周日为0 | 7 |
%u | 星期几,从周一算起,周日为7 | 6 |
%d | 日期,2位数字 | 04 |
%b | 月份,使用缩写 | Mar |
%B | 月份,使用完整名称 | March |
%m | 月份,2位数字 | 03 |
%y | 年份,后2位数字 | 23 |
%Y | 年份,4位数字 | 2023 |
%H | 小时,24小时制 | 21 |
%I | 小时,12小时制 | 09 |
%p | 上午/下午 | PM |
%M | 分钟,2位数字 | 12 |
%S | 秒钟,2位数字 | 20 |
%f | 微秒,6位数字 | 123321 |
%z | UTC偏移量,±HHMM[SS],未指定时区则返回空字符串 | +1030 |
%Z | 时区名 | CST |
%j | 一年中的第几天,3位数字 | 063 |
%U | 一年中的第几周,2位数字,首个周日后的星期为第0周 | 09 |
%W | 一年中的第几周,2位数字,首个周一后的星期为第0周 | 09 |
%V | 一年中的第几周,2位数字,首个包含1月4日的星期为第1周 | 09 |