鱼C论坛

 找回密码
 立即注册
查看: 988|回复: 0

[技术交流] Python格式化字符串f-string概览

[复制链接]
发表于 2018-9-28 22:25:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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'

表达式求值与函数调用
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'

引号、大括号与反斜杠
f-string大括号内所用的引号不能和大括号外的引号定界符冲突,可根据情况灵活切换 ' 和 ":
>>> f'I am {"Eric"}' 'I am Eric'
>>> f'I am {'Eric'}
' File "<stadin>", line 1
          f'I am {'Eric'}
^
' SyntaxError: invalid syntax

自定义格式:对齐、宽度、符号、补零、精度、进制等
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 用于不同格式类型的浮点数、复数时的含义也不同:用于 f、F、e、E 和 % 时 precision 指定的是小数点后的位数,用于 g 和 G 时 precision 指定的是有效数字位数(小数点前位数+小数点后位数)。
注3:width.precision 除浮点数、复数外还可用于字符串,此时 precision 含义是只使用字符串中前 precision 位字符。

>>> 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'

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

lambda表达式
f-string大括号内也可填入lambda表达式,但lambda表达式的 : 会被f-string误认为是表达式与格式描述符之间的分隔符,为避免歧义,需要将lambda表达式置于括号 () 内:
>>> f'result is {lambda x: x ** 2 + 1 (2)}'
File "", 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 '

https://blog.csdn.net/sunxb10/article/details/81036693

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-30 21:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表