基础数据类型的补充,编码的进阶,基础数据类型之间的转换

1 内容总览

  1. 基础数据类型的补充
  2. 数据类型之间的转换 - 其他数据类型转成bool值为False的情况
  3. 编码的进阶

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 报错-不是可迭代对象
  • 编码的进阶

    1. 不同的密码本之间能否互相识别?不能。-桥梁是Unicode编码集(见utf-8的byte类型-->gbk的bytes类型,中间的str在内存中的编码方式就是Unicode)
    2. 规定: 数据在内存中全部是以Unicode编码的,但是当你的数据用于网络传输或者存储到硬盘中,必须是以非Unicode进行编码(utf-8,gbk等等),故那7种数据类型要想传输和存储必须转换成bytes类型。
    3. 注: Unicode--> 非Unicode时,只能str和bytes进行转换,其他6种数据类型要想转换,必须先转换成str,再转换成bytes
    4. str <---> bytes时: 用哪个编码集编码就要用哪个编码集(4种密码本)解码
    5. utf-8的byte类型-->gbk的bytes类型,要先用utf-8(用谁编的就用谁解)对前者进行解码(decode),解完码后再对其(str)用gbk进行编码(encode)
    6. bytes的英文,就是英文,前面来个b; eg: b'hello'
    7. bytes的中文是很多你不认识的字节; eg: b'\xe4\xb8\xad\xe5\x9b\xbd'
    8. python3x 内存用的是 utf-8; python2x内存用的是 ASCII
    9. 不管咋转-凡是见到不认识的(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

转载于:https://www.cnblogs.com/wanshizidiao/p/11009667.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值