本文最后更新于:14 天前
[TOC]
格式化输出和深浅拷贝
前面我熟悉了列表
、字符串
、元组
的常用操作以及对应的增删改查
,今天我们来深入了解格式化输出
和深浅复制
相关的知识点。
格式化输出
传统方法
%s
%字符串
演示:
In [1]: a = 'hello'
In [2]: b = 'python '
In [3]: "%s %s" %(a, b)
Out[3]: 'hello python '
In [4]: c = 123
In [5]: "%s %s" %(a, c)
Out[5]: 'hello 123'
%d
%数字
注意:只能传入数字
演示:
In [6]: a = 'hello'
In [7]: b = 'python '
In [8]: c = 123
In [9]: "%d %d" %(a, c)
-----------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-2d6d5e198328> in <module>
----> 1 "%d %d" %(a, c)
TypeError: %d format: a number is required, not str
In [10]: "%d %d" %(c, c)
Out[10]: '123 123'
In [11]: "%d"%123.34
Out[11]: '123'
In [12]: "%d %d" %(123, 123.34)
Out[12]: '123 123'
%f
%浮点数
演示:
In [14]: '%f'%2.3
Out[14]: '2.300000'
In [15]: '%.2f'%2.3
Out[15]: '2.30'
In [16]: '%.2f'%2.333434
Out[16]: '2.33'
In [17]: '%.2f'%2.35
Out[17]: '2.35'
In [18]: '%.2f'%2.36
Out[18]: '2.36'
In [19]: '%.3f'%2.36
Out[19]: '2.360'
In [20]: '%.4f'%2.36
Out[20]: '2.3600'
%c
%ASCII字符
演示:
In [21]: '%c'%97
Out[21]: 'a'
In [22]: '%c'%65
Out[22]: 'A'
In [23]: '%c'%61
Out[23]: '='
In [24]: '%c'%60
Out[24]: '<'
%o
%8进制
演示:
In [25]: '%o'%9
Out[25]: '11'
In [26]: '%o'%10
Out[26]: '12'
In [27]: '%o'%107
Out[27]: '153'
In [28]: '%o'%17
Out[28]: '21'
%x
%16进制
演示:
In [29]: '%x'%16
Out[29]: '10'
In [30]: '%x'%15
Out[30]: 'f'
In [31]: '%x'%14
Out[31]: 'e'
In [32]: '%x'%10
Out[32]: 'a'
%e
%科学计数法
演示:
In [33]: '%e'%0.01
Out[33]: '1.000000e-02'
In [34]: '%e'%0.001
Out[34]: '1.000000e-03'
In [35]: '%e'%10
Out[35]: '1.000000e+01'
In [36]: '%e'%100
Out[36]: '1.000000e+02'
扩展
%r
原始化
演示:
In [43]: print('%s'%'123')
123
In [44]: print('%r'%'123')
'123'
%+6.5f
规定输出的字符串的个数和输出小数的位数
注意:%6.5f 指的是一个输出6个字符,其中5个小数
如果:前面带+就是表示输出符号
前面带-号表示左对齐
演示:
In [46]: '%5.3f'%1.2
Out[46]: '1.200'
In [47]: '%6.3f'%1.2
Out[47]: ' 1.200'
In [48]: '%6.3f'%12.34567
Out[48]: '12.346'
In [49]: '%+6.3f'%12.34567
Out[49]: '+12.346'
In [50]: '%+6.3f'%-12.34567
Out[50]: '-12.346'
In [60]: '%8.2f'%13.3333
Out[60]: ' 13.33'
In [61]: '%-8.2f'%13.3333
Out[61]: '13.33 '
In [62]: '%08.2f'%13.3333
Out[62]: '00013.33'
Python方法
在Python中我们一般使用format
来进行格式化输出
format
In [67]: '{:.2f}'.format(12.333)
Out[67]: '12.33'
In [68]: '{a:.2f}'.format(a=12.333)
Out[68]: '12.33'
保留两位小数
In [70]: '{:.2%}'.format(0.001)
Out[70]: '0.10%'
In [71]: '{:.2%}'.format(0.61)
Out[71]: '61.00%'
百分比格式
In [72]: '{0:x}'.format(20)
Out[72]: '14'
In [73]: '{0:x}'.format(10)
Out[73]: 'a'
转换成十六进制
In [74]: '{0:o}'.format(20)
Out[74]: '24'
In [75]: '{0:o}'.format(10)
Out[75]: '12'
转换成8进制
注意:进制转换时使用{0:进制}这个格式
In [76]: '{a:<10}'.format(a=12.3,b=13.44)
Out[76]: '12.3 '
左对齐,长度为10
In [77]: '{a:0<10}'.format(a=12.3,b=13.44)
...:
Out[77]: '12.3000000'
数字补x(填充右边,宽度为4)
In [78]: '{a:0>10}'.format(a=12.3,b=13.44)
Out[78]: '00000012.3'
右对齐,长度为10
In [79]: '{a:0^10}'.format(a=12.3,b=13.44)
Out[79]: '00012.3000'
两边对齐, 长度为10
字符串转义
字符前面加上 \ ,字符就不再表示字符本身的意思,表示ASCII码中不能显示字符,常见有下:
\n
换行
演示:
In [83]: print('abc\nabc')
abc
abc
\t
水平制表符
演示:
In [84]: print('abc\tabc')
abc abc
\b
退格
演示:
In [85]: print('abc\babc')
ababc
\r
回车,当前位置移到本行开头
演示:
In [87]: print('abc\rbc')
bcc
\
代表反斜杠 \
演示:
In [88]: print('abc\\bc')
abc\bc
\’
代表一个单引号,同样的 “ ? 等符号也可以这么输出
演示:
In [95]: print('abc\' \"b c')
abc' "b c
\0
代表一个空字符
演示:
In [96]: print('abc\0abc')
abcabc
In [97]: print('abc\0\0abc')
abcabc
\a
系统提示音(交互环境需使用print)
取消转义
在python中如果要去掉字符串的转义,只需要在字符串前面加上 r
演示:
In [104]: print(r'abc\b\t\nabc')
abc\b\t\nabc
格式化和转义的应用
格式化得到的结果都是字符串,通过把位置预先留出来,后期再往其中填入内容可以让输出内容更加整洁美观,而又具有良好的可读性,同时让代码更简洁精练。
字符串的转义可以方便我们表示我们不太方便表示的字符,同时转义有些情况下又会带来麻烦,特别是在表示路径的时候,这种情况下可以在字符串前面加上 r 来去掉字符串的转义。
字符串编码
对于编码这部分,我们先举个栗子来看看:
In [105]: '你好'.encode('utf-8')
Out[105]: b'\xe4\xbd\xa0\xe5\xa5\xbd'
In [106]: '你好'.encode('gbk')
Out[106]: b'\xc4\xe3\xba\xc3'
我们可以通过不同的编码方式来进行编码以便我们在不同情况下使用,接下来我们来看看编码相关的知识点
Python对于字符集的处理
字符编码的作用
Python统一了编码,这样Python在内部处理的时候不会因编码不同而出现程序不能正常执行的问题。
Python会自动根据系统环境选择编码,但是经常在文件传输的过程中,会遇到各种不同的编码,这个时候就需要我们去处理编码问题。
深浅复制
举个栗子看看
In [107]: s = [1, 2, 3]
In [108]: s2 = ['a', s]
In [109]: s2
Out[109]: ['a', [1, 2, 3]]
In [111]: id(s), id(s2), id(s2[1])
Out[111]: (139956880001800, 139956880021256, 139956880001800)
我们可以看出来,s2只是引用了s的值,s2[1]的值会随着s的变化而变化。
浅复制
举个栗子:
In [136]: s = [1, 2, 3]
In [137]: s2 = ['a', s]
In [138]: s3 = s2.copy()
In [139]: s[0]='w'
In [140]: s2
Out[140]: ['a', ['w', 2, 3]]
In [141]: s3
Out[141]: ['a', ['w', 2, 3]]
In [149]: id(s2[1]), id(s3[1]),id(s)
Out[149]: (139956883394376, 139956883394376, 139956883394376)
由上面的栗子可以看出来,虽然s3是copy的,但是s3还是会随着s的变化来变化的。那我们有什么办法让s3的值不变呢?那就是深拷贝。
深复制
举个栗子:
In [150]: s = [1, 2, 3]
In [151]: s2 = ['a', s]
In [152]: import copy
In [153]: s3 = copy.deepcopy(s2)
In [154]: s2
Out[154]: ['a', [1, 2, 3]]
In [155]: s3
Out[155]: ['a', [1, 2, 3]]
In [156]: s[0]='r'
In [157]: s2
Out[157]: ['a', ['r', 2, 3]]
In [158]: s3
Out[158]: ['a', [1, 2, 3]]
In [159]: id(s),id(s2[1]),id(s3[1])
Out[159]: (139956879794952, 139956879794952, 139956879278408)
通过深拷贝,我们就实现了,原数据改变的时候,复制的数据不会随着改变。
深浅复制的应用
深浅复制只有在列表嵌套列表
的情况下讨论。
如果想保留修改之前的数据,就可以使用列表的复制,但要注意列表嵌套情况下的问题。
bytes和bytearray
bytes二进制序列类型
In [169]: a= bytes(3)
In [170]: a[0]
Out[170]: 0
In [171]: a[1]
Out[171]: 0
使用bytes(number)指定长度的零填充字节生成一个二进制的序列类型
In [172]: bytes(b'abc')
Out[172]: b'abc'
二进制字符串
bytearray二进制数组
In [173]: a = bytearray(3)
In [174]: a
Out[174]: bytearray(b'\x00\x00\x00')
In [175]: a[1]
Out[175]: 0
使用bytearray(number)指定长度的零填充字节生成一个二进制的数组
In [176]: bytearray(b'abc')
Out[176]: bytearray(b'abc')
二进制字符串
二进制序列类型的应用
二进制序列类型的用法比较少见,是python中少用的一种序列类型。
对于二进制序列类型,大家基本了解即可。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!