Python语法分析之字符串格式化


Posted in Python onJune 13, 2019

前序

There should be one - and preferably only one - obvious way to do it.
———— the Zen of Python
意译:Python提倡用一种,而且最好是只有一种方法来完成一件事

虽然 Python 有以上的提倡,但却在字符串格式化方面,没有做到这一点。

字符串格式化

敲黑板,划重点:在 Python 中有至少三种常见方式实现字符串格式化:

  1. %-formatting 格式(Python2.6以前,推荐输出时使用)
  2. str.format() 格式(Python2.6,推荐字符串拼接使用)
  3. f-string 格式(Python3.6,推荐使用)

1、printf 风格的字符串格式化(%-formatting 格式)

Python2.6 之前只有这一种方式,使用与 C 中 printf 函数一样的语法。

基础语法:format % value(其中 format 为一个字符串),在 format 中的 % 转换标记符将被替换为零个或者多个 value 条目

基础用法

# coding in Python3.7
print('this is %s blog written in %d%%%02d%%%d %02d:%d:%06.2f' 
  % ('TinyDolphin', 2019, 5, 31, 9, 30, 22.3333))
# this is TinyDolphin blog written in 2019%05%31 09:30:022.33

print('title=%(title)s, author=%(name)s' 
  % {'name': 'TinyDolphin', 'title': 'Python 语法浅析:字符串格式化'})
# title=Python 语法浅析:字符串格式化, author=TinyDolphin

print('%0*.*f' % (6, 2, 2.345))
# 002.35

printf 语法

针对这种格式化操作,重要知识点如下:

1、针对这些转换标记字符,必须按照以下顺序:

    % --> (name) --> '#'、'-'、'0'、'+'、' ' --> m.n | m --> d、s、r、f

2、常用转换类型:

  • %s 格式化字符串(str()函数)
  • %r 格式化字符串(repr()函数)
  •  %d 格式化整数
  • %f 格式化浮点数字,可指定小数点后的精度

3、常用的转换标记字符:

  •  - 用做左对齐
  • + 在正数前面显示加号( + )
  • # 在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X')
  • 0 显示的数字前面填充'0',而不是默认的空格
  • % '%%'输出一个单一的'%'
  •  m.n 表示 m 是显示的最小总宽度,n 是小数点后的位数
  •  * 定义宽度或者小数点精度(用在不能预先指定m.n的值)
  •  (var) 映射变量(字典参数)

2、字符串的方式(str.format()格式)

Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能,比如:支持位置映射、关键字映射、对象属性映射、下标映射等多种方式

基本语法是通过 {} 和 : 来代替以前的 %,例如:'%03.2f'被改写成 '{:03.2f}'。

两个格式化方法:

str.format(*args, **kwargs)
    字符串的格式化操作。
    str 包含字符串字面值 AND {} 括起来的替换域。
    每个替换域:位置参数的索引 OR 关键字参数的名称
   
str.format_map(mapping)
    类似于 str.foramt(**mapping)
    不同之处:mapping 会被直接使用而不是复制到一个dict。

PS:Python 存在内置函数 format(value, format_spec):会转换成 type(value).format(value, format_spec)

基础用法

1、按位置访问参数

'{0}-{1}-{2}'.format('a', 'b', 'c')   # 'a-b-c'
'{}-{}-{}'.format('a', 'b', 'c')    # 'a-b-c'
'{2}-{1}-{0}'.format('a', 'b', 'c')   # 'c-b-a'
'{2}-{1}-{0}'.format(*'abc')      # 'c-b-a'

args = ['a', 'b', 'c']
'{2}-{1}-{0}'.format(*args)       # 'c-b-a'

'{0}-{1}-{0}'.format(*['abc', 'def'])  # 'abc-def-abc'

2、按名称访问参数

'{a}-{b}'.format(a='1', b='2')     # '1-2'

kwargs = {'a':'1', 'b':'2'}
'{a}-{b}'.format(**kwargs)       # '1-2'

3、访问参数的属性

class Point:
  def __init__(self, x, y):
    self.x, self.y = x, y
  def __str__(self):
    return 'Point({self.x}, {self.y})'.format(self=self)
    
str(Point(3, 4))            # 'Point(3, 4)'

4、访问参数的项

point = (3, 5)
'X:{0[0]} Y:{0[1]}'.format(point)    # 'X:3 Y:5'

5、替代 %s 和 %r (!s、!r)

'str() = {!s}; repr() = {!r}'.format('a', 'a') # "str() = a; repr() = 'a'"

6、对齐文本以及制定宽度(:<、:^、:>)

'{:<20}'.format('left aligned')     # 'left aligned    '
'{:>20}'.format('right aligned')    # '    right aligned'
'{:^20}'.format('centered')       # '   centered   '
# 使用 '*' 作为填充字符
'{:*^20}'.format('centered')      # '******centered******'

7、替代 %+f、%-f 和 %f 以及指定正负号(:+、:-、:)

'{:+f} {:+f}'.format(3.14, -3.14)    # '+3.140000 -3.140000'
'{: f} {: f}'.format(3.14, -3.14)    # ' 3.140000 -3.140000' 正号—>空格
'{:-f} {:-f}'.format(3.14, -3.14)    # '3.140000 -3.140000' == '{:f} {:f}'

8、替换 %x 和 %o 以及转换基于不同进位制的值(:x、:d、:o、:b)

'int:{0:d} hex:{0:x} oct:{0:o} bin:{0:b}'.format(42)
# 'int:42 hex:2a oct:52 bin:101010'
'int:{0:d} hex:{0:#x} oct:{0:#o} bin:{0:#b}'.format(42)
# 'int:42 hex:0x2a oct:0o52 bin:0b101010'
# '#' : 加上前缀:0x、0o、0b

9、使用逗号作为千位分隔符(:,)

'{:,}'.format(123456789)        # '123,456,789'

10、表示为百分数(:.2%)

'{:.2%}'.format(19/22)         # '86.36%'

11、使用特定类型的专属格式化

import datetime
d = datetime.datetime(2019, 6, 10, 22, 5, 13)
'{:%Y-%m-%d %H:%M:%S}'.format(d)
# '2019-06-10 22:05:13'

12、嵌套参数以及更复杂的示例


3、格式化字符串字面值(f-string 格式)

是带有 'f' 或 'F' 前缀的字符串字面值。

花括号以外的部分按其字面值处理,除了双重花括号 '{{' 或 '}}' 会被替换为相应的单个花括号。

语法如下:

单个花括号 '{',标示一个替换字段(以 Python 表达式打头)
 + 可能有一个以叹号 '!' 标示的转换字符
 + 可能有一个以冒号 ':' 标示的格式说明符
 + 以一个右花括号 '}' 作为结束

注意:格式化字符串字面值中的表达式:

  • 当作正常的 Python 表达式处理 (这一点很重要,也很强大)
  • 不允许空表达式
  • lambda 表达式必须显式地加上圆括号
  • 可以包含换行(例如三引号字符串中)
  • 不能包含注释
  • 从左到右被求值

如果指定了转换符,则表达式求值的结果会先转换再格式化。之后使用 Python 内置函数 format() 进行格式化。

基本用法

name = 'tinyDolphin'
f'my name is {name}'      # 'my name is tinyDolphin'
f'my name is {name!r}'     # "my name is 'tinyDolphin'"

width = 10
precision = 4
value = 12.34567
f'{value:{width}.{precision}}' # '   12.35'

today = datetime.datetime(year=2019, month=6, day=10)
f'{today:%B %d, %Y}'      # 'June 10, 2019'

number = 1024
f'{number:#0x}'         # '0x400'

PS:与 str.format() 有一点不同:在 str.format() 中,非数字索引将自动转化为字符串,而f-strings则不会。

kwargs = {'a':1, 'b':2}
# 使用 str.format()
'a={kwargs[a]}'.format(kwargs=kwargs)  # 'a=1'

# 使用 f-string
f"a={kwargs[a]}"            # × 发生异常
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

# 正确使用 f-string
f"a={kwargs['a']}"           # 'a=1'

总结

从以下三个方面进行对比:

速度上:f-string > %-formatting > str.format()
功能上:f-string > str.format() > %-formatting
可读性: f-string > str.format() > %-formatting

对于速度验证,笔者就不在此进行验证了。

推荐使用场景:

%-formatting:Python2 中,由于其性能优势,在涉及输出的一些操作时,优先推荐使用
str.format():Python2 中,由于其功能优势,在涉及字符串拼接的一些操作时,优先推荐使用
f-string:    Python3 中,强烈推荐使用

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python 采集中文乱码问题的完美解决方法
Sep 27 Python
Python实现图片转字符画的示例代码
Aug 21 Python
Python中表示字符串的三种方法
Sep 06 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
python 对给定可迭代集合统计出现频率,并排序的方法
Oct 18 Python
对python多线程与global变量详解
Nov 09 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
Aug 31 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
Feb 27 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
Python实现画图软件功能方法详解
Jul 28 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
Mar 25 Python
pyqt5 从本地选择图片 并显示在label上的实例
Jun 13 #Python
通过pycharm使用git的步骤(图文详解)
Jun 13 #Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 #Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
Jun 13 #Python
在Pycharm中使用GitHub的方法步骤
Jun 13 #Python
python 实现在tkinter中动态显示label图片的方法
Jun 13 #Python
windows10下安装TensorFlow Object Detection API的步骤
Jun 13 #Python
You might like
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
js身份证验证超强脚本
2008/10/26 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
[01:01:18]VP vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
Python 基础教程之包和类的用法
2017/02/23 Python
Python编程之微信推送模板消息功能示例
2017/08/21 Python
Python实现字典的遍历与排序功能示例
2017/12/23 Python
Django添加feeds功能的示例
2018/08/07 Python
python实现五子棋人机对战游戏
2020/03/25 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
办加油卡单位介绍信
2014/01/09 职场文书
高一历史教学反思
2014/01/13 职场文书
《故都的秋》教学反思
2014/04/15 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
R9700摩机记
2022/04/05 无线电