社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

【Python】55个案例:吃透Python字符串格式化

机器学习初学者 • 5 年前 • 465 次点击  

公众号:尤而小屋
作者:Peter
编辑:Peter

在上一篇Python字符串初相识中,我们介绍了字符串的很多基础内容。本文中介绍的字符串一个非常重要的知识点:字符串格式化输出。

python入门教程-字符串初相识

格式化怎么理解?简答来说:就是让字符串按照我们设定的格式来输出,达到我们想要的结果。主要是有4种方式:

  • %:基于占位符的格式化
  • format()函数的格式化:重点掌握
  • f-string格式化:重点掌握
  • 字符串模板函数string template

一、占位符%

常见格式符

格式化符号其实是为真实的值预留出一个空位,而且还可以控制显示的格式。格式符包含一个类型码,用来显示不同的数据类型,比如字符串、二进制、指数等。常见的不同的占位符如下:

  • %s:   字符串 (采用str()的显示),常用
  • %r:   字符串 (采用repr()的显示)
  • %c:   单个字符,格式化字符及其ASCII码
  • %b:   二进制整数
  • %u:   格式化无符号整数,常用
  • %d:   格式化十进制整数,常用
  • %i:   十进制整数
  • %o:   八进制整数
  • %x:   十六进制整数
  • %g:   指数(e)或浮点数%f (根据显示长度)
  • %G:   指数(E)或浮点数%F (根据显示长度)
  • %e:   指数 (基底写为e),用科学计数法格式化浮点数
  • %E:   指数 (基底写为E),用法同%e
  • %f:   浮点数,格式化浮点数字,可以指定小数点后面的精度,常用
  • %F:   浮点数,与%f相同
  • %%:   字符“%”,用来显示百分号%

对齐问题

关于对齐问题:

1. ^:居中对齐
2. >:右对齐
3. 4. +、-:显示正负号

语法形式

常用的语法形式为:%[(name)][flags][width].[precision] typecode

  • (name):参数的名称,可以省略;如果使用必须加上()
  • flags:对齐标志位;可以是+、-、“”、0;+右对齐,-左对齐,""填充一个空格;0表示左侧使用0填充
  • width:显示的宽度
  • precision:小数点后的精度

多种类型连用

print("%9.3f" % 2.3)  
    2.300  #  前面4个空格
  • 第一个 % 后面的内容为显示的格式说明,9 为显示宽度,3 为小数点位数,f 表示输出为浮点数类型
  • 第二个 % 后面为显示的内容来源,输出结果默认为右对齐,2.300 长度为 5,故前面有4个空格
print("%+9.3f" % 2.3)  # 带上+符号输出,9表示宽度,3表示小数位
   +2.300
print("%-9.3f" % 2.3)  # -表示左对齐输出
2.300
print("%-9.3f" % -2.3)  
-2.300
# 我们显示声明3个变量

name = "Yule Cottage"  # 字符串类型
age = 25  # 整数类型
height = 1.76   # 浮点数类型
# 1、浮点数默认是6位小数
# 2、%f和%F相同

print("我是:%s,年龄: %d,身高是:%f" % (name,age,height))
我是:Yule Cottage,年龄: 25,身高是:1.760000
# 指定浮点数的小数位

print("我是:%s,年龄: %d,身高是:%.3f" % (name,age,height))
我是:Yule Cottage,年龄: 25,身高是:1.760

下面的代码是通过字典对的形式来传入不同的数据类型,字典(后面会介绍python的字典)的值就是待格式的内容。

需要注意的是name、age、height必须写在%号的后面

print("我是:%(name)s,年龄: %(age)d,身高是:%(height).3f" % {"name":name,"age":age,"height":height})
我是:Yule Cottage,年龄: 25,身高是:1.760

输出不同进制

print("八进制:%o,十进制:%i,十六进制:%x" %(age,age,age))
八进制:31,十进制:25,十六进制:19
# print("二进制:%b" %(age))   # 二进制不能使用
bin(age)  # 通过bin函数查看
'0b11001'

输出的宽度、精度等设置

number = 1.23456789

# 宽度为10,保留小数点后4位,默认是右对齐
print("%10.4f" % number)  
    1.2346
print("%-10.4f" % number)  # -符号表示左对齐,显示4位小数
1.2346
# 右对齐,保留10位小数,不足的用0补齐

print("%10.10f" % number)  
1.2345678900
print("%-10.8f" % number)  # 左对齐,保留8位小数
1.23456789
# 左对齐,保留7位小数,会自动地进行四舍五入

print("%-10.7f" % number)  
1.2345679

下面是针对字符串的宽度等输出设置:

name
'Yule Cottage'
print("%.10s" % name) # 9个字母+一个空格:左对齐
Yule Cotta
print("%.15s" % name) # 如果位数不够,直接全部输出
Yule Cottage
print("%10.6s" % name) # 右对齐,取出6个字符
    Yule C

解释:总长度为10,前面4个空格,加上4+一个空格+C

二、format格式化

从python2.6+开始,新增了一种格式化字符串的函数str.format,可以说极大地增强了字符串格式化的功能,基本语法是通过{}和:来代替占位符%

  • 接收多个不限制的参数
  • 位置可以不按照顺序

语法形式

{:} ,中间有一个冒号,不能省略!!!

name = "Yule Cottage"  # 字符串类型
age = 25  # 整数类型
height = 1.76   # 浮点数类型
sex = "男"

多个参数连用

# 1、不设置位置
print("名字是:{},年龄是:{},身高是:{},性别:{}".format(name,age,height,sex))
名字是:Yule Cottage,年龄是:25,身高是:1.76,性别:男
# 2、设置位置参数

print("名字是:{0},年龄是:{1},身高是:{2},性别:{3}".format(name,age,height,sex))
名字是:Yule Cottage,年龄是:25,身高是:1.76,性别:男
# 设置位置参数
# 索引从0开始;2号位对应的height

print("名字是:{0},身高是:{2},年龄是:{1},性别:{3}".format(name,age,height,sex))
名字是:Yule Cottage,身高是:1.76,年龄是:25,性别:男
print("性别:{3},身高是:{2},名字是:{0},年龄是:{1}".format(name,age,height,sex))
性别:男,身高是:1.76,名字是:Yule Cottage,年龄是:25
# 3、元组形式
# 使用*进行解析

information = ("Peter",25)

print("姓名是:{},年龄是:{}".format(*information))
姓名是:Peter,年龄是:25
# 4、字典形式
# 参数为字典时候,通过**进行解析配对

print("名字是:{name},年龄是:{age},身高是:{height},性别:{sex}".format(**{"name":name,"age":age,"height":height,"sex":sex}))
名字是:Yule Cottage,年龄是:25,身高是:1.76,性别:男
# 5、直接变量赋值

print("名字是:{name},年龄是:{age},身高是:{height},性别:{sex}".format(name="Yule Cottage",age="2岁",height="1.75m",sex="男"))
名字是:Yule Cottage,年龄是:2岁,身高是:1.75m,性别:男

对齐

宽度为20,我们实现居中、靠左、靠右对齐

name
'Yule Cottage'
print("{:^20s}".format(name))  # 居中
print("{:>20s}".format(name))  # 靠右
print("{:<20s}".format(name))  # 靠左
    Yule Cottage    
Yule Cottage
Yule Cottage

数值多种形式

首先我们还是看看对齐问题,浮点数的对齐只保留6位小数:

pi = 3.1415926

print("{:^20f}".format(pi))  # 居中  # 默认只保留6位小数
print("{:>20f}".format(pi))  # 靠右
print("{:<20f}".format(pi))  # 靠左
      3.141593      
3.141593
3.141593

看看不同情况下的输出格式,浮点数需要带上小数点,默认全部是左对齐:

# 不同的输出方式

print("{}".format(pi))  # 原数据
print("{:.2f}".format(pi))   # 2位小数
print("{:>.10f}".format(pi))  # 位数不足,右侧补0
print("{:.4%}".format(pi))  # 百分比输出
print("{:.2e}".format(pi))
3.1415926
3.14
3.1415926000
314.1593%
3.14e+00

填充

sex
'男'
print("{0:30}".format(sex))  # 字符串默认左对齐
print("{:>30}".format(sex))  # 改成右对齐
print("{0:30}".format(age))  # 数值类型默认右对齐
print("{:<30}".format(height)) # 改成左对齐
男                             
男
25
1.76
# 指定填充的字符

print("{:*>30}".format(sex))  # *
print("{:+>30}".format(sex))  # +
print("{:+^30}".format(sex))  # 居中后填充+
print("{:+<30}".format(height)) # +
*****************************男
+++++++++++++++++++++++++++++男
++++++++++++++男+++++++++++++++
1.76++++++++++++++++++++++++++

千位分隔符

主要是用来显示数字的千位分隔符,在货币金额中使用的比较多:

b = 1003005000600

print("{:-^20}".format(b))   # 不用逗号
print("{:-^20,}".format(b))  # 用逗号
---1003005000600----
-1,003,005,000,600--
# 小数的千位分隔符显示

print("{0:-20,}".format(12567.98760))  # 不填充
print("{0:-^20,}".format(12567.98760))  # 居中+填充
print("{0:->20,}".format(12567.98760))  # 右对齐+填充
print("{0:-<20,}".format(12567.98760))  # 左对齐+填充
         12,567.9876
----12,567.9876-----
---------12,567.9876
12,567.9876---------

精度

精度输出的时候前面必须有一个小数点开头,具有两层含义:

  • 浮点数:表示输出小数位的有效位数
  • 字符串:精度表示输出的最大长度
pi
3.1415926
"{:.3f}".format(pi)
'3.142'



    
"{:30.5f}".format(pi)  # 小数点后5位,整体宽度30
'                       3.14159'
"{:*^30.5f}".format(pi)  # 小数点后5位,宽度30,居中后补充*
'***********3.14159************'
name
'Yule Cottage'
"{:.4}".format(name)  # 最大长度为4
'Yule'
"{:.6}".format(name)  # 输出最大长度为6
'Yule C'

多种输出类型

表示输出整数和浮点数类型的格式规则。对于整数类型,输出格式包括6 种:

  • c: 输出整数对应的 Unicode 字符;
  • b: 输出整数的二进制方式;
  • o: 输出整数的八进制方式;
  • d: 输出整数的十进制方式;
  • x: 输出整数的小写十六进制方式;
  • X: 输出整数的大写十六进制方式;

下面的例子表示的是365的二进制、Unicode字符、十进制、小写16进制和大写的16进制的不同输出格式:

"{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}".format(365)
'101101101,ŭ,365,555,16d,16D'

如果是浮点数类型,那么输出格式包括4种:

  • e: 输出浮点数对应的小写字母 e 的指数形式;
  • E: 输出浮点数对应的大写字母 E 的指数形式;
  • f: 输出浮点数的标准浮点形式;
  • %: 输出浮点数的百分形式。

浮点数输出时尽量使用<.>表示小数部分的宽度,有助于更好控制输出格式。

"{0:e},{0:E}".format(3.1415)
'3.141500e+00,3.141500E+00'
"{0:f},{0:F}".format(3.1415)
'3.141500,3.141500'
"{0:%}".format(3.1415)  # 保留6位小数,百分比输出
'314.150000%'
"{0:.2%}".format(3.1415)  # 2位小数,百分比输出



    
'314.15%'

三、f-string

f-string是python3.6开始引入的新字符串格式化方法。其实它的方法很多和format是类似的,下面通过具体的例子来讲解。

简单例子

首先我们看一个简单的例子,说明f-string如何使用:

a = "hello"
b = "python"

f"{a} {b}"
'hello python'

指定变量格式化

# 我们显示声明3个变量

name = "Yule Cottage"  # 字符串类型
age = 25  # 整数类型
height = 1.76   # 浮点数类型
f'名字是:{name},年龄是:{age},身高是:{height}'  # 前面加上f
'名字是:Yule Cottage,年龄是:25,身高是:1.76'

我们和format进行一下对比:

"名字是:{},年龄是:{},身高是:{}".format(name,age,height)  # format函数在最后面
'名字是:Yule Cottage,年龄是:25,身高是:1.76'

指定表达式格式化

如果后面的string部分是表达式,也可以进行格式化

f'{1+2+3}'
'6'
f'{1*2*3*4}'
'24'

对表达式进行变量的赋值再格式化:

x = 100
y = 50

f"{x*y + x/y}"  # 100*50 + 100 / 50 结果是浮点数
'5002.0'

指定函数格式化

上面的例子是直接赋值再通过表达式来格式化,我们其实可以将上面的表达式改成函数,传入参数来格式化,函数可以是:

  • python自带的函数
  • 自定义的函数
# 自带函数
print(f'my name is: {name}')  # 原数据
print(f'my name is: {name.upper()}')  # 全部变成大写字母



    
my name is: Yule Cottage
my name is: YULE COTTAGE
# 自己写个函数

def test(a,b):
    return a * b + a / b

f'{test(100,50)}'
'5002.0'
# 或者直接写成lambda 匿名函数

f'执行的结果是:{(lambda x,y: x*y + x/y)(100,50)}'
'执行的结果是:5002.0'

对齐

  • >:靠右,数值类型默认方式
  • ^:居中
print(f'{name}')  # 字符串默认左
print(f'{name:>20.10s}')  # > 右对齐 长度20  字符串最大长度10
print(f'{name:<20.12s}')  # 
Yule Cottage
Yule Cotta
Yule Cottage
pi = 3.1415926

print(f'{pi}')  # 原数据
print(f'{pi:^10.4f}')  # 居中 长度为10  保留4位小数
print(f'{pi:>10.4f}')  # 靠右 长度为10  保留4位小数
print(f'{pi:<10.4f}')  # 靠左 长度为10  保留3位小数
3.1415926
3.1416
3.1416
3.1416

填充

print(f'{pi}')  # 原数据

print(f'{pi:*^10.4f}')  # 填充*:居中 长度为10  保留4位小数
print(f'{pi:*>10.4f}')  # 填充*:靠右 长度为10  保留4位小数
print(f'{pi:*<10.4f}')  # 填充*:靠左 长度为10  保留3位小数
3.1415926
**3.1416**
****3.1416
3.1416****

千位分隔符

和format中的千位分隔符相同,主要是用于金融货币中,自带金钱属性呀。可以使用逗号或者其他符号,常用逗号:

money = 1234567890

print(f'{money:,f}')  # 输出保留6位小数
1,234,567,890.000000
print(f'{money:_f}')   # 使用下滑线



    
1_234_567_890.000000

四、字符串模板string template

string.Template是将一个string设置为模板,通过替换变量的方法,最终得到想要的string

from string import Template  # 导入模板

template_string = '$name is $sex'

s = Template('$name is $sex')
s.substitute(name="Peter",sex="male")
'Peter is male'
from string import Template  # 导入模板

template_string = '$name is $sex'  # 1、设置模板
s = Template(template_string)  

dic = {"name":"Peter","sex":"male"}

s.substitute(dic)
'Peter is male'

在上面的例子中:

  • 模板s中有以$符号说明模板中有两个变量名,用实际的变量来替换。

  • 格式是dictionary,并且字典中的key值与模板中的变量名要保持一致

  • string.Template默认用$符号来标识出变量;可以进行修改

from string import Template
class MyTemplate(Template):     
    delimiter = '%'
...     
s = MyTemplate('%who knows?')  # 改变符号
s.substitute(who='Peter')
'Peter knows?'

五、格式整理

整理下关于对齐、精度、数值类型的符号等知识点:

对齐

  1. >:左对齐(字符串默认对齐方式)
  2. ^:居中

符号

  1. +:负数前加负号(-),正数前加正号(+)
  2. -:负数前加负号(-),正数前不加任何符号(默认)
  3. 空格:负数前加负号(-),正数前加一个空格

宽度和精度

  • width:指定宽度为width
  • width.precision:宽度为width,精度为precision
  • 0width:宽度为width,指定高位用0补足宽度

六、总结

1、%占位符

表达式比较直观,容易上手;但是当参数变多的时候,格式就变得繁琐,这种方式现在几乎淘汰

2、format函数

方法比较灵活,能够自己设置参数来对应相应的变量;参数变多的时候,表达式同样繁琐,整个式子会非常长

3、f-string

相对前两种方式会灵活些,也更直观。Python3.6开始出现,语句格式可能稍显复杂

重点还是要掌握format函数和f-string

往期精彩回顾




本站qq群851320808,加入微信群请扫码:
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118476