1 内容总览
- 基础数据类型的补充
- 数据类型之间的转换 - 其他数据类型转成bool值为False的情况
- 编码的进阶
2 具体内容
数据类型的补充
str-6个
# str :补充的方法练习一遍就行。6个 # s1 = 'taiBAi' # capitalize 首字母大写,其余变小写 # print(s1.capitalize()) #str的操作,打印的是操作,操作结果才能呈现出来.因为对str进行操作 # title 每个单词的首字母大写 # msg= 'taibai say3hi' #用空格 , _ 中文等不是英文的将这个str的一行英文隔开,以划分有几个单词 # print(msg.title()) # center 居中 # s1 = 'barry' # print(s1.center(20)) #不写用谁填充,默认用空格填 # print(s1.center(20,'*')) #用*填充左右空白 # swapcase() 大小写转换,每个元素都会换 # s = "alex" # print(s.swapcase()) #"ALEX" # s = "Alex" # print(s.swapcase()) #"aLEX" #每个元素都会换 # find :通过元素找索引,若有重的,找到第一个就返回;找不到 返回-1 #推荐使用 # index:通过元素找索引,若有重的,找到第一个就返回;找不到 报错 # print(s1.find('a')) # print(s1.find('r')) # print(s1.find('o')) # print(s1.index('o'))
元组 - 3点
# tuple - 3点 # 元组中如果只有一个元素,并且没有逗号,那么它不是元组,它与该元素的数据类型一致。 *** # tu1 = (2,3,4) # tu1 = (2) # tu1 = ('太白') # tu1 = ([1,2,3]) # tu1 = (1,) # print(tu1,type(tu1)) # tu = (1,2,3,3,3,2,2,3,) # count 计数 # print(tu.count(3)) # tu = ('太白', '日天', '太白') # index 通过元素找索引 # print(tu.index('太白'))
列表 - 7点
# l1 = ['太白', '123', '女神', '大壮'] # count 计数 # index 通过匀速找索引(见上) #list中没有find # print(l1.index('大壮')) #3 # sort 排序 #不能打印动作 ** # l1 = [5, 4, 3, 7, 8, 6, 1, 9] # l1.sort() # 默认从小到大排序(升序) # print(l1) #不能打印动作 # l1.sort(reverse=True) #从大到小排序-降序(需设置参数) # print(l1) # reverse 反转 #list这-不能打印动作 ** # l1 = [5, 4, 3, 7, 8, 6, 1, 9] # l1.reverse() # 反转 # print(l1) #[9, 1, 6, 8, 7, 3, 4, 5] # 列表可与列表相加 ** # l1 = [1, 2, 3] # l2 = [1, 2, 3, '太白', '123', '女神'] # print(l1 + l2) #结果:[1, 2, 3, 1, 2, 3, '太白', '123', '女神'] 是相加后放到了1个列表里 # 列表与数字相乘 ** # l1 = [1, 'daf', 3] # l2 = l1 * 3 # print(l2) #结果:[1, 'daf', 3, 1, 'daf', 3, 1, 'daf', 3] # 坑1 -列表循环问题:循环一个列表的时,最好不要改变列表的大小(长度),这样会影响你的最终的结果。*** 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) #出错:列表的特性:因为从前往后删,删完一个元素后,后面的元素会集体前挪,索引改变,导致结果出错 # 4种办法出坑: # 法一:最简单的-不循环了,直接切片删 # 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): #range顾头不顾腚 # if index % 2 == 1: # l1.pop(index) # print(l1) # 法三:思维置换-将不用删的拿出来放入1个新列表 # 将索引为奇数对应的元素删除(不能一个一个删除,此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) # 法四: 补充-,先把要删的元素取出来,再按元素删 li = [1,2,3,4,5] new_li = [] for i in range(len(li)): #遍历索引 if i % 2 == 1: new_li.append(li[i]) for em in new_li: #遍历的是元素, li.remove(em) #按元素删-因为按索引删,list后面的元素会向前补位 print(li) #坑2-循环添加列表元素的时候,会形成死循环 # 看代码写结果- 平行打印:什么都不打印(因为是死循环);在for循环里面打印,则是打印那些加进去的一大片结果(无休止) # li = [1,2,3,4] # for i in li: # li.append(i) # print(li) #因为每次都会加进去,会一直加下去到无穷 #因为是死循环,一直在循环,故结果出不来,是空白 # print(li) #是打印那些加进去的一大片结果
字典 - 3点
# 字典的补充 - 3点 # update 更新,有则覆盖,无则添加 *** #不能打印动作 # 关于update: #update 括号里的级别高--即是用括号里的去覆盖dict里原有的键的值 # 1.以键值对的形式增 # dic = {'name': '太白', 'age': 18} # dic.update(hobby='运动', hight='175') # print(dic) #结果:{'name': '太白', 'age': 18, 'hobby': '运动', 'hight': '175'} # dic.update(name='太白金星') # print(dic) #结果:{'name': '太白金星', 'age': 18} # 2.以字典的形式增 # dic1 = {"name":"jin","age":18,"sex":"male"} # dic2 = {"name":"alex","weight":75} # dic1.update(dic2) # 更新,有则覆盖,无责添加 # print(dic1) # {'name': 'alex', 'age': 18, 'sex': 'male', 'weight': 75} # print(dic2) # 3.面试题: #考察元组的拆包-即分别赋值,list里的每一个元组就是dic里的键值对 # dic = {'name': '太白', 'age': 18} # dic.update([(1, 'a'),(2, 'b'),(3, 'c'),(4, 'd')]) #1个list里的所有元素都是2元素的元组 # print(dic) #{'name': '太白', 'age': 18, 1: 'a', 2: 'b', 3: 'c', 4: 'd'} # 注:不能打印动作 # fromkeys 快速创建字典-将可迭代对象拆开当成键,可迭代对象后面的值是所有键的值 # 写在前面:#坑:必须先赋值再打印,因为创建dict是开辟了1个新的内存空间 # dic = dict.fromkeys('abc', 100) #将可迭代对象拆开当成键,100是所有键的值 # print(dic) #{'a': 100, 'b': 100, 'c': 100} # 坑:(面试题)当可迭代对象的每一个元素赋予1个可变数据类型时,值共用一个,一个[]变其他的[]都变(因为每一个可迭代对象的元素共用的是同一个内存空间[],是一个人,不管里面做任何修改,[]仍然是这个[]) # dic = dict.fromkeys([1,2,3],[]) # #print(dic) #{1: [], 2: [], 3: []} # dic[1].append(666) #代表往dic键1对应的值里追加666 # print(dic) #{1: [666], 2: [666], 3: [666]} # 补充:当可迭代对象的每一个元素赋予1个不可变数据类型时,1个变,其他的不变 # dic = dict.fromkeys([1,2,3],1) # #print(dic) #{1: 1, 2: 1, 3: 1} # dic[1] = 123 # print(dic) #{1: 123, 2: 1, 3: 1} #1个变,其他的不变,因为是不可变数据类型 # 坑-循环问题:循环一个字典时,如果改变这个字典的大小,就会报错。 **重要 # 需求:将字典中的键中含有'k'元素的键值对删除。 # dic = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18} # for key in dic: # if 'k' in key: # dic.pop(key) # print(dic) #会报错:RuntimeError:字典在迭代期间更改大小 # 2种方法出坑: # 出坑1:把含有"k"的键全部加入1个新list中,再去删list里的元素(即dict的键)-2次for循环遍历 # l1 = [] # for key in dic: # if 'k' in key: # l1.append(key) # print(l1) # for i in l1: # dic.pop(i) # print(dic) # 出坑2:将dic_keys数据类型转换成list,再去删该list里的元素 # for key in list(dic.keys()): #将dic_keys数据类型转换成list # if "k" in key: # 代表如果键中含"k" 注:循环的是谁就in谁 # dic.pop(key) # print(dic) # 注:最后打印的是字典 # 4.popitem() 随机删除 #python3.6版本以后默认删除最后一个键值对 # dic.popitem() # print(dic) # 补充:如何更改pycharm解释器的版本 # 补充:python2 中不支持中文-如何操作可以支持中文? #几乎用不到
# 注:dict的3种特殊的查-dic.keys() # 1.dic.keys()是一种特殊的数据类型dic_keys,里面的元素是dict的所有的键;它不是列表,只是一个盛着字典所有键的1个容器,可循环遍历,可迭代(待定). # 2.数据类型之间的转换:想转换成谁,就用谁包起来.除了dict不能转,其他6种都可以
数据类型的转换- 其他数据类型转成bool值为False的情况
# 0,''(),[],{},set(),None 转换成bool值为False # 注:str-->int时,str里必须都是十进制的数字 # 注:7种数据类型的转换时,除dict外,其他的均能直接 # 注:7种中的 无序:dict set # 注:7种中的 可变:list dict set # 面试题: str-->list #split #print(s.split()) #用str里没有的符号去分割 list-->str #join #print(''.join(li)) eg1: li = ["taibai","小强"] print('+'.join(li)) #taibai+小强 eg2: li = ["taibai","小强",3] print('+'.join(li)) #报错 #注:可迭代的对象元素里不能出现int eg:str里若是int 报错-不是可迭代对象
编码的进阶
- 不同的密码本之间能否互相识别?不能。-桥梁是Unicode编码集(见utf-8的byte类型-->gbk的bytes类型,中间的str在内存中的编码方式就是Unicode)
- 规定: 数据在内存中全部是以Unicode编码的,但是当你的数据用于网络传输或者存储到硬盘中,必须是以非Unicode进行编码(utf-8,gbk等等),故那7种数据类型要想传输和存储必须转换成bytes类型。
- 注: Unicode--> 非Unicode时,只能str和bytes进行转换,其他6种数据类型要想转换,必须先转换成str,再转换成bytes
- str <---> bytes时: 用哪个编码集编码就要用哪个编码集(4种密码本)解码
- utf-8的byte类型-->gbk的bytes类型,要先用utf-8(用谁编的就用谁解)对前者进行解码(decode),解完码后再对其(str)用gbk进行编码(encode)
- bytes的英文,就是英文,前面来个b; eg: b'hello'
- bytes的中文是很多你不认识的字节; eg: b'\xe4\xb8\xad\xe5\x9b\xbd'
- python3x 内存用的是 utf-8; python2x内存用的是 ASCII
- 不管咋转-凡是见到不认识的(bytes)就解码decode,见到认识的(str)就编码encode
英文:
str: 'hello '
内存中的编码方式: Unicode 表现形式: 'hello'
bytes :
内存中的编码方式: 非Unicode 表现形式:b'hello' #bytes的英文,就是英文,前面来个b
中文:
str:
内存中的编码方式: Unicode
表现形式:'中国'
bytes :
内存中的编码方式: 非Unicode # Utf-8
表现形式:b'\xe4\xb8\xad\xe5\x9b\xbd'
转换:
# str ---> bytes
# 中文:
# eg:将s1转换成utf-8的bytes类型 #Unicode ---> 非Unicode
# s1 = '中国'
# b1 = s1.encode('utf-8') # 编码
# print(b1,type(b1)) # b'\xe4\xb8\xad\xe5\x9b\xbd' utf-8 中文:3字节
# eg:将s1转化成gbk的bytes类型 #Unicode ---> 非Unicode
# s1 = '中国'
# b1 = s1.encode('gbk') # 编码
# print(b1) # b'\xd6\xd0\xb9\xfa' <class 'bytes'> gbk 中文:2字节
# 英文:
# eg:将s1转换成utf-8的bytes类型 #Unicode ---> 非Unicode
# s1 = "abc"
# b1 = s1.encode('utf-8') # 编码
# print(b1,type(b1)) # b'abc'
# eg:将s1转化成gbk的bytes类型 #Unicode ---> 非Unicode
# s1 = "abc"
# b1 = s1.encode('gbk') # 编码
# print(b1) #b'abc' #bytes的英文表现形式就是英文,前面来个b
# bytes---->str
# eg:将utf-8的bytes类型转换成str
# b1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
# s2 = b1.decode('utf-8') # 解码
# print(s2) #中国
# 编码集之间的bytes进行转化时,注意:1.用哪个编码集编就用哪个编码集解;2.2者之间的桥梁是Unicode(eg:str)
# 3.要先用原编码集对其解码,再用要求的编码集进行编码
# gbk <---> uft-8
# gbk的bytes类型 ---> utf-8的bytes类型
b1 = b'\xd6\xd0\xb9\xfa' #最初是byts类型
s = b1.decode('gbk') #解码 #桥梁是Unicode(eg:str)
# print(s)
b2 = s.encode('utf-8') #编码
print(b2) # b'\xe4\xb8\xad\xe5\x9b\xbd' #最终也是byts类型
或:
b1 = b'\xd6\xd0\xb9\xfa'
b_utf-8 = b1.decode("gbk").encode("utf-8")
print(b_utf-8)
# utf-8 --> gbk
# utf-8的bytes类型 ---> gbk的bytes类型
b1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
b_gbk = b1.decode('utf-8').encode('gbk') #先用utf-8解码(因为一开始是utf-8的bytes类型),再用gbk对其(Unicode的str)编码
3. 重点内容
- 数据类型的补充: list(sort,revrse,列表的相加,乘,循环问题),dict (update 循环问题) ***
- 编码的进阶:
- bytes为什么存在?
- str --->bytes(Unicode ---> 非Unicode)
- gbk <-----> utf-8