Python基础教程4–格式化字符串

原文链接: http://www.juzicode.com/archives/392

从前面的数据类型和基本输出print()函数学习中,我们可以看到print()可以将各种数据类型打印出来,其实在print()函数内部完成了这些数据类型到字符串的转变再输出到屏幕上。在某些场合比如需要输出到文本文件中并能显示给人看,就需要将非字符串类型的变量进行格式化再写入到文本文件中。

str()

str()函数是一个各种数据类型通吃的函数,可以将bool,None,int,float,list,tuple,set,dict等数据类型转换成字符串形式,转换方法:str(转换对象)。

源码print(‘—–欢迎来到www.juzicode.com’)
print(‘—–公众号: juzicode/桔子code\n’)
print(‘基本输出实验’)
a = 3
b = 5.12345
c = ‘桔子code’
d = [1,2,3,4,5]
e = (1,2,3,4,5)
f = {1,2,3,4,5}
g = {1:10,2:20,3:30}
h = True
i = None 
print(‘ a:’,str(a))
print(‘ b:’,str(b))
print(‘ c:’,str(c))
print(‘ d:’,str(d))
print(‘ e:’,str(e))
print(‘ f:’,str(f))
print(‘ g:’,str(g))
print(‘ h:’,str(h))
print(‘ i:’,str(i)) 
结果 a: 3 
b: 5.12345 
c: 桔子code 
d: [1, 2, 3, 4, 5] 
e: (1, 2, 3, 4, 5) 
f: {1, 2, 3, 4, 5} 
g: {1: 10, 2: 20, 3: 30} 
h: True 
i: None

2 format()

format方法:’{0}xyz{1}xyz……{n}’.format(变量0,变量1,….变量n),其中xyz是任何其他要显示的字符,也可以是空白字符,format方法和str一样不需要知道变量的数据类型,但是{}中的变量数量的个数n必须和变量n的个数一致。

源码a = 3
b = 5.12345
c = ‘桔子code’
d = [1,2,3,4,5]
e = (1,2,3,4,5)
f = {1,2,3,4,5}
g = {1:10,2:20,3:30}
h = True
i = None 

out = ‘ a:{0},b:{1},c:{2},d:{3},e:{4},f:{5},g:{6},h:{7},i:{8}’.format(a,b,c,d,e,f,g,h,i)
print(‘转换后:’,out)  
结果转换后:  a:3,b:5.12345,c:桔子code,d:[1, 2, 3, 4, 5],e:(1, 2, 3, 4, 5),f:{1, 2, 3, 4, 5},g:{1: 10, 2: 20, 3: 30},h:True,i:None

如果format函数入参多了一个变量i,虽然没有报错,但是原本想把i也转换为字符串,却不会转换成功:

源码out = ‘ a:{0},b:{1},c:{2},d:{3},e:{4},f:{5},g:{6},h:{7}’.format(a,b,c,d,e,f,g,h,i) #format函数入参多了个i
结果转换后:  a:3,b:5.12345,c:桔子code,d:[1, 2, 3, 4, 5],e:(1, 2, 3, 4, 5),f:{1, 2, 3, 4, 5},g:{1: 10, 2: 20, 3: 30},h:True

如果format函数入参少一个变量i,则会出现抛异常:

3 格式化符号%

格式化符号的使用方法: ‘xyz %格式化模式1 xyz%格式化模式2xyz……%格式化模式n‘%(被格式化对象1,被格式化对象2,…..被格式对象n),在引号里面的“%格式化模式n”是一个整体不可以拆分,xyz的位置可以插入任何字符串;在引号外紧跟一个%符号和一个tuple,tuple里面是要被格式化的对象,对象的个数必须要和引号中的“%格式化模式”个数相等,同时它们的顺序要一一对应。 当只有一个被格式化对象时,被格式化对象也可以不用小括号包含:’xyz %格式化模式xyz’%被格式化对象,当然前一种方法更通用,当需要扩展多个格式化对象时更方便。

>>> a = 15
>>> ‘a=%d’%(a)   #只有一个被格式化对象方式1
‘a=15’

>>> ‘a=%d’%a    #只有一个被格式化对象方式2
‘a=15’

3.1 格式化符号%s

下面的例子是int,float,str,list,tuple,dict,set,bool,None等数据类型,全部用%s格式化的例程,从实验结果我们发现tuple是不能用%s的方式格式化的:

源码a = 3
b = 5.12345
c = ‘桔子code’
d = [1,2,3,4,5]
e = (1,2,3,4,5)
f = {1,2,3,4,5}
g = {1:10,2:20,3:30}
h = True
i = None 
print(‘ a:%s’%(a))
print(‘ b:%s’%(b))
print(‘ c:%s’%(c))
print(‘ d:%s’%(d))
print(‘ f:%s’%(f))
print(‘ g:%s’%(g))
print(‘ h:%s’%(h))
print(‘ i:%s’%(i))
print(‘ e:%s’%(e)
结果 a:3 
b:5.12345 
c:桔子code 
d:[1, 2, 3, 4, 5] 
f:{1, 2, 3, 4, 5} 
g:{1: 10, 2: 20, 3: 30} 
h:True 
i:None
Traceback (most recent call last):  File “E:\juzicode\py3study\04-字符串转换\格式化.py”, line 29, in <module>    
print(‘ e:%s’%(e))
TypeError: not all arguments converted during string formatting

3.2 其他格式化符号

格式化符号显示方式
%b二进制显示
%o八进制显示
%d十进制显示
%i十进制显示
%x十六进制显示
%E指数 (基底写为E)
%e指数 (基底写为e)
%f浮点数
%F浮点数
%g指数(e)或浮点数 (自动选择显示模式,大数字用指数)
%G指数(E)或浮点数 (自动选择显示模式,大数字用指数))
%s字符串,和str()一样
%r字符串,和repr()一样
%c单个字符,只能显示单个字符
%%显示”%”本身

例程:

源码a = 100
print(‘整数100 8进制显示:a=%o’%(a))
print(‘整数100 10进制显示:a=%d’%(a))
print(‘整数100 10进制显示:a=%i’%(a))
print(‘整数100 16进制显示:a=%x’%(a)) 

b = 3.1415925
print(‘浮点数3.1415925 指数E显示:b=%E’%(b))
print(‘浮点数3.1415925 指数e显示:b=%e’%(b))
print(‘浮点数3.1415925 浮点数F显示:b=%F’%(b))
print(‘浮点数3.1415925 浮点数f显示:b=%f’%(b))
print(‘浮点数3.1415925 指数G显示:b=%G’%(b))
print(‘浮点数3.1415925 指数g显示:b=%g’%(b))
b = 314159256
print(‘浮点数314159256 指数G显示:b=%G’%(b))
print(‘浮点数314159256 指数g显示:b=%g’%(b)) 

c = ‘j’
print(‘字符j 单个字符显示:c=%c’%(c)) 
r = ‘桔子code’

print(‘字符串 解释器模式显示:r=%r’%(r))
结果整数100 8进制显示:a=144
整数100 10进制显示:a=100
整数100 10进制显示:a=100
整数100 16进制显示:a=64

浮点数3.1415925 指数E显示:b=3.141592E+00
浮点数3.1415925 指数e显示:b=3.141592e+00
浮点数3.1415925 浮点数F显示:b=3.141592
浮点数3.1415925 浮点数f显示:b=3.141592
浮点数3.1415925 指数G显示:b=3.14159
浮点数3.1415925 指数g显示:b=3.14159
浮点数314159256 指数G显示:b=3.14159E+08
浮点数314159256 指数g显示:b=3.14159e+08

字符j 单个字符显示:c=j

字符串 解释器模式显示:r=’桔子code’

3.3 对齐、指定宽度、精度

格式化符号还可以进一步用flags等方式控制显示,得到更丰富的显示模式:%[flags][width].[precision]格式化符号。

flags:可以选择0、+、-、’ ‘(空格)。0表示使用0填充,+表示右对齐。-表示左对齐。’ ‘为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。

width: 显示宽度

precision: 小数点后精度

下面的例子是一个整数按照16进制显示,左侧补0,显示8个字符宽度:

源码a = 100
print(‘整数100 16进制左侧补0显示:a=%08x’%(a))
结果整数100 16进制左侧补0显示:a=00000064

下面的例子是一个浮点数小数点后保留2位显示:

源码b = 3.1415925
print(‘浮点数3.1415925 保留小数点后2位显示:b=%.2f’%(b))
结果浮点数3.1415925 保留小数点后2位显示:b=3.14

4 整数的其他转换方法

int类型的数据也可以通过hex(),oct(),bin()等函数转换为相应进制的字符串表示。下面的例子是整数100分别表示为16进制,8进制,2进制的字符串形式,

>>> hex(100)
'0x64'
>>> oct(100)
'0o144'
>>> bin(100)
'0b1100100'

chr()函数将一定范围内的整型数据转换为ASCII字符(能用ASCII表示的字符)或者16进制(255以下不可见字符)、或者Unicode表达式(256以上,0x110000以下)。

ord()函数则是chr的逆操作函数。

>>> chr(100)
'd'
>>> chr(1000000)
'\u000f4240'

>>> ord('d')
100

示例代码:https://github.com/juzicode00/py3study/tree/master/04-格式化字符串

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注