Python 3.6.x字符串格式化方法小结

2021-11-06

1  使用%符号进行格式

使用%符号进行字符串格式化的形式如下图所示,格式运算符%之前的部分为格式字符串,之后的部分为需要进行格式化的内容。


Python支持大量的格式字符,下表列出了比较常用的一部分。

格式字符

说明

%s

字符串 (采用str()的显示)

%r

字符串 (采用repr()的显示)

%c

单个字符

%d

十进制整数

%i

十进制整数

%o

八进制整数

%x

十六进制整数

%e

指数 (基底写为e)

%E

指数 (基底写为E)

%f%F

浮点数

%g

指数(e)或浮点数 (根据显示长度)

%G

指数(E)或浮点数 (根据显示长度)

%%

字符%


使用这种方式进行字符串格式化时,要求被格式化的内容和格式字符之间必须一一对应。
>>> x = 1235
>>> so = "%o" % x
>>> so
'2323'
>>> sh = "%x" % x
>>> sh
'4d3'
>>> se = "%e" % x
>>> se
'1.235000e+03'

#等价于str()

>>> "%s" % 65
'65'
>>> "%s" % 65333
'65333'

#使用元组对字符串进行格式化,按位置进行对应
>>> '%d,%c' % (65, 65) 
'65,A'

#试图将字符串转换为整数进行输出,抛出异常
>>> "%d" % "555"
TypeError: %d format: a number is required, not str
>>> '%s' % [1, 2, 3]
'[1, 2, 3]'

#可以使用str()函数将任意类型数据转换为字符串
>>> str((1, 2, 3))
'(1, 2, 3)'
>>> str([1, 2, 3])
'[1, 2, 3]'


2  使用format()方法进行字符串格式化

除了上一节介绍的字符串格式化方法之外,目前Python社区更推荐使用format()方法进行格式化,该方法非常灵活,不仅可以使用位置进行格式化,还支持使用关键参数进行格式化,更妙的是支持序列解包格式化字符串,为程序员提供了非常大的方便。

在字符串格式化方法format()中可以使用的格式主要有b(二进制格式)、c(把整数转换成Unicode字符)、d(十进制格式)、o(八进制格式)、x(小写十六进制格式)、X(大写十六进制格式)、e/E(科学计数法格式)、f/F(固定长度的浮点数格式)、%(使用固定长度浮点数显示百分数)。Python 3.6.x开始支持在数字常量的中间位置使用单个下划线作为分隔符来提高数字可读性,相应的,字符串格式化方法format()也提供了对下划线的支持。下面的代码演示了其中的部分用法:
>>> 1/3
0.3333333333333333

#保留3位小数

>>> '{0:.3f}'.format(1/3)
0.333

#格式化为百分数
>>> '{0:%}'.format(3.5)
'350.000000%'

#Python 3.6.0及更高版本支持
>>> '{0:_},{0:_x}'.format(1000000)
'1_000_000,f_4240'

#Python 3.6.0及更高版本支持
>>> '{0:_},{0:_x}'.format(10000000)
'10_000_000,98_9680'
>>> print("The number {0:,} in hex is: {0:#x}, in oct is {0:#o}".format(55))
The number 55 in hex is: 0x37, in oct is 0o67
>>> print("The number {0:,} in hex is: {0:x}, the number {1} in oct is {1:o}".format(5555, 55))
The number 5,555 in hex is: 15b3, the number 55 in oct is 67
>>> print("The number {1} in hex is: {1:#x}, the number {0} in oct is {0:#o}".format(5555, 55))
The number 55 in hex is: 0x37, the number 5555 in oct is 0o12663
>>> print("my name is {name}, my age is {age}, and my QQ is {qq}".format(name = "Dong", qq = "1234567", age = 38))
my name is Dong, my age is 38, and my QQ is 1234567
>>> position = (5, 8, 13)

#使用元组同时格式化多个值
>>> print("X:{0[0]};Y:{0[1]};Z:{0[2]}".format(position))
X:5;Y:8;Z:13
>>> weather = [("Monday", "rain"), ("Tuesday", "sunny"), ("Wednesday", "sunny"), ("Thursday", "rain"), ("Friday", "Cloudy")]
>>> formatter = "Weather of '{0[0]}' is '{0[1]}'".format
>>> for item in map(formatter, weather):
       print(item)


上面最后一段代码也可以改为下面的写法:
>>> for item in weather:
       print(formatter(item)) 


运行结果为:
Weather of 'Monday' is 'rain'
Weather of 'Tuesday' is 'sunny'
Weather of 'Wednesday' is 'sunny'
Weather of 'Thursday' is 'rain'
Weather of 'Friday' is 'Cloudy'


3  格式化的字符串常量

从Python 3.6.x开始支持一种新的字符串格式化方式,官方叫做Formatted String Literals,其含义与字符串对象的format()方法类似,但形式更加简洁。
>>> name = 'Dong'
>>> age = 39
>>> f'My name is {name}, and I am {age} years old.'
'My name is Dong, and I am 39 years old.'
>>> width = 10
>>> precision = 4
>>> value = 11/3
>>> f'result:{value:{width}.{precision}}'
'result:     3.667'


4  使用Template模板进行格式化

Python标准库string还提供了用于字符串格式化的模板类Template,可以用于大量信息的格式化,尤其使用于网页模板内容的替换和格式化。例如:
>>> from string import Template

#创建模板

>>> t = Template('My name is ${name}, and is ${age} yeare old.')
>>> d = {'name':'Dong', 'age':39}

#替换

>>> t.substitute(d)
'My name is Dong, and is 39 yeare old.'
>>> tt = Template('My name is $name, and is $age yeare old.')
>>> tt.substitute(d)
'My name is Dong, and is 39 yeare old.'
>>> html = '''<html><head>${head}</head><body>${body}</body></html>'''
>>> t = Template(html)
>>> d = {'head':'test', 'body':'This is only a test.'}
>>> t.substitute(d)
'<html><head>test</head><body>This is only a test.</body></html>'



本文节选自《Python程序设计开发宝典》(董付国著,清华大学出版社,2017.8,ISBN:9787302472100)


相关文章

详解Python 3.6.x程序打包并发布至pypi的完整过程

2021-11-06
python setup.py sdist和python setup.py bdist_wheel,创建相应的文件,如图:第四步,登录pypi.python.org网站,注册账号并登录,然...

使用Python 3.5/3.6监听本机任意窗口中的按键操作

2021-11-06
python setup.py build_ext --swig=..\swigwin-3.0.12\swig.exe,可以根据实际情况修改swig.exe的路径,另外本机最好已安装VC2008第五...

边看边用!这本 Python 3.6 的书火爆了 IT 圈!

2021-11-06
而且注意这本书是基于Python3.6来的.4.技术方向多这本书涵盖了网络编程、数据分析、网络爬虫等大量企业实用的知识,内容涵盖了...

如何在 Linux 中安装最新的 Python 3.6 版本

2021-11-06
Python 3.6在我写这篇文章的时候(2017 年三月中旬),在 CentOS 和 Debian 8 中可用的最新 Python 版本分别是 Python 3.4 和 ...

Python 3.6 Highlights

2021-11-06
//docs.python.org/3.9/whatsnew/3.6.html#whatsnew36-pep525之前yield和await没法在同一个函数里用,现在可以了,所以可以做成异...

《统计学习方法》的Python 3.6复现,已开源!

2021-11-06
Python 3.6,已经全部测试通过.项目地址:https://github.com/fengdu78/lihang-code文末附电子书及代码下载方式《统计学习方法》,...

使用异步Python 3.6和Redis编写快速应用程序

2021-11-06
英文原文:https://eng.paxos.com/write-fast-apps-using-async-python-3.6-and-redis 译者:guoziqing

Python3.6入门与进阶实战等多套视频教程

2021-11-06
以下是一些视频教程的链接与关键词,关注以下公众号二维码,回复关键词就可领取Python进阶与实战视频教程链接: https://pan....

资源 | 《统计学习方法》的Python 3.6复现,实测可用

2021-11-06
Python数据科学【读者福利】 ↓↓↓【知识星球】:Python数据科学学习社区【限时下载】:500g学习资源免费领取往期精彩推荐 ↓↓↓【1】...

刷爆抖音,4万好评!这本 Python 3.6 的书又断货了...

2021-11-06
而且注意这本书是基于Python3.6来的.4.技术方向多这本书涵盖了网络编程、数据分析、网络爬虫等大量企业实用的知识,内容涵盖了...

随机推荐