• python基础数据类型补充以及编码的进阶


    基础数据类型补充内容

    字符串

    s = "everyone's the hero in their own story"
    
    # print(s.capitalize())                          # 句子首单词的首字母变大写,其余小写  Everyone's the hero in their own story
    # print(s.swapcase())                            # 全部变大写                EVERYONE'S THE HERO IN THEIR OWN STORY
    # print(s.title())                               # 每个单词的首字母变大写    Everyone'S The Hero In Their Own Story
    # print(len(s))                                  # 38
    # print(s.center(39, "*"))                       # 内同居中,总长度,空白处填充  *everyone's the hero in their own story
    # print(s.center(45, "*"))                       #                         ****everyone's the hero in their own story***
    # print(s.center(48, "*"))                       #                         *****everyone's the hero in their own story*****
    
    # 寻找字符串中的元素是否存在
    # print(s.find("hs"))                              # 通过元素找索引,返回的找到的第一个元素的索引,如果找不到返回-1      -1
    # print(s.find("ev"))                              # 0
    # print(s.find("ev", 9, 18))                       # -1
    # print(s.find("th", 11, 20))                      # 11
    
    # print(s.index("hs"))                             # 通过元素找索引,返回的找到的第一个元素的索引,找不到报错。     报错
    # print(s.index("ev"))                             # 0
    # print(s.index("ev", 9, 18))                      # 报错
    # print(s.index("th", 11, 20))                       # 11

    元组

    python中元组有一个特性,元组中如果只含有一个元素且没有逗号,则该元组不是元组,与该元素的数据类型一致,如果有逗号,那么它是元组。

    # tu1 = (1)
    # print(tu1, type(tu1))                    # 1    <class 'int'>
    # tu2 = ("alex")
    # print(tu2, type(tu2))                    # alex     <class 'str'>
    # tu3 = ([1, 2, 3])
    # print(tu3, type(tu3))                   # [1, 2, 3]     <class 'list'>
    
    # tu1 = (1,)
    # print(tu1, type(tu1))                    # (1,)      <class 'tuple'>
    # tu2 = ("alex",)
    # print(tu2, type(tu2))                    # ('alex',)      <class 'tuple'>
    # tu3 = ([1, 2, 3],)
    # print(tu3, type(tu3))                   # ([1, 2, 3],)     <class 'tuple'>

    index:通过元素找索引(可切片),找到第一个元素就返回,找不到该元素即报错。

    tup = (1, 2, "alex", "你好", True, [1, 2, 3,])
    # print(tup.index(1))                          #  0
    # print(tup.index("alex"))                     #  2
    # print(tup.index(True))                       # 0
    # print(tup.index([1, 2, 3,]))                 # 5

    count: 获取某元素在列表中出现的次数

    # print(tup.count(1))                           #   2

    列表

    li = ["b", "a", "r", "r", "y"]
    # print(li.count("r"))                        #   2
    # print(li.index("a"))                          #   1
    # print(li.index("r"))                          #   2
    # li.sort()                                   # 默认从小到大
    li.sort(reverse = True)                       # 从大到小
    # print(li)                                   #  ['a', 'b', 'r', 'r', 'y']
    # li.reverse()
    # print(li)                                     #  ['y', 'r', 'r', 'a', 'b']

    列表的相加和相乘整数

    l1 = [1, 2, 3]
    l2 = [2, 4, "tough", 6]
    # print(l1 + l2)                                #   [1, 2, 3, 2, 4, 'tough', 6]
    # print(l1 * 3)                               #   [1, 2, 3, 1, 2, 3, 1, 2, 3]

    循环列表,改变列表大小的问题

    l3 = [11, 22, 33, 44, 55]
    需求: 请把索引为奇数对应的元素删除(不能一个一个删除,此l1只是举个例子,里面的元素不定)。

    # 正常思路做法
    # for index, item in enumerate(l3):
    #     print(index, item)
    #     print(l3[index])
    #     if index % 2 != 0:
    #          l3.remove(l3[index])
    # print(l3)                             # [11, 33, 44]
    
    # for index in range(len(l3)):
    #     if index % 2 == 1:
    #         l3.pop(index)
    # print(l3)                             #  [11, 33, 44]
    
    # method1   直接删除
    # del l3[1::2]
    # print(l3)                            # [11, 33, 55]
    
    # method 2     倒序删除
    # print(len(l3))                        #    5
    # for index in range(len(l3) - 1, -1, -1):
    #     # print(index)                               # 4   3  2  1
    #     if index % 2 != 0:
    #         l3.pop(index)
    # print(l3)                                    # [11, 33, 55]
    
    
    # method 3    思维置换
    # new_list = []
    # for index, item in enumerate(l3):
    #     if index % 2 == 0:
    #         new_list.append(l3[index])
    # print(new_list)                      #  [11, 33, 55]
    # l3 = new_list
    # print(l3)
    
    # new_list = []
    # for index in range(len(l3)):
    #     if index % 2 == 0:
    #         new_list.append(l3[index])
    # print(new_list)                      #  [11, 33, 55]
    # l3 = new_list
    # print(l3)

    总结:循环一个列表时,最好不要改变列表的大小,因为他会影响你的最终结果

    dict

    fromkeys:创建一个字典:字典的所有键来自一个可迭代对象,字典的值使用同一个值

    # dic = dict.fromkeys("abc", 100)
    # print(dic)                             # {'a': 100, 'b': 100, 'c': 100}
    
    # dic = dict.fromkeys([1, 2, 3], "hello")
    # print(dic)                                 #  {1: 'hello', 2: 'hello', 3: 'hello'}
    
    # 坑: 值共享一个
    # dic = dict.fromkeys([1, 2, 3], [])
    # print(dic)                                    #    {1: [], 2: [], 3: []}
    # dic[1].append(666)
    # print(dic)                                    #  {1: [666], 2: [666], 3: [666]}
    # print(id(dic[1]),id(dic[2]),id(dic[3]))       #  2905006740296     2905006740296    2905006740296
    # popitem 3.5版本之前,popitem为随机删除,  3.6之后为删除最后一个,有返回值
    dic = {"name": "李海", "age": 19}
    # res = dic.popitem()
    # print(dic, res)                                 #  {'name': '李海'}         ('age', 19)
    
    # update
    # dic.update(gender = "male", weight = 65)         # {'name': '李海', 'age': 19, 'gender': 'male', 'weight': 65}
    # print(dic)
    # dic.update((("height", 180), ("hobby", "football"), ("address", "CDC")))
    # print(dic)                                          #  {'name': '李海', 'age': 19, 'height': 180, 'hobby': 'football', 'address': 'CDC'}
    
    # dic.update([("height", 180), ("hobby", "football"), ("address", "CDC")])
    # print(dic)                                         #  {'name': '李海', 'age': 19, 'height': 180, 'hobby': 'football', 'address': 'CDC'}
    
    # 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)                                         #  {'name': 'alex', 'weight': 75}

    循环字典,改变字典大小的问题

    dic3 = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18}
    需求: 请将字典中所有键带k元素的键值对删除

    # for i in dic3:
    #     # print(i)                                     #  k1   k2   k3  age
    #     if "k" in i:
    #         del dic3[i]
    # print(dic3)                             #  报错 RuntimeError: dictionary changed size during iteration
    
    # method 1
    # li = []
    # # for key in dic3.keys():
    # for key in dic3:
    #     if "k" in key:
    #         li.append(key)
    # # print(li)                      #  ['k1', 'k2', 'k3']
    # for item in li:
    #     # dic3.pop(item)
    #     del dic3[item]
    # print(dic3)
    
    # method 2
    for key in list(dic3.keys()):
        if "k" in key:
            dic3.pop(key)
    print(dic3)

    总结: 在循环一个字典的过程中,不要改变字典的大小(增,删字典的元素),这样会直接报错。

    数据类型间的转换问题

    现在学过的数据类型有:intboolstrlisttupledictset

    int、bool 、str 三者转换

    # int ---> bool
    i = 100
    print(bool(i))  # True  # 非零即True
    i1 = 0
    print(bool(i1))  # False 零即False
    
    # bool ---> int
    t = True
    print(int(t))  # 1  True --> 1
    t = False
    print(int(t))  # 0  False --> 0
    
    # int ---> str
    i1 = 100
    print(str(i1))  # '100'
    
    # str ---> int  # 全部由数字组成的字符串才可以转化成数字
    s1 = '90'
    print(int(s1))  # 90
    
    # str ---> bool
    s1 = '太白'
    s2 = ''
    print(bool(s1))  # True 非空即True
    print(bool(s2))  # False
    # bool ---> str
    t1 = True
    print(str(True))  # 'True'

    str、list 转换

    # str ---> list
    s = "alex is gay"
    print(s.split())                      # ['alex', 'is', 'gay']
    
    # list ---> str  # 前提 list 里面所有的元素必须是字符串类型才可以
    li = ['alex', 'is', 'gay']
    print(" ".join(li))                   #  "alex is gay"

    list、set 转换

    # list ---> set
    s1 = [1, 2, 3]
    print(set(s1))                       #  {1, 2, 3}
    
    # set ---> list
    set1 = {1, 2, 3, 3,}
    print(list(set1))                    # [1, 2, 3]

    str、bytes 两者转换

    # str ---> bytes
    s1 = '太白'
    print(s1.encode("utf-8"))           #  b'xe5xa4xaaxe7x99xbd'
    
    # bytes ---> str
    n = b'xe5xa4xaaxe7x99xbd'
    print(n.decode("utf-8"))            # '太白'

    所有数据都可以转化成bool值

    转化成bool值为False的数据类型有:
    '', 0, (), {}, [], set(), None

    基础数据类型的总结

    按存储空间的占用分(从低到高)

    数字
    字符串
    集合:无序,即无序存索引相关信息
    元组:有序,需要存索引相关信息,不可变
    列表:有序,需要存索引相关信息,可变,需要处理数据的增删改
    字典:有序,需要存key与value映射的相关信息,可变,需要处理数据的增删改(3.6之后有序)
    

    按存值个数区分

    标量/原子类型 数字,字符串
    容器类型 列表,元组,字典

    按可变不可变区分

    可变 列表,字典
    不可变 数字,字符串,元组,布尔值

    按访问顺序区分

    直接访问 数字
    顺序访问(序列类型) 字符串,列表,元组
    key值访问(映射类型) 字典

     编码的进阶

     编码就好比密码本,它记录的是二进制与文字之间的对应关系,现存的编码本有:

    ASCII码:包含英文字母,数字,特殊字符与01010101对应关系。

      a  01000001  一个字符一个字节表示。

    GBK:只包含本国文字(以及英文字母,数字,特殊字符)与0101010对应关系。

      a  01000001  ascii码中的字符:一个字符一个字节表示。

      中 01001001 01000010  中文:一个字符两个字节表示。

     Unicode包含全世界所有的文字与二进制0101001的对应关系。

      a  01000001 01000010 01000011 00000001        

      b  01000001 01000010 01100011 00000001        

      中 01001001 01000010 01100011 00000001

    UTF-8:包含全世界所有的文字与二进制0101001的对应关系(最少用8位一个字节表示一个字符)。

         a   01000001  ascii码中的字符:一个字符一个字节表示。

      To 01000001 01000010   (欧洲文字:葡萄牙,西班牙等)一个字符两个字节表示。

      中  01001001 01000010 01100011  亚洲文字;一个字符三个字节表示。

     1. 在计算机内存中,str统一使用Unicode编码,当需要将数据保存到硬盘或者需要网络传输的时候,就转换为非Unicode编码比如:UTF-8编码。

     英文:

      str:"hello"

      内存中的编码方式:Unicode

      表现形式:"hello"

      bytes:

      内存中的编码方式:非Unicode

      表现形式:b"hello"

    中文:

      str:"中国"

      内存中的编码方式:Unicode

      表现形式:"中国"

      bytes:

      内存中的编码方式:非Unicode

      表现形式:b'xe4xb8xadxe5x9bxbd'

      

     2. 不同编码之间,不能直接互相识别。

      比如你的一个数据:‘老铁没毛病’是以utf-8的编码方式编码并发送给一个朋友,那么你发送的肯定是通过utf-8的编码转化成的二进制01010101,那么你的朋友接收到你发的这个数据,他如果想查看这个数据必须将01010101转化成汉字,才可以查看,那么此时那也必须通过utf-8编码反转回去,如果要是通过gbk编码反转,那么这个内容可能会出现乱码或者报错。

     

     bytes也是Python基础数据类型之一,bytes类型可以用的操作方法与str相差无几

    bytes类型也称作字节文本,他的主要用途就是网络的数据传输,与数据存储

    如果你只用bytes开发,不方便。因为对于非ascii码里面的文字来说,bytes只是显示的是16进制。很不方便。

    s = "中国"
    # print(s, type(s))             #  中国     <class 'str'>
    #
    # bytes
    # b1 = b"中国"
    # print(b1, type(b1))                    # 报错   SyntaxError: bytes can only contain ASCII literal characters.
    # b = s.encode("utf-8")
    # print(b, type(b))                  #  b'xe4xb8xadxe5x9bxbd'            <class 'bytes'>
    
    
    # b2 = b"chance"
    # print(b2.upper())                       # b'CHANCE'
    # print(b2, type(b2))                   #  b'chance' <class 'bytes'>

    str ----> bytes

    # encode称作编码:将 str 转化成 bytes类型
    s1 = '中国'
    b1 = s1.encode("utf-8")
    print(b1, type(b1))                # b'xe4xb8xadxe5x9bxbd'        <class 'bytes'>
    
    b2 = s1.encode("gbk")
    print(b2, type(b2))               #  b'xd6xd0xb9xfa'          <class 'bytes'>

    bytes ---> str

    # decode 解码
    b3 = b'xe4xb8xadxe5x9bxbd'
    s2 = b3.decode("utf-8")
    print(s2, type(s2))                # 中国      <class 'str'>
    
    b4 = b'xd6xd0xb9xfa'
    s3 = b4.decode("gbk")
    print(s3, type(s3))                # 中国      <class 'str'>

    gbk ---> utf-8

    b5 = b'xd6xd0xb9xfa'
    s4 = b5.decode("gbk")
    # print(s)
    b6 = s4.encode("utf-8")
    print(b6, type(b6))

     

     

  • 相关阅读:
    freeswitch录音功能
    jdk安装
    maven阿里云镜像
    idea安装
    idea新建maven项目
    tomcat安装
    idea新建maven web项目
    idea新建java项目
    webpack使用
    ACE 安装指南及示例
  • 原文地址:https://www.cnblogs.com/zcj-272/p/13401407.html
Copyright © 2020-2023  润新知