Day 07 数据类型补充:编码的进阶
01今日内容大纲
- 基础数据类型的补充
- 数据类型之间的转换
- 编码的进阶
02 昨日内容回顾以及作业讲解
-
id is ==
- ==:数值是否相同
- is:内存地址是否相同
- id:获取对象的内存地址
-
代码块:一个文件,交互式命令一行就是一个代码块
-
同一代码块下的缓存机制(字符串驻留机制):
-
一个文件当中,遇到初始化命令,现在字典中查询数据,如果数据存在便不再创建,如果不存在则创建对应数据。
-
对象:所有数字,bool ,几乎所有的字符串
-
目的:提升性能,节省内存
-
-
不同代码块下的缓存机制(小数据池):在内存中,开辟两个空间,一个空间存储-5~256的int,一个空间存储一定规则的字符串,如果你的代码遇到满足条件的数据,则直接引用提前创建的。
- -5~256 int,bool,满足一顶规则的字符串。
- 优点:提升性能,节省内存空间
-
集合:列表去重,关系测试,交并差
-
深浅copy:
-
浅copy:在内存中,开辟一个新的空间,存放copy的对象(字典,列表),但是里面的所有元素与被copy对象里面的元素共用一个数据。
import copy l1 = [1,2,3,[11,22]] # l2 = l1.copy() #浅copy l2 = copy.copy(l1) #浅copy print(l2) print(id(l1),id(l2)) #地址不一样 print(id(l1[-1]),id(l2[-1])) #内容数据一样
-
深copy:在内存中,开辟一个新的空间,存放copy的对象(字典,列表),但是里面不可变元素沿用同一数据,可变的数据创建新的空间
#深copy import copy l1 = [1,2,3,[11,22]] l2 = copy.deepcopy(l1) print(l2) print(id(l1),id(l2)) print(id(l1[1]),id(l2[1])) #不可ke变的数据类型沿用同一个 print(id(l1[-1]),id(l2[-1])) #可变的数据类型创建新的空间
-
03 具体内容
-
数据类型的补充
-
str
# #数据类型的补充 # # str:补充的方法练习一遍就行 s1 = 'taiBai' # capitalize 首字母大写,其余变小写 print(s1.capitalize()) #swapcase 大小写翻转 print(s1.swapcase()) #title 每个单词首字母大写,遇到非字母就隔开 msg = 'taibai say3hi' print(msg.title()) # center 居中 s1 = 'barry' print(s1.center(20)) print(s1.center(20,'*')) #占位符 # find 通过元素找索引,找到第一个就返回;找不到返回-1 # index 通过元素找索引,找到第一个就返回;找不到就报错 print(s1.find('a')) print(s1.find('r')) print(s1.find('o')) #找不到 -1 print(s1.index('o')) #报错
-
元组
#元组中如果只有一个元素,并且没有逗号,那么他就不是元组,他与该元素的数据类型一致*** tu1 = (2,3,4) print(tu1,type(tu1)) tu2 = (2) #没逗号 print(tu2,type(tu2)) tu3 = ('太白') print(tu3,type(tu3)) tu4 = ([1,2,3]) print(tu4,type(tu4)) tu5 = (1,) print(tu5,type(tu5)) # count 计数 tu = (1,2,3,4,5,6,1,2,3,4,5,6,7,7,4,3,5,7) print(tu.count(4)) #index 通过内容找索引 tu = ('太白', '日天', '太白') print(tu.index(('太白'))) # 0 返回索引值,如果重复,遇到第一个就返回
-
列表
列表 l1 = ['太白', '123', '女神', '大壮'] # count pass # index print(l1.index('大壮')) #sort 排序 *** l1 = [5, 4, 3, 7, 8, 6, 1, 9] l1.sort() #默认从小到大排列 print(l1) #[1, 3, 4, 5, 6, 7, 8, 9] l1.sort(reverse=True) #默认从大到小 print(l1) #[9, 8, 7, 6, 5, 4, 3, 1] # reverse 反转 ** l1.reverse() print(l1) #列表可以相加 l1 = [1, 2, 3] l2 = [1, 2, 3, '太白', '123', '女神'] print(l1+l2) #[1, 2, 3, 1, 2, 3, '太白', '123', '女神'] #列表与数字相乘(重复*次) l1 = [1, 'daf', 3] l2 = l1*3 print(l2) #[1, 'daf', 3, 1, 'daf', 3, 1, 'daf', 3] l1 = [11, 22, 33, 44, 55] # 索引为奇数对应的元素删除(不能一个一个删除,此l1只是举个例子,里面的元素不定)。 # *** 重要 # 正常思路: # 先将所有的索引整出来。 # 加以判断,index % 2 == 1: pop(index) for index in range(len(l1)): if index % 2 == 1: l1.pop(index) print(l1) #列表的特性: l1 = [11, 22, 33, 44, 55] #最简单的: del l1[1::2] print(l1) l1 = [11, 22, 33, 44, 55] # 倒序法删除元素 for index in range(len(l1)-1,-1,-1): if index % 2 == 1: l1.pop(index) print(l1) l2 = [] for i in range(len(l1)): if i % 2 == 0: l2.append(l1[i]) i += 1 l1 = l2 print(l1) #思维置换 l1 = [11, 22, 33, 44, 55] new_l1 = [] for index in range(len(l1)): if index % 2 ==0: new_l1.append(l1[index]) # print(new_l1) l1 = new_l1 print(l1) #循环一个列表的时,最好不要改变列表的大小,这样会影响你的最终的结果。
-
字典
#update dic = {'name': '太白', 'age': 18} dic.update(hobby = '运动',height = '175') #无则添加 print(dic) #{'name': '太白', 'age': 18, 'hobby': '运动', 'height': '175'} dic.update(name = '太白金星') #有则修改 print(dic) #{'name': '太白金星', 'age': 18, 'hobby': '运动', 'height': '175'} dic.update([(1,'a'),(2,'b'),(3,'c'),(4,'d')]) #将元组转化为字典中的键值对 print(dic) #{'name': '太白金星', 'age': 18, 'hobby': '运动', 'height': '175', 1: 'a', 2: 'b', 3: 'c', 4: 'd'} dic1 = {"name":"jin","age":18,"sex":"male"} dic2 = {"name": "alex", "weight": 75} dic1.update(dic2) #更新,有则覆盖,无则添加 print(dic1) print(dic2) # fromkeys 有坑!!!值共用一个!!!! dic = dict.fromkeys('abc',100) dic1 = dict.fromkeys([1,2,3],'alex') print(dic) print(dic1) dic = dict.fromkeys([1,2,3],[]) dic[1].append(666) print(dic) #{1: [666], 2: [666], 3: [666]} dic = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18} # #将字典中含有'k‘元素的键值对删除 for key in dic: if 'k' in key: dic.pop(key) print(dic) #报错!!!迭代时改变字典大小 for key in list(dic.keys()): if 'k' in key: dic.pop(key) print(dic)
-
-
数据类型的转换
# ,0,'',(),{},[],set(),None 转换成bool值为False
-
数据类型的分类(了解)
-
编码的进阶
-
ASCII码:包含英文,数字,特殊字符的与01010101对性关系。
a 01000001 一个字符一个字节表示。
-
GBK:只包含本国文字(以及英文字母,数字,特殊字符)
与01010101对应关系。
a 01000001 ASCII码中的字符:一个字符用一个字节表示。
中 01001001 01000010 中文:一个字符用两个字节表示。
-
Unicode:包含全世界所有的文字与二进制01010101的对应关系
a 01000001 01000010 01000011 00000001
b 01000001 01000010 01100011 00000001
中 01001001 01000010 01100011 00000000
-
UTF-8:包含全世界所有的文字与二进制01010101的对应关系,最少用八位一个字节来表示一个字符
a 01000001 ascii码中的字符:一个字符一个字节表示
To 01000001 01000010 (欧洲文字:葡萄牙,西班牙等):一个字符两个字节表示
中 01001001 01000010 01100011 亚洲文字:一个字符三个字节表示
-
- 不同密码本之间能否互相识别?不能。
- 数据在内存中全部是以Unicode编码的,但你的数据用于网络传输或硬盘存储时,必须是以非Unicode编码(utf-8,gbk等等)。
英文:
str:'hello'
内存中的编码方式:Unicode
表现形式:'hello'
bytes:
内存中的编码方式:非Unicode
表现形式:b'hello'
中文:
str:
内存中的编码方式:Unicode
表现形式:'中国'
bytes:
内存中的编码方式:非Unicode #Utf-8
表现方式:b'\xe4\xb8\xad\xe5\x9b\xbd'
# str ----> bytes
s1 = '中国'
b1 = s1.encode('utf-8') #编码
print(b1,type(b1)) #b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'>
b1 = s1.encode('gbk')
print(b1,type(b1)) #b'\xd6\xd0\xb9\xfa' <class 'bytes'>
# bytes ----> str
b1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
s1 = b1.decode('utf-8')
print(s1,type(s1))
#gbk ---->utf-8
b1 = b'\xd6\xd0\xb9\xfa'
s1 = b1.decode('gbk')
print(s1)
b2 = s1.encode('utf-8')
print(b2) # b'\xe4\xb8\xad\xe5\x9b\xbd'
04 今日总结
- 数据类型的补充:列表list(sort,reverse,相加,相乘,循环问题),字典dict(update,循环问题)***
- 编码的进阶:
- bytes为什存在?
- str---->bytes(Unicode---->非Unicode)
- gbk<--------->utf-8