源地址:添加链接描述

f-string,亦称为格式化字符串常量(formatted string literals),是Python3.6新引入的一种字符串格式化方法,该方法源于PEP 498 – Literal String Interpolation,主要目的是使格式化字符串的操作更加简便。f-string在形式上是以 fF 修饰符引领的字符串(f'xxx'F'xxx'),以大括号 {} 标明被替换的字段;f-string在本质上并不是字符串常量,而是一个在运行时运算求值的表达式:

While other string literals always have a constant value, formatted strings are really expressions evaluated at run time.
(与具有恒定值的其它字符串常量不同,格式化字符串实际上是运行时运算求值的表达式。)
—— Python Documentation

f-string在功能方面不逊于传统的%-formatting语句和str.format()函数,同时性能又优于二者,且使用起来也更加简洁明了,因此对于Python3.6及以后的版本,推荐使用f-string进行字符串格式化。

用法

此部分内容主要参考以下资料:

  • Python Documentation – Formatted String Literals
  • Python Documentation – Format String Syntax
  • PEP 498 – Literal String Interpolation
  • Python 3’s f-Strings: An Improved String Formatting Syntax (Guide)
  • python3 f-string格式化字符串的高级用法
  • Python 3: An Intro to f-strings

简单使用

f-string用大括号 {} 表示被替换字段,其中直接填入替换内容:

>>> name = 'Eric'
>>> f'Hello, my name is {name}'
'Hello, my name is Eric'>>> number = 7
>>> f'My lucky number is {number}'
'My lucky number is 7'>>> price = 19.99
>>> f'The price of this book is {price}'
'The price of this book is 19.99'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

表达式求值与函数调用

f-string的大括号 {} 可以填入表达式或调用函数,Python会求出其结果并填入返回的字符串内:

>>> f'A total number of {24 * 8 + 4}'
'A total number of 196'>>> f'Complex number {(2 + 2j) / (2 - 3j)}'
'Complex number (-0.15384615384615388+0.7692307692307692j)'>>> name = 'ERIC'
>>> f'My name is {name.lower()}'
'My name is eric'>>> import math
>>> f'The answer is {math.log(math.pi)}'
'The answer is 1.1447298858494002'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

引号、大括号与反斜杠

f-string大括号内所用的引号不能和大括号外的引号定界符冲突,可根据情况灵活切换 '"

>>> f'I am {"Eric"}'
'I am Eric'
>>> f'I am {'Eric'}'File "<stdin>", line 1f'I am {'Eric'}'^
SyntaxError: invalid syntax
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

'" 不足以满足要求,还可以使用 '''"""

>>> f"He said {"I'm Eric"}"File "<stdin>", line 1f"He said {"I'm Eric"}"^
SyntaxError: invalid syntax>>> f'He said {"I'm Eric"}'File "<stdin>", line 1f'He said {"I'm Eric"}'^
SyntaxError: invalid syntax>>> f"""He said {"I'm Eric"}"""
"He said I'm Eric"
>>> f'''He said {"I'm Eric"}'''
"He said I'm Eric"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

大括号外的引号还可以使用 \ 转义,但大括号内不能使用 \ 转义:

>>> f'''He\'ll say {"I'm Eric"}'''
"He'll say I'm Eric"
>>> f'''He'll say {"I\'m Eric"}'''File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash
  • 1
  • 2
  • 3
  • 4
  • 5

f-string大括号外如果需要显示大括号,则应输入连续两个大括号 {{}}

>>> f'5 {"{stars}"}'
'5 {stars}'
>>> f'{{5}} {"stars"}'
'{5} stars'
  • 1
  • 2
  • 3
  • 4

上面提到,f-string大括号内不能使用 \ 转义,事实上不仅如此,f-string大括号内根本就不允许出现 \。如果确实需要 \,则应首先将包含 \ 的内容用一个变量表示,再在f-string大括号内填入变量名:

>>> f"newline: {ord('\n')}"File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash>>> newline = ord('\n')
>>> f'newline: {newline}'
'newline: 10'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

多行f-string

f-string还可用于多行字符串:

>>> name = 'Eric'
>>> age = 27
>>> f"Hello!" \
... f"I'm {name}." \
... f"I'm {age}."
"Hello!I'm Eric.I'm 27."
>>> f"""Hello!
...     I'm {name}.
...     I'm {age}."""
"Hello!\n    I'm Eric.\n    I'm 27."
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

自定义格式:对齐、宽度、符号、补零、精度、进制等

f-string采用 {content:format} 设置字符串格式,其中 content 是替换并填入字符串的内容,可以是变量、表达式或函数等,format 是格式描述符。采用默认格式时不必指定 {:format},如上面例子所示只写 {content} 即可。

关于格式描述符的详细语法及含义可查阅Python官方文档,这里按使用时的先后顺序简要介绍常用格式描述符的含义与作用:

对齐相关格式描述符

格式描述符 含义与作用
< 左对齐(字符串默认对齐方式)
> 右对齐(数值默认对齐方式)
^ 居中

数字符号相关格式描述符

格式描述符 含义与作用
+ 负数前加负号(-),正数前加正号(+
- 负数前加负号(-),正数前不加任何符号(默认)
(空格) 负数前加负号(-),正数前加一个空格

注:仅适用于数值类型。

数字显示方式相关格式描述符

格式描述符 含义与作用
# 切换数字显示方式

注1:仅适用于数值类型。
注2:# 对不同数值类型的作用效果不同,详见下表:

数值类型 不加#(默认) # 区别
二进制整数 '1111011' '0b1111011' 开头是否显示 0b
八进制整数 '173' '0o173' 开头是否显示 0o
十进制整数 '123' '123' 无区别
十六进制整数(小写字母) '7b' '0x7b' 开头是否显示 0x
十六进制整数(大写字母) '7B' '0X7B' 开头是否显示 0X

宽度与精度相关格式描述符

格式描述符 含义与作用
width 整数 width 指定宽度
0width 整数 width 指定宽度,开头的 0 指定高位用 0 补足宽度
width.precision 整数 width 指定宽度,整数 precision 指定显示精度

注1:0width 不可用于复数类型和非数值类型,width.precision 不可用于整数类型。
注2:width.precision 用于不同格式类型的浮点数、复数时的含义也不同:用于 fFeE%precision 指定的是小数点后的位数,用于 gGprecision 指定的是有效数字位数(小数点前位数+小数点后位数)。
注3:width.precision 除浮点数、复数外还可用于字符串,此时 precision 含义是只使用字符串中前 precision 位字符。

示例:

>>> a = 123.456
>>> f'a is {a:8.2f}'
'a is   123.46'
>>> f'a is {a:08.2f}'
'a is 00123.46'
>>> f'a is {a:8.2e}'
'a is 1.23e+02'
>>> f'a is {a:8.2%}'
'a is 12345.60%'
>>> f'a is {a:8.2g}'
'a is  1.2e+02'>>> s = 'hello'
>>> f's is {s:8s}'
's is hello   '
>>> f's is {s:8.3s}'
's is hel     '
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

千位分隔符相关格式描述符

格式描述符 含义与作用
, 使用,作为千位分隔符
_ 使用_作为千位分隔符

注1:若不指定 ,_,则f-string不使用任何千位分隔符,此为默认设置。
注2:, 仅适用于浮点数、复数与十进制整数:对于浮点数和复数,, 只分隔小数点前的数位。
注3:_ 适用于浮点数、复数与二、八、十、十六进制整数:对于浮点数和复数,_ 只分隔小数点前的数位;对于二、八、十六进制整数,固定从低位到高位每隔四位插入一个 _(十进制整数是每隔三位插入一个 _)。

示例:

>>> a = 1234567890.098765
>>> f'a is {a:f}'
'a is 1234567890.098765'
>>> f'a is {a:,f}'
'a is 1,234,567,890.098765'
>>> f'a is {a:_f}'
'a is 1_234_567_890.098765'>>> b = 1234567890
>>> f'b is {b:_b}'
'b is 100_1001_1001_0110_0000_0010_1101_0010'
>>> f'b is {b:_o}'
'b is 111_4540_1322'
>>> f'b is {b:_d}'
'b is 1_234_567_890'
>>> f'b is {b:_x}'
'b is 4996_02d2'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

格式类型相关格式描述符

基本格式类型

格式描述符 含义与作用 适用变量类型
s 普通字符串格式 字符串
b 二进制整数格式 整数
c 字符格式,按unicode编码将整数转换为对应字符 整数
d 十进制整数格式 整数
o 八进制整数格式 整数
x 十六进制整数格式(小写字母) 整数
X 十六进制整数格式(大写字母) 整数
e 科学计数格式,以 e 表示 ×10^ 浮点数、复数、整数(自动转换为浮点数)
E e 等价,但以 E 表示 ×10^ 浮点数、复数、整数(自动转换为浮点数)
f 定点数格式,默认精度(precision)是6 浮点数、复数、整数(自动转换为浮点数)
F f 等价,但将 naninf 换成 NANINF 浮点数、复数、整数(自动转换为浮点数)
g 通用格式,小数用 f,大数用 e 浮点数、复数、整数(自动转换为浮点数)
G G 等价,但小数用 F,大数用 E 浮点数、复数、整数(自动转换为浮点数)
% 百分比格式,数字自动乘上100后按 f 格式排版,并加 % 后缀 浮点数、整数(自动转换为浮点数)

常用的特殊格式类型:标准库 datetime 给定的用于排版时间信息的格式类型,适用于 datedatetimetime 对象

格式描述符 含义 显示样例
%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'

综合示例

>>> a = 1234
>>> f'a is {a:^#10X}'      # 居中,宽度10位,十六进制整数(大写字母),显示0X前缀
'a is   0X4D2   '>>> b = 1234.5678
>>> f'b is {b:<+10.2f}'    # 左对齐,宽度10位,显示正号(+),定点数格式,2位小数
'b is +1234.57  '>>> c = 12345678
>>> f'c is {c:015,d}'      # 高位补零,宽度15位,十进制整数,使用,作为千分分割位
'c is 000,012,345,678'>>> d = 0.5 + 2.5j
>>> f'd is {d:30.3e}'      # 宽度30位,科学计数法,3位小数
'd is           5.000e-01+2.500e+00j'>>> import datetime
>>> e = datetime.datetime.today()
>>> f'the time is {e:%Y-%m-%d (%a) %H:%M:%S}'   # datetime时间格式
'the time is 2018-07-14 (Sat) 20:46:02'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

lambda表达式

f-string大括号内也可填入lambda表达式,但lambda表达式的 : 会被f-string误认为是表达式与格式描述符之间的分隔符,为避免歧义,需要将lambda表达式置于括号 () 内:

>>> f'result is {lambda x: x ** 2 + 1 (2)}'File "<fstring>", line 1(lambda x)^
SyntaxError: unexpected EOF while parsing>>> f'result is {(lambda x: x ** 2 + 1) (2)}'
'result is 5'
>>> f'result is {(lambda x: x ** 2 + 1) (2):<+7.2f}'
'result is +5.00  '
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

转载 fstring用法相关推荐

  1. Python中f-string用法

    Python中f-string用法 单行f 先使用官网以及自己测试的小例子来说明使用方法:代码如下: 使用方法: f'{}' 这种写法比较像java中的el表达式,也是采用了大括号的形式进行读取! c ...

  2. 转载--#define 用法

    作者:Jency Lee 链接:http://www.cnblogs.com/Jency/articles/C_Cplusplus_define.html 1.简单的define定义 #define ...

  3. python中f字符串f-string用法详解

    一.f-string字符串用法 1.f字符串用法 f-string: formatted string literals, 格式化字符串常量. 格式化 {} 内容,不在 {} 内的照常展示输出,如果你 ...

  4. [转载]dbms_lob用法小结

    http://blog.sina.com.cn/s/blog_713978a50100prkt.html CLOB里存的是2进制 判定长度   DBMS_LOB.GETLENGTH(col1) 获取文 ...

  5. [转载]QMessageBox 用法

    原文地址:QMessageBox 用法作者:等待黎明 1.怎样对QMessageBox 进行 背景设置? 2.背景设置成功后,又如何设置QMessageBox 上面文字的颜色和按钮的背景色? 3.如何 ...

  6. [转载]QMessageBox 用法_vortex_新浪博客

    原文地址:QMessageBox 用法作者:等待黎明 1.怎样对QMessageBox 进行 背景设置? 2.背景设置成功后,又如何设置QMessageBox 上面文字的颜色和按钮的背景色? 3.如何 ...

  7. [转载] numpy用法(logical_and, nonzero,arange, reshape)

    参考链接: Python中的numpy.logical_not numpy里面有很多数组矩阵的用法,遇到一个就记一个. 1.np.logical_and/or/not (逻辑与/或/非) np.log ...

  8. [转载]SDL 用法,第 5 部分:Pirates Ho! 中界面设计的原则 - 简易性、一致性和引人入胜

    SDL 用法,第 5 部分:"Pirates Ho!" 中界面设计的原则 简易性.一致性和引人入胜 Sam Lantinga Loki Entertainment Software ...

  9. Python中强大的f-string用法介绍

    问题 字符串是开发中最常用的数据类型,尤其是字符串的格式化. f-string相对于其他的字符串格式化方法来说更加的便捷,可以使用f或F,在{}里面可以输出变量.表达式,还可以调用函数,在使用的时候需 ...

最新文章

  1. php隐式提交iframe,Laravel中通过IFrame来模拟页面异步提交
  2. 开始→运行→输入的命令集锦 1
  3. 面试突击第 3 期 | Redis 如何实现查询附近的人?视频实战版
  4. PHP js 点击按钮 切换模版,javascript点击按钮实现隐藏显示切换效果_javascript技巧...
  5. 对计算机硬盘进行格式化时,在安装操作系统之前,如何对硬盘进行分区和格式化(新手必看)...
  6. 小米路由器r2d_小米路由器二代R2D怎样设置无线中继模式
  7. ONIE——开放网络安装环境
  8. c++的size_t
  9. 当酒品牌遇上爱“微醺”的年轻人,会擦出怎样的火花?
  10. 杨森翔人日诗词;人日书法
  11. Kafka-Failover笔记
  12. 一名大学生选择军哥的乾颐堂是如何顺利通过华为HCIE的,又如何应对HCIE面试呢?...
  13. 解释程序与解释程序的缺点,图解——解释程序与编译程序的区别
  14. 按哪个键进入BIOS设置
  15. 基于java的个人日程管理系统mysql
  16. matlab输入数据作方程,用MATLAB函数编写并求解微分方程
  17. SPA项目开发(首页导航左侧菜单)
  18. java 撤销恢复按钮_java文本的撤销和恢复
  19. mysql connector j_MySQL Connector/J
  20. 分享这13个宝藏素材网站给大家,昨天剪辑10个视频挣了800多

热门文章

  1. Android之发送短信的两种方式
  2. 久其修改服务器地址,久其软件服务器地址
  3. 2020-9-12 招银网络科技面经
  4. 52.甲乙混战 (15分)
  5. 黄复贵:从北京理工到今日头条
  6. 【JY】结构概念设计之(隔震概念设计)
  7. 利用大数据挖掘创新市场监管新方式
  8. 车铣复合UG编程 UG车铣编程视频教程 UG车铣复合视频教程
  9. 国内首个一体化出行MaaS平台上线
  10. 笔记本电脑计算机出现问题怎么办,笔记本电脑经常死机怎么办 笔记本电脑死机原因分析...