一、Reference

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、r、u、b的含义

2.1 f表示按格式输出

以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

具体的格式控制机制,在本文的第三部分会详细讲到。

2.2 r表示不转义的字符串

作⽤:去掉反斜杠的转移机制。常见的转义字符,⽐如'\n'表⽰换⾏,'\t'表⽰水平制表符等。

应⽤:常⽤于正则表达式,对应re模块。

2.3 u表示Unicode编码格式存储

英文字符在使用各种编码下, 基本都可以正常解析, 所以一般不带u;但是中文,尽量表明所需编码, 否则一旦编码转换就会出现乱码。

2.4 b表示bytes格式存储

例: response = b'<h1>Hello World!</h1>' # b' ' 表⽰这是⼀个 bytes 对象

作⽤:"b"前缀表示后⾯的字符串是bytes类型。

⽤处:⽹络编程中,服务器和浏览器只认bytes类型数据。比如:send函数的参数和recv函数的返回值都是bytes类型。

附:在Python3中,bytes 和 str 的互相转换⽅式是str.encode('utf-8')和bytes.decode('utf-8')

三、3种字符串和表达式/变量配合方法

如python官网所示,输出格式,大致也就下面几种(除去人工更改输出格式)

其中①对应本文的3.1,③对应本文的3.2,②对应本文的3.3。

3.1 字符串前缀f格式化输出

​​​​​​​Python格式化字符串f-string概览_sunxb10的博客-CSDN博客_f字符串

上面这几篇文章,是我见过讲的比较清楚和全面的。

在本文的3.1部分,我的总结,也是基于上面几篇文章。

3.1.1 f-string是什么?

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进行字符串格式化。

3.1.2 花括号中支持哪些数据?

(1)字符串、数值型(浮点数、整数、复数);以上这些,既可以是常量,也可是变量。

(2)存在返回值的表达式或函数调用。

3.1.3 花括号内的特殊符号(引号、双花、斜杠)

(1)对于单引号,双引号,三引号

  • 要有一定层次,不能在花括号内外同时用单引号、也不能同时用双引号;
  • 三引号只能在最外边用,这时花括号里边可以用单引号或双引号。

(2)对于双花括号

  • 如果花括号里的字符串,需要包裹上一层花括号,可以使用双花括号。

(3)对于反斜杠(转义符)

  • 花括号内不支持转义,并且反斜杠符号不能直接出现在花括号内;
  • 如果需要在花括号中包含反斜杠,可以使用临时变量。比如s='\o',f'{s}'就不会出错。

3.1.4 lambda匿名函数与f-string

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  '

3.1.5 多行f-string——花括号外的反斜杠

  • 假使需要输出多行f-string,那么可以用反斜杠符完成换行。
  • 每一行的f-string前都要加f,并且都要带引号包裹。

3.1.6 格式描述符

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]:填充符,<any character>,也即任何单个字符都可以作为填充符;默认是空格符填充。
  • [align]:对齐符,"<" | ">" | "=" | "^",分别对应左对齐(字符串默认对齐方式)、右对齐(数值默认对齐方式)、强制填充、居中。
  • [sign]:正负符,"+" | "-" | " ",分别对应正数前加正号负数前加负号、仅在负数前加负号、正数前前导空格负数前加负号。仅适用于数值。
  • [#]:该符号是一种进制描述符,如果加上了,那么就会在输出结果上加上进制符号。比如二进制是0b,八进制加0o,十进制不加,十六进制加0x。仅适用于数值。
  • [width]:该参数描述了数据的最小占用宽度,用一个数字表示;对于数值和字符串都适用。
  • [grouping_option]:千位分隔符,"_" | ","。若不指定【,】或【_】,则f-string默认使用任何千位分隔符。【,】仅适用于浮点数、复数与十进制整数;对于浮点数和复数,【,】只分隔小数点前的数位。【_】适用于浮点数、复数与二、八、十、十六进制整数:对于浮点数和复数,【_】只分隔小数点前的数位;对于二、八、十六进制整数,固定从低位到高位每隔四位插入一个【_】(十进制整数是每隔三位插入一个【_】)。
  • [.precision]:精度符,小数点后加一个数字。data既可以是数值也可以是字符串。data若为浮点数、复数,用于 fFeE 和 % 时 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'

3.2 字符串尾巴%格式化输出

本方法,在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

3.3 str.format()方法格式化输出

下文主要源于:Python 中 str.format() 方法详解_团子大圆帅的博客-CSDN博客_str.format

3.3.1 str.format()方法本质上是什么?

str是string(字符串)的意思,而.format()说明是在调用字符串对象的方法。那么圆括号里使用的参数,如官网所示,分别是可变位置参数和可变关键字参数。

而根据python中函数/方法的可变参数使用方法:可变位置参数既可以用*加序列(元组、列表)的方式传入,也可把数据直接顺序传入; 可变关键字参数可用**加字典的方式传入,也可直接通过形参名=数据的方式传入(可不按顺序,但是必须在位置参数后面)。

过多的就不介绍了,其实一旦把这个format()看成一种函数/方法调用,基本就理解得差不多了。

3.3.2 replacement field(替换字段)的格式

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.3 如何正确地在花括号中引用format()中的参数?

在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.4 属性和子成员引用方法(补充)

基于3.3.3,在本小节做一个补充。

当位置参数或关键词参数是一个序列(元组、列表、数组、字典等)时,可以通过中括号[idx]来进一步索引;当序列是元组、列表、数组时,idx是digit+;当序列是字典时,idx是key_index。

当需要引用位置参数或关键词参数的属性时,可以通过[.property]的方法进一步引用。

3.3.5 对于format_spec的描述

本文的3.1小节,已经把这个讲得很透彻了,因此不再赘述。

四、学习小结与教训

本人在学这个“字符串输出”的时候,参考了很多中文资料,奈何这些中文资料各自为战、各自残缺、各自命名(翻译不统一),所以导致我学习获得的认知非常混乱、总的来说效率不是很高。

因此,我强烈建议各位读者在学习的时候,能够找到官方文档中对该部分的描述在哪里,文章中的被翻译的名词在官网中对应的是什么术语。在中文文章中过一遍后,去官方文档中查看这个知识点的编排方式,对知识本身的理解会更上一个层次,会更加深刻、底层以及全面(毕竟官网的是源头,中文翻译都是切片)。

我也强烈建议各位读者学好英语,因为有时候不是中文文章本身质量不好,而是翻译的时候多少有点误差或区别、或者不同翻译材料之间出现“打架”现象,这时候去源头上查个究竟,知识会明朗很多!

python-字符串格式化输出控制小结;格式控制符小结;字符串和变量的结合;3+3种字符串的表示方法相关推荐

  1. Python Base 字符串格式化输出

    Python的字符串格式化输出 概述 summary = '''Python用一个tuple(其实可以不写tuple括号也可以)将多个值传递给模板,每个值对应一个格式符. ''' example = ...

  2. python输出举例_python字符串格式化输出及相关操作代码举例

    字符串的格式化 Python 支持格式化字符串的输出 .尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中.在   Python 中,字符串格式化使 ...

  3. Python中字符串格式化输出的学习笔记

    1 前言 此笔记讲述了如何对字符串进行格式化输出- 2 改变print()输出的颜色 这里我们可以通过字符串命令来改变**print()**输出的颜色: 例如下面的代码: def warning(*a ...

  4. 【知识碎片】python 字符串格式化输出:%d,%s,%f

    在进行爬虫项目练习是会遇到语句中有%d,%s,%f的情况,这就是python字符串格式化输出.基本用法是将一个"值"插入到有字符串格式符%d,%s,%f的字符串中. 比如下面代码: ...

  5. python字符串格式化输出

    字符串格式化输出是python非常重要的基础语法,对三种格式化输出做一个简单的总结 格式化输出:内容按照一定格式要求进行输出 1.使用占位符%输出 python2.6版本之前,使用%格式化字符串沿用的 ...

  6. Python字符串格式化输出语法汇总

    1. 引言 在程序设计中,对于字符串的处理是个免不了的工作.对于字符串的常见操作,Python内置了各种不同的工具,本篇要讨论的是关于Python中字串格式化输出的各种语法. 2. 旧式语法 在Pyt ...

  7. python字符数组输出_python字符串格式化输出

    字符串格式化输出 : 字符串的拼接第一种方式 如:name = input("name:") age = input("age:") job = input(& ...

  8. Python 实验题目:字符串格式化输出内容为:姓名:张三,学号:1101,张三的平均分为90.65分。(平均分的原始值为:90.6497)

    实验题目:字符串格式化输出内容为:姓名:张三,学号:1101,张三的平均分为90.65分.(平均分的原始值为:90.6497) 用以下四种方法实现: (1)通过位置参数 (2)通过关键字参数名称 (3 ...

  9. matlab ip 大端,MATLAB格式化输出控制

    MATLAB格式化输出控制 format 默认格式 format short 5字长定点数 format long 15字长定点数 format short e 5字长浮点数 format long ...

最新文章

  1. 在Struts2中使用OGNL
  2. 《数学之美》第25章 条件随机场、文法分析及其他
  3. 利用 libvirt 和 Linux 审计子系统跟踪 KVM 客户机
  4. java decompiler_Java Decompiler(Java反编译工具)
  5. JS开源框架Stimulus:让web应用在移动端达到原生体验!
  6. LInux学习笔记(四)-----实操排雷
  7. 单线程的Redis为什么却能支撑高并发?
  8. 理解ASP.NET中的三层结构
  9. mysql把两个查询的结果合并为一个结果
  10. windows部署tomcat服务自动启动,同时解决服务无法启动的问题
  11. ddbs mysql_ddbs简介
  12. java轻量级和重量级_Java 偏向锁、轻量级锁和重量级锁
  13. 矩阵分析 (四)向量和矩阵的范数
  14. springboot配置文件为yml格式详解
  15. python怎么打字母_如何用python打印字母表?
  16. 知识追踪常见建模方法之IRT项目反应理论
  17. 六大接口管理平台,总有一款适合你的!
  18. Android仿微信朋友圈5实现朋友圈列表
  19. 计算机大作业说明文档,计算机大作业.doc
  20. CSS实现留言板效果

热门文章

  1. 哈佛大学计算机学院博士后,哈佛大学正在招收访问学者、博士后!
  2. 2009年11月11日,博客更新公告!
  3. 【转】计算机类学术论文 28个常见出版社一般写法(参考文献用)
  4. 为什么爆火的是 ChatGPT ?OpenAI 做对了什么?
  5. 最新球球大作战代点源码无加密开源
  6. VS2015 realease模式下调试
  7. oo第一单元总结~~
  8. CSS 格式化上下文详解
  9. Java虚拟机(JVM) - 字节码
  10. 2015年6月20日-ps分辨率