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与php实现分割文件代码
Mar 06 Python
Python元组及文件核心对象类型详解
Feb 11 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
浅谈dataframe中更改列属性的方法
Jul 10 Python
Python标准库使用OrderedDict类的实例讲解
Feb 14 Python
python的命名规则知识点总结
Oct 04 Python
python实现WebSocket服务端过程解析
Oct 18 Python
python 实现dict转json并保存文件
Dec 05 Python
Python动态声明变量赋值代码实例
Dec 30 Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 Python
完美处理python与anaconda环境变量的冲突问题
Apr 07 Python
pandas中对文本类型数据的处理小结
Nov 01 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
微信接口生成带参数的二维码
2017/07/31 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
jQuery插件制作之参数用法实例分析
2015/06/01 Javascript
Bootstrap每天必学之下拉菜单
2015/11/25 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
小程序实现列表多个批量倒计时
2021/01/29 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
django富文本编辑器的实现示例
2019/04/10 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
Kears+Opencv实现简单人脸识别
2019/08/28 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
影视艺术学院毕业生自荐信
2013/11/13 职场文书
证婚人经典证婚词
2014/01/09 职场文书
活动志愿者自荐信
2014/01/27 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
联欢晚会主持词
2014/03/25 职场文书
简历自我评价模板
2015/03/11 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
报案材料怎么写
2015/05/25 职场文书
主婚人致辞精选
2015/07/28 职场文书
辅导员学期工作总结
2015/08/14 职场文书
MySQL8.0.18配置多主一从
2021/06/21 MySQL
python实现双链表
2022/05/25 Python