可变与不可变
可变
# 原id地址不会被改变:不管值如何变化,它的id地址还是原来的id地址不会被改变。
list
a = ['1']
print(id(a))
a.append('b')
print(id(a))
2478325125640
2478325125640#值改变,地址不会改变
set
a = {'a'}
print(id(a))
a.add('b')
print(id(a))
2358866312776
2358866312776 #值变,地址不变
dict
a = {'a':1}
print(id(a))
a.setdefault('b', 1)
print(id(a))
1945361517128
1945361517128 #值变,地址不变
不可变
# 不能直接被改变,如果需要改变只能进行重新赋值,但重新赋值之后id地址将会改变。
int
a = 1
print(id(a))
a = 2
print(id(a))
140712754969664#原id地址
140712754969696# 重新赋值后的id地址
str
a = '1'
print(id(a))
print(a.replace('1', '1234'))
2379913191344#原id地址
2379914247344# 使用replace重新赋值修改后的id地址
tuple # 和上述同理
字符串转义
字符前存在(反斜杠),在特定情况下字符就不再表示本身的意思
字符串前加r防止被转义
\n 换行符 \t 水平制表符 \b退格符,往前删除一格#空格位置有数据会被删除
print('a\nb') print('a\tb') print('a\bc')
a a b c
b
\r右边位置移到开头#如果存在多个\r只取结尾的,其余的会被删除。
print('a\rb\rc\rd\re')
e
\\ #防止路径被转义
print('\\')
\
\" 一个双引号
print('\"')
"
\0 一个空格符 #pycharm里运行没有效果,只能在python命令控制台里才有效果
\a 系统提示音 #pycharm里也没有效果,只能在python命令控制台里有效果
编码与解码
编码格式 utf8 gbk
encode编码
remove_1 = '士大夫'
print(remove_1.encode('utf8'))
b'\xe5\xa3\xab\xe5\xa4\xa7\xe5\xa4\xab'
decode解码
remove_1 = '士大夫'
print(remove_1.encode('utf8'))
insert_1 = remove_1.encode('utf8') #这里要用变量名接受才能解码。
print(insert_1.decode('utf8'))
b'\xe5\xa3\xab\xe5\xa4\xa7\xe5\xa4\xab'
士大夫
格式化补充
%s (占位符)和%r(显示原数据类型)区别
print('%s' % '爱') print('%r' % '爱')
爱 '爱' #它会将字符连带着一起打印出来
%d 整数
%f 浮点数 #默认保留六位小数
%c ASCII表
print('%c' % 520) #有专门的ASCII表找到对应的ASCII码加密可能会用到
Ȉ
%o 八进制
%d 十进制
%x 十六进制
左对齐 -
print('%-6.3f' % 6) #这里6是指长度的意思,3是指要保留多少位小,它会优先满足小数点后几位
6.000
+显示正号d
print('%+6.3f' % 6) #用法和-一样,只是不会对齐但会显示正+符号
+6.000
len 查看长度
a = '1234' len不能查看int类型的长度,需转类型。
print(len(a))
4
格式化长度 #通过占位符%s严格控制长度,注意-是从右往左。
print('%6s' % 'a') 这里6表示要控制的长度,它不会计算原有的字符串长度,只会控制添加的字符串长度
format扩展
# {:.}.format()用法
a1 = '{:.2f}'.format(1.234) #:(冒号)表示指定数据类型, .(点)后面+数字表示你要保留多少位小数,这里f是你要表示的数据类型,format()括号里添加你的数值
print(a1)
1.23
# {:.}.format(a = 1,b = 2)指定传入
b1 = '{c1:.2f}'.format(c1 = 2.431)# 这里c1表示用变量名来代替了数值,和b1 ='{}{}{}'.format(y=1, y1=2, y2=3)是一样的。
print(b1)
2.43
# 百分比格式化
c1 = '{:.1%}'.format(0.442)
print(c1)
44.2%
# 八进制
a4 = '{:o}'.format(30)
print(a4)
36
# 十六进制
a5 = '{:x}'.format(30)
print(a5)
1e
# 左对齐 <小于符号 数据长度不足时可以用其它符号或者数字来代替
b2 = '{a:<11}'.format(a = 1, b = 2)
print(b2)
b2 = '{a:x<11}'.format(a = 1, b = 2)
print(b2)
1
1xxxxxxxxxx
# 右对齐 >大于符号 和左对齐同等用法
c1 = '{a:>11}'.format(a = 1, b = 2)
print(c1)
c1 = '{a:x>11}'.format(a = 1, b = 2)
print(c1)
1
xxxxxxxxxx1
# 两边对齐 ^ 和左对齐、右对齐同等用法
d1 = '{a:^9}'.format(a = 1, b = 2)
print(d1)
d1 = '{a:x^9}'.format(a = 1, b = 2)
print(d1)
1
xxxx1xxxx
进制转化
# 十进制转二进制bin()
print(bin(3344))
0b110100010000 前面的0b是声明它是二进制
# 十进制转八进制oct()
print(oct(100))
0o144 同上,0o是声明它是八进制
# 十进制转十六进制 hex()
print(hex(200))
0xc8 同上,0x是声明它是十六进制
# 其它进制转十进制int('这里填进制数据',这里写进制类型),灵活运用可以达到进制与进制之间的转换效果。
print(int('111110', 2)) print(hex(int('100', 8)))#这里是八进制转十六进制
62 0x40
chr 将ASCII码值转换成字符。
print(cha(520))
Ȉ
深浅拷贝
1.浅拷贝
外层不会受影响,内层会受影响。
原来的列表改变,复制的列表同样会改变
a1 = [1, 2, 3, 'a']-----#a1原地址1916558015816
a2 = ['b', a1]---------#a2[1]原地址1916558015816
a3 = a2.copy()--------#a3[1]原地址1916558015816
a1.append('c')
a1
[1, 2, 3, 'a', 'c']
a2
['b', [1, 2, 3, 'a', 'c']]----#这里是嵌套
a3
['b', [1, 2, 3, 'a', 'c']]----#这里是copy
id(a2[1])
1916558015816
id(a1)
1916558015816----------#嵌套内的id地址不会改变
id(a3[1])
1916558015816
2.深拷贝
需要导包import copy deepcopy
内外层都不影响
import copy
b1 = [1, 2, 'a']
b2 = ['b', b1]
b3 = copy.deepcopy(b2)
id(b1)
1916559091336
id(b2[1])
1916559091336
id(b3[1])
1916559091720 #copy.deepcopy深复制过来的数据内外层id地址都不相同,不受原数据影响。
id(b2)
1916559215304
id(b3)
1916559210440