原文链接: http://www.juzicode.com/archives/392
从前面的数据类型和基本输出print()函数学习中,我们可以看到print()可以将各种数据类型打印出来,其实在print()函数内部完成了这些数据类型到字符串的转变再输出到屏幕上。在某些场合比如需要输出到文本文件中并能显示给人看,就需要将非字符串类型的变量进行格式化再写入到文本文件中。
1 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-格式化字符串