小数据池
先介绍一些编码:
ascii 不支持中文
gbk 支持中文 2个字节 包含ascii码
unicode 万国码 python3 内存unicode
utf-8 可变的长 英文 1 字节 欧洲2个字节 亚洲3个字节
1 s = '乔狗' 2 a = '乔二狗_sb'
s1 = s.encode('utf-8') # 编码 编码集
print(s1) 编码 # b'\xe4\xb9\x94\xe7\x8b\x97'
print(s1.decode('utf-8')) 解码 # 乔狗
a1 = a.encode('utf-8')
print(a1) # b'\xe4\xb9\x94\xe4\xba\x8c\xe7\x8b\x97_sb'
s2 = s.encode('gbk')
print(s2) # b'\xc7\xc7\xb9\xb7'
a2 = a.encode('gbk')
print(a2) # b'\xc7\xc7\xb6\xfe\xb9\xb7_sb'
s1 = s.encode('utf-8') # 编码
print(s1.decode('gbk')) # 解码
列举一个错误的示范
s3 = s.encode('utf-8')
print(s3.decode('gbk')) # 这是一个错误示范,用什么编码,就用什么解码!
应用场景: 文件操作 网络传输 网络编程
坑1:
1 li = [12,2,3,4,5] 2 for i in li: 3 li.append(i) 4 print(li) 5 print(li)
# 会循环着把列表添加到li中,死循环
坑2:
1 li = [12,2,3,4,5] 2 for i in li: 3 li.remove(i) 4 print(li) # 结果[2,4]
1 for i in li: 2 li.pop() 3 print(li) # [12, 2]
1 for i in li: 2 del li[-1] 3 print(li) # [1, 2]
# 不能这样循环的删除列表中的内容,删不干净
正确的操作:
1.
1 for i in range(len(li)): 2 li.pop() 3 print(li)
2.
li = [1,2,3,4,5] li1 = [] for i in li: li1.append(i) for j in li1: li.remove(j) print(li)
# 准备一个空的列表,遍历li列表,把每一个元素添加到li1中
# 遍历li1,用li列表去删除所遍历li1中的内容,这样就能删除干净
1 for i in li: 2 li.clear() 3 print(li)
# 偷鸡方法,正式场合不推荐使用
删除字典中元素:
1 dic = {'1':22,'2':'22'} 2 lst = [] 3 for i in dic: 4 lst.append(i) # 每个字典的键 5 for j in lst: 6 dic.pop(j) 7 print(dic)
# 通过遍历字典,向列表添加字典的键
# 遍历列表,用字典去删除列表中的键,达到删除字典的效果
深浅拷贝:
浅拷贝:
1 li = [1,2,3,4] 2 lst = li.copy() 3 print(li) 4 print(lst)
只拷贝表面,深层不考虑
两个id不同
1 li[0] = 56 2 print(li) # 变 3 print(lst) # 不变
列表中第一项改变为56
li此时不再指向1,而是56,所以改变
lst由于拷贝,所指向还是1,所以不改变
1 li = [1,2,3,4,[5,6,7]] # 浅拷贝只拷贝一层元素 2 lst = li.copy() 3 print(li) 4 print(lst) 5 li[-1].append(90) 6 print(li) # 变 7 print(lst) # 变
li里面的最后一项是可变数据,所以添加一项后,两个列表都改变数据
深拷贝:
1 import copy 2 li = [1,2,3,4,[5,6,7]] 3 lst = copy.deepcopy(li) # 深拷贝 4 # 浅拷贝只拷贝第一层元素,元素是不可变的,就不会变 元素是可变的俩个同时变 5 print(li) 6 print(lst) 7 print(id(li)) # 40289984 8 print(id(lst)) # 40305368 9 li[-1].append(90) 10 print(li) # 变 11 print(lst) # 不变
深拷贝:除了表面一样,内在也拷过来
拷贝的内容相当于另开辟了一块空间,所以各种各的,两个列表的指向不同
拓展:
1 li = [1,2] # li = [1,[1,[1,[1,2]]]] 2 li[1] = li 3 print(li) 4 # 结果 [1, [...]]
每次都会把li这个列表作为第二项,相当于制造了循环
is 和 == 的区别:
== 比较两边的值
is 比较两边的内存地址
代码块:
代码块机制:
数字: -5 ~ 256
字符串: 乘法的时候总长度不能超过20
代码块 > 小数据