python123⼦字符串输出_Python字符串格式化⽅法1
类C语⾔格式化
使⽤print或printf输出,⽐较接近C语⾔的输出⽅式,基本格式如下:
"%格式符 %格式符....%格式符" % (对象1, 对象2,....对象n)
类C语⾔格式化使⽤%号来分隔左边的字符串模版和右边要被格式化的对象,就像是在左边挖了很多个坑,然后⽤右边的对象填进去。但是左边的坑有多⼤,能填什么类型的对象。都是由格式符号来决定的。常见的格式符号有:
d,i 带符号的⼗进制数
o 不带符号的⼋进制数
u 不带符号的⼗进制数
x 不带符号的⼗六进制(⼩写)
X 不带符号的⼗六进制(⼤写)
e 科学计数法表⽰的浮点数(⼩写)
E 科学计数法表⽰的浮点数(⼤写)
f,F ⼗进制浮点数
g 如果指数⼤于-4或者⼩于精度值则和e相同,其他情况与f相同
G 如果指数⼤于-4或者⼩于精度值则和E相同,其他情况与F相
c 单字符(接收整数或单字符字符串)
r 字符串(使⽤repr转换任意Python对象)
s 字符串(使⽤str转换任意Python对象)
a ASCII字符
看起来很多,但是常⽤的基本上只有d, i, e, f, s这⼏个。我们在表⾥看⼀下它们的作⽤是什么,把直接给常⽤的记住就⾏,其他特殊类型的格式符号都是在使⽤的时候才去查询。
看完⽤法以后,我们来简单看⼏个⽰例:
整数和字符串输出
>>> "My name is %s, my age is %d years old" % ('afei', 30)
'My name is afei, my age is 30 years old'
# 浮点数输出
>>> import math
>>> "π 的值是:%f" % (math.pi)
'π 的值是:3.141593'
# ⼋进制和⼗六进制输出
>>> "%d translate to oct is %o" % (255, 255)
'255 translate to oct is 377'
>>> "%d translate to hex is %x" % (255, 255)
'255 translate to hex is ff'
# ⼗六进制⼤写
>>> "%d translate to hex is %X" % (255, 255)
'255 translate to hex is FF'
# 科学计数法
>>> "%f 对应的科学计数法的值是:%e " % (314.15926, 314.15926)
'314.159260 对应的科学计数法的值是:3.141593e+02 '
# 输出对象
>>> class Demo:
... def __str__(self):
... return "This is a demo class"
.
.. def __repr__(self):
... return "This is a demo info for machine, not for human"
...
>>> demo = Demo()
>>> "demo is %s" % (demo)
'demo is This is a demo class'
>>> "demo is %r" % (demo)
'demo is This is a demo info for machine, not for human'
上⾯的⽰例中简单的演⽰了常见的⼏种格式符号的⽤法。但是在实际的项⽬中,还会遇到很多其他的需求,例如
字符串对齐怎么处理
每⼀列怎么设置宽度
怎么设置⼩数后⾯的输出精度
⽽想要解决这些问题,就需要⽤到更⾼级的格式,像下⾯这样的格式,就是更⾼级的⽤法:
"%[(name)][flags][width][.precision] typecode" % (对象,)
这个复杂格式化⾥⾯的字段含义如下:
(name) 表⽰根据名称⾃动解析后⾯的对象,⼀般是字典(不需要解包)。
flags 转换标志,默认是右对齐,- 表⽰左对齐,+ 表⽰在转换值前⾯加上正负号,0表⽰转换值宽度不够时⽤0填充。width 输出字符串的宽度,⼀般是⼀个数字表⽰的值,例如20。
precision 设置⼩数点后有效数字位数,当precision为*号时,由后⾯的值给出。
typecode:即上⾯列出来的格式符号类型
同样的,通过⽰例来演⽰更为直观:
# 演⽰name的⽤法
>>> "My name is %(name)s, and my age is %(age)d" % ({'name':'afei', 'age':30})
'My name is afei, and my age is 30'
# 演⽰flags和width的⽤法
# 单个左对齐和15的宽度
>>> dict = {'name':['zhangsan', 'lisi', 'wangwu', 'afei'], 'age':[25, 26, 27, 28, 30]}
>>> for name, age in zip(dict['name'], dict['age']):
... print("%-15s %15d" % (name, age))
...
zhangsan 25
lisi 26
wangwu 27
afei 28
printf怎么输出字符
# 两个元素全部左对齐和15的宽度
>>> for name, age in zip(dict['name'], dict['age']):
... print("%-15s %-15d" % (name, age))
...
zhangsan 25
lisi 26
wangwu 27
afei 28
# ⼩数点的⽤法,3、4、2位⼩数
>>> "%-15.3f %-15.4f %15.2f" % (1/3, 1/4, 1/6)
'0.333 0.2500 0.17'
>>> "%-15.*f" % (3, 1234.56789)
'1234.568 '
这⾥要注意的是:
格式符号和后⾯的对象类型要匹配,不匹配的时候会出现⼀些问题,⼩数点是⽤来分隔宽度和⼩数点位数的,别忘了带上。不匹配的时候会出现什么问题呢?来看⼀下⽰例:
# 精度丢失
>>> "%-15.3d" % (1/3)
'000 '
# 类型不匹配异常
>>> "%-15.3d" % ('0537')
Traceback (most recent call last):
File "", line 1, in
TypeError: %d format: a number is required, not str
这两个问题是最常见的,⼤家在使⽤的时候⼀定要注意。
格式化调⽤⽅法——format⽅法
因为类C格式化⽅法的⽤法和python的哲学并不匹配,Python的哲学是简单,就是要让学习难度更低。于是Python发展出了⾃⼰的格式化⽅法format。format格式化⽅法使⽤起来语法相对更加简单,不需要记忆各种格式化符号,基本⽤法只需要⼀个花括号就可以了,像下⾯这样:
"{} {}.... {}".format(对象1, 对象2, ....对象n)
就像是字符串的⼀个内置⽅法调⽤,左边准备格式化的字符串中使⽤花括号设置待格式化对象的位置,然后format⽅法⾥传⼊对应个数的变量即可。同时,它还⽀持以下特性
根据format⽅法的参数位置来指定对象的位置
⽀持序列解包
⽀持关键字
⽀持对象属性访问
下⾯我们来看⼀下基本⽤法的⼏个⽰例:
# 位置⾃动匹配
>>> "My name is {}, age is {}".format('afei', 30)
'My name is afei, age is 30'
# 位置精确匹配
>>> "My name is {1}, age is {0}".format(30, 'afei')
'My name is afei, age is 30'
# 关键字匹配
>>> "My name is {name}, age is {age}".format(age=30, name='afei')
'My name is afei, age is 30'
# 序列解包
>>> "My name is {}, age is {}".format(*['afei', 30])
'My name is afei, age is 30'
# 字典键值对应,这⾥的字典对象也需要解包后才能匹配,和关键字匹配类似
>>> "My name is {name}, age is {age}".format(**{'name': 'afei', 'age':30})
'My name is afei, age is 30'
# 位置匹配和关键字匹配混⽤,这⾥要注意,位置参数要在关键字参数之前
>>> "My name is {name}, age is {0}".format(19, name='afei')
'My name is afei, age is 19'
# 点号访问属性
>>> class Person:
.
.. def __init__(self, name, age):
... self.name = name
... self.age = age
...
>>> p = Person('afei', 30)
>>> "My name is {0.name}, age is {0.age}".format(p)
'My name is afei, age is 30'
但是在使⽤过程中,format格式化也会遇到和类C格式化相同的问题,例如对齐、⼩数位数等。format⽅法也因此提供了和类C格式化同样的⾼级⽤法,⾼级⽤法的基本格式是:
{[field_name]!conversion:formatspec}
但是这⾥⾯的formatspec⼜可以划分为更细致的格式化类型,如下所⽰:
[[fill][align]][sign][#][0][width][separate][.precision][typecode]
也就是说,组合起来,变成了下⾯这个样⼦
"{[field_name]![conversion]:[[fill][align]][sign][#][0][width][separate][.precision][typecode]}".format('test')
也就是说,这种格式化⽅法,从简单的使⽤上,它确实更简单了,就像上⾯简单⽤法⾥的⼏个⽰例⼀样。但是从功能上说,⽆疑是变得更强⼤,也更复杂了。你想实现更⾼级的定制,就得学习它更⾼级的⽤法。我们来看⼀下它对应的参数怎么使⽤。
格式参数解释:
field_name 两种形式,以0,1,2这样的形式时,表⽰根据位置来查变量,以关键字形式时,表⽰字典格式化,对应字典中的键值。这个在上⾯简单⽤法的⽰例⾥演⽰过
conversion 表⽰转换格式,⽀持三种类型,分别是s|r|a,即str、repr、ascii三种格式的字符串。⼀般⽤于类对象的输出,默认是str。
fill 填充字符,可以是除'{'、'}'外的任意字符,即当你设置字符串的输出宽度时,空⽩位置⽤什么东西来填充。
align 字符串对齐⽅式
'
'>' 右对齐
'=' 仅⽤于数字对齐,将填充字符放在数字符号和数字之间,⽽不是数字符号外⾯或数字后⾯。
'^' 居中对齐
sign 仅针对数字类型
'+' 表⽰正负数都要带上符号
'-' 表⽰只有负数带上符号,正数不需要,默认选项
space 表⽰正数前⾯要带⼀个空格,负数前⾯带'-'号
⽤来切换不同进制的数字显⽰形式,⼗进制没有区别。
separate ⽤来分隔数字的符号,例如使⽤逗号分隔1,234.5,使⽤_号分隔,1_234.5
width 对齐宽度
.
precision 输出⼩数时,数字的有效位数,当后⾯带上格式符号 f 时,表⽰⼩数点后有效位数,如果不带,则表⽰整个数字的有效位数。
typecode 输出的格式,和类C语⾔格式化⾥的⽤法⼀样,有以下值:
·"b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论