zoukankan      html  css  js  c++  java
  • Day 07 数据类型补充:编码的进阶

    01今日内容大纲

    1. 基础数据类型的补充
    2. 数据类型之间的转换
    3. 编码的进阶

    02 昨日内容回顾以及作业讲解

    1. id is ==

      • ==:数值是否相同
      • is:内存地址是否相同
      • id:获取对象的内存地址
    2. 代码块:一个文件,交互式命令一行就是一个代码块

    3. 同一代码块下的缓存机制(字符串驻留机制):

      • 一个文件当中,遇到初始化命令,现在字典中查询数据,如果数据存在便不再创建,如果不存在则创建对应数据。

      • 对象:所有数字,bool ,几乎所有的字符串

      • 目的:提升性能,节省内存

    4. 不同代码块下的缓存机制(小数据池):在内存中,开辟两个空间,一个空间存储-5~256的int,一个空间存储一定规则的字符串,如果你的代码遇到满足条件的数据,则直接引用提前创建的。

      • -5~256 int,bool,满足一顶规则的字符串。
      • 优点:提升性能,节省内存空间
    5. 集合:列表去重,关系测试,交并差

    6. 深浅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 亚洲文字:一个字符三个字节表示

    1. 不同密码本之间能否互相识别?不能。
    2. 数据在内存中全部是以Unicode编码的,但你的数据用于网络传输或硬盘存储时,必须是以非Unicode编码(utf-8,gbk等等)。

    英文:

    ​ str:'hello'

    ​ 内存中的编码方式:Unicode

    ​ 表现形式:'hello'

    ​ bytes:

    ​ 内存中的编码方式:非Unicode

    ​ 表现形式:b'hello'

    中文:

    ​ str:

    ​ 内存中的编码方式:Unicode

    ​ 表现形式:'中国'

    ​ bytes:

    ​ 内存中的编码方式:非Unicode #Utf-8

    ​ 表现方式:b'xe4xb8xadxe5x9bxbd'

    # str ----> bytes
    s1 = '中国'
    b1 = s1.encode('utf-8')  #编码
    print(b1,type(b1))   #b'xe4xb8xadxe5x9bxbd' <class 'bytes'>
    b1 = s1.encode('gbk')
    print(b1,type(b1)) #b'xd6xd0xb9xfa' <class 'bytes'>
    
    # bytes ----> str
    b1 = b'xe4xb8xadxe5x9bxbd'
    s1 = b1.decode('utf-8')
    print(s1,type(s1))
    
    #gbk ---->utf-8
    b1 =  b'xd6xd0xb9xfa'
    s1 =  b1.decode('gbk')
    print(s1)
    b2 = s1.encode('utf-8')
    print(b2)      # b'xe4xb8xadxe5x9bxbd'
    

    04 今日总结

    • 数据类型的补充:列表list(sort,reverse,相加,相乘,循环问题),字典dict(update,循环问题)***
    • 编码的进阶:
      • bytes为什存在?
      • str---->bytes(Unicode---->非Unicode)
      • gbk<--------->utf-8

    05 预习内容

  • 相关阅读:
    【BZOJ1089】[SCOI2003]严格n元树(高精度,动态规划)
    【BZOJ1083】[SCOI2005]繁忙的都市(最小生成树)
    【BZOJ1082】[SCOI2005]栅栏(搜索)
    【BZOJ1081】[SCOI2005]超级格雷码(搜索)
    【BZOJ1078】[SCOI2008]斜堆(性质题)
    【BZOJ1077】天平(差分约束)
    【BZOJ1071】[SCOI2007]组队(神仙题)
    【BZOJ1862】[ZJOI2006]游戏排名系统 (Splay)
    【BZOJ1056】[HAOI2008]排名系统(Splay)
    【BZOJ1055】[HAOI2008]玩具取名(动态规划)
  • 原文地址:https://www.cnblogs.com/Redbean1231/p/13258022.html
Copyright © 2011-2022 走看看