Built-in Types — Python 3.9.12 documentation
2. Lexical analysis — Python 3.10.4 documentation
string — Common string operations — Python 3.9.12 documentation
https://blog.csdn.net/sunxb10/article/details/81036693
Python 中 str.format() 方法详解_团子大圆帅的博客-CSDN博客_str.format
以f开头表示在字符串内⽀持⼤括号中嵌套表达式。
import time
t0 = time.time()
time.sleep(1)
name = 'processing'
print(f'{name} done in {time.time() - t0:.2f} s')
# 输出:processing done in 1.00 s
具体的格式控制机制,在本文的第三部分会详细讲到。
作⽤:去掉反斜杠的转移机制。常见的转义字符,⽐如'\n'表⽰换⾏,'\t'表⽰水平制表符等。
应⽤:常⽤于正则表达式,对应re模块。
英文字符在使用各种编码下, 基本都可以正常解析, 所以一般不带u;但是中文,尽量表明所需编码, 否则一旦编码转换就会出现乱码。
例: response = b'
作⽤:"b"前缀表示后⾯的字符串是bytes类型。
⽤处:⽹络编程中,服务器和浏览器只认bytes类型数据。比如:send函数的参数和recv函数的返回值都是bytes类型。
附:在Python3中,bytes 和 str 的互相转换⽅式是str.encode('utf-8')和bytes.decode('utf-8')
如python官网所示,输出格式,大致也就下面几种(除去人工更改输出格式)
其中①对应本文的3.1,③对应本文的3.2,②对应本文的3.3。
Python格式化字符串f-string概览_sunxb10的博客-CSDN博客_f字符串
上面这几篇文章,是我见过讲的比较清楚和全面的。
在本文的3.1部分,我的总结,也是基于上面几篇文章。
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进行字符串格式化。
(1)字符串、数值型(浮点数、整数、复数);以上这些,既可以是常量,也可是变量。
(2)存在返回值的表达式或函数调用。
(1)对于单引号,双引号,三引号
(2)对于双花括号
(3)对于反斜杠(转义符)
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 '
f-string采用{data:format}的格式编排,冒号前面是本文3.1.1中所描述的数据,冒号后面是本文3.1.6部分主要下笔墨的。
本引用源于:string --- 常见的字符串操作 — Python 3.10.4 文档
如果不通过重写
__format__
方法来进行自定义的话,标准格式说明符的形式如下。[[fill]align][sign][#][0][width][grouping_option][.precision][type]
- [fill]:填充符,
,也即任何单个字符都可以作为填充符;默认是空格符填充。 - [align]:对齐符,"<" | ">" | "=" | "^",分别对应左对齐(字符串默认对齐方式)、右对齐(数值默认对齐方式)、强制填充、居中。
- [sign]:正负符,"+" | "-" | " ",分别对应正数前加正号负数前加负号、仅在负数前加负号、正数前前导空格负数前加负号。仅适用于数值。
- [#]:该符号是一种进制描述符,如果加上了,那么就会在输出结果上加上进制符号。比如二进制是0b,八进制加0o,十进制不加,十六进制加0x。仅适用于数值。
- [width]:该参数描述了数据的最小占用宽度,用一个数字表示;对于数值和字符串都适用。
- [grouping_option]:千位分隔符,"_" | ","。若不指定【
,
】或【_
】,则f-string默认使用任何千位分隔符。【,】仅适用于浮点数、复数与十进制整数;对于浮点数和复数,【,】只分隔小数点前的数位。【_
】适用于浮点数、复数与二、八、十、十六进制整数:对于浮点数和复数,【_
】只分隔小数点前的数位;对于二、八、十六进制整数,固定从低位到高位每隔四位插入一个【_
】(十进制整数是每隔三位插入一个【_
】)。- [.precision]:精度符,小数点后加一个数字。data既可以是数值也可以是字符串。data若为浮点数、复数,用于
f
、F
、e
、E
和%
时precision
指定的是小数点后的位数,而用于g
和G
时precision
指定的是有效数字位数(小数点前位数+小数点后位数)。data若为字符串,含义是只使用字符串中前precision
位字符。- [type]:数据类型符。"b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%",各自的含义,网上很常见,就不赘述了。"n"类似"d",当有千位分隔符时就有所区别。如果不指定数据类型符,也即这个是None时,若data属于数值型数据,那么就等同于"d",若data属于字符型数据,那么就等同于"s"。注意,对于%百分号,我专门写了一篇文章来介绍它在python的用法——【https://blog.csdn.net/PSpiritV/article/details/123868133】。
补充:对于时间型数据,也有特定的格式控制符,见以下表格。常用的特殊格式类型:标准库 datetime 给定的用于排版时间信息的格式类型,适用于 date、datetime 和 time 对象。
源于:datetime — Basic date and time types — Python 3.10.4 documentation
格式描述符 |
含义 |
显示样例 |
%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' |
本方法,在python官网中,叫做「Old string formatting」;在民间有些人把这种输出叫做「%-formatting语句」。
给出的示例代码如下:
with open('read/test_%d.jpg' % i, 'wb') as f:
f.write(image_data)
除此之外,还可以加多个变量,那么%后面的多个表达式/变量必须用圆括号括起来。
with open('read/test_%d_%s.jpg' % (i, s), 'wb') as f:
f.write(image_data)
其实,对于这种%-formatting语句,本质上和f-string语句没什么区别。前者的一般格式是f'{data:format}',而后者的一般格式是'%format' % data。
这两者的data部分、format部分,存在形式完全一样,可以互相参考。
为了不重复啰嗦,可以去本文的3.1小节查询。
%-formatting语句中比较独特的属性——可以利用字典来赋予变量。详见下面的代码块。
dict1 = {'name':'zhang', 'action':'running'}
print('%(name)s is %(action)s' % dict1)
# zhang is running
下文主要源于:Python 中 str.format() 方法详解_团子大圆帅的博客-CSDN博客_str.format
str是string(字符串)的意思,而.format()说明是在调用字符串对象的方法。那么圆括号里使用的参数,如官网所示,分别是可变位置参数和可变关键字参数。
而根据python中函数/方法的可变参数使用方法:可变位置参数既可以用*加序列(元组、列表)的方式传入,也可把数据直接顺序传入; 可变关键字参数可用**加字典的方式传入,也可直接通过形参名=数据的方式传入(可不按顺序,但是必须在位置参数后面)。
过多的就不介绍了,其实一旦把这个format()看成一种函数/方法调用,基本就理解得差不多了。
replacement field的概念在前面的3.1和3.2小节都没提(但其实它们也能用到),是因为这个概念是最高一级的概念;replacement field的概念可以在官网的Format String Syntax中查看。
翻译成中文,就是{字段名!转换字段:格式说明符};其中「:格式说明符」是上文已经讲烂了的部分;而字段名在f-string中其实就是上文中提到的{data:format}中的data,在%-formatting中其实就是%分割符后的data。
由于上文对[!转换字段]并无涉及,所以在本小节就简略阐释一下。
- 转换字段 conversion field 的取值有三种(s、r、a),前面要加!,也即!s、!r、!a。
- 这三种取值,分别对应str()、repr()、ascii()。
- ascii() 函数类似 repr() 函数,返回一个可以表示对象的字符串。但是对于非 ASCII 字符,使用 \x,\u 或者 \U 转义。
# 转换字段
print('I am {!s}!'.format('Bruce Lee 李小龙'))
print('I am {!r}!'.format('Bruce Lee 李小龙'))
print('I am {!a}!'.format('Bruce Lee 李小龙'))
"""
I am Bruce Lee 李小龙!
I am 'Bruce Lee 李小龙'!
I am 'Bruce Lee \u674e\u5c0f\u9f99'!
"""
在3.3.1中已经阐述过,传入format()的参数分为位置参数和关键词参数。
对于位置参数,本质上就是一种序列(元组、列表);我们想引用列表或元组里的元素,最简单的方法就是索引了,比如列表a=[6,5,0],那么a[0]=6,a[2]=0。
方法①既然本质是序列,可以用元素对应的索引号(从0开始数)来引用位置参数(也即field_name为digit+)。这种方法的优点在于可以重复引用位置参数,并且在string中引用位置参数的顺序可以和在format()方法中传入的顺序不同。
方法②借花括号出现在string中的顺序号码来确定引用的是哪个位置参数(也即field_name不指定)。这种方法的缺点在于不灵活,优点在于简单。
方法①和方法②,共同的特点在于都可以仅使用部分在format()方法中传入的位置参数,方法②如果不全部引用传入的位置参数,那么必须在传入时把不引用的位置参数放在靠后的位置,但是方法①就不需要考虑到这一点。
------------------------------------------------------------------------------------------------------------------
注意!!!
方法①和方法②不能同时使用,因为这样会导致混乱。
对于关键词参数,本质上就是一种字典,仅可借value对应的key来引用(也即field_name为key_index)。
基于3.3.3,在本小节做一个补充。
当位置参数或关键词参数是一个序列(元组、列表、数组、字典等)时,可以通过中括号[idx]来进一步索引;当序列是元组、列表、数组时,idx是digit+;当序列是字典时,idx是key_index。
当需要引用位置参数或关键词参数的属性时,可以通过[.property]的方法进一步引用。
本文的3.1小节,已经把这个讲得很透彻了,因此不再赘述。
本人在学这个“字符串输出”的时候,参考了很多中文资料,奈何这些中文资料各自为战、各自残缺、各自命名(翻译不统一),所以导致我学习获得的认知非常混乱、总的来说效率不是很高。
因此,我强烈建议各位读者在学习的时候,能够找到官方文档中对该部分的描述在哪里,文章中的被翻译的名词在官网中对应的是什么术语。在中文文章中过一遍后,去官方文档中查看这个知识点的编排方式,对知识本身的理解会更上一个层次,会更加深刻、底层以及全面(毕竟官网的是源头,中文翻译都是切片)。
我也强烈建议各位读者学好英语,因为有时候不是中文文章本身质量不好,而是翻译的时候多少有点误差或区别、或者不同翻译材料之间出现“打架”现象,这时候去源头上查个究竟,知识会明朗很多!