zoukankan      html  css  js  c++  java
  • python基础(8):基本数据类型三(dict)、is和==、编码和解码

    1. 字典

    1.1 字典的介绍

    字典(dict)是python中唯一的一个映射数据类型,它是以{}括起来的键值对组成。在dict中key是唯一的,在保存的时候,根据key来计算出一个内存地址,然后将key-value保存在这个地址中,这种算法被称为hash算法。所以,切记,在dict中存储的key-value中的key必须是可hash的。如果你搞不懂什么是可哈希,暂时可以这样记,可以改变的都是不可哈希的,那么可哈希就意味着不可变,这个是为了能准确的计算内存地址⽽规定的。

    已知的可哈希(不可变)的数据类型: int,str,tuple,bool 不可哈希(可变)的数据类型: list,dict,set

    语法 :

    {key1: value1, key2: value2....}

    注意: key必须是不可变(可哈希)的,value没有要求,可以保存任意类型的数据。

    # 合法
    dic = {123: 456, True: 999, "id": 1, "name": 'sylar', "age": 18, "stu": ['', '美⼥'], (1, 2, 3): '麻花藤'}
    print(dic[123])
    print(dic[True])
    print(dic['id'])
    print(dic['stu'])
    print(dic[(1, 2, 3)])
    # 不合法
    # dic = {[1, 2, 3]: '周杰伦'} # list是可变的. 不能作为key
    # dic = {{1: 2}: "哈哈哈"} # dict是可变的. 不能作为key
    dic = {{1, 2, 3}: '呵呵呵'} # set是可变的, 不能作为key

    dict保存的数据不是按照我们添加进去的顺序保存的,是按照hash表的顺序保存的,⽽hash表不是连续的,所以不能进⾏切片⼯作,它只能通过key来获取dict中的数据。

    1.2 字典的增删改查和其他相关操作

    1.2.1 增加

    dic = {}
    dic['name'] = '周润发' # 如果dict中没有出现这个key, 就会新增⼀个key-value的组合进dict
    dic['age'] = 18
    print(dic)
    

    # 如果dict中没有出现过这个key-value. 可以通过setdefault设置默认值 dic.setdefault('李嘉诚') # 也可以往⾥⾯设置值. dic.setdefault("李嘉诚", "房地产") # 如果dict中已经存在了. 那么setdefault将不会 起作⽤

    print(dic)

    1.2.2 删除

    ret = dic.pop("jay") #通过key删除,返回被删除的value
    print(ret)

    del dic["jay"] print(dic)
    # 随机删除. ret = dic.popitem()

    # 清空字典中的所有内容 dic.clear()

    1.2.3 修改

    dic = {"id": 123, "name": 'sylar', "age": 18}
    dic1 = {"id": 456, "name": "麻花藤", "ok": "wtf"}
    dic.update(dic1) # 把dic1中的内容更新到dic中. 如果key重名. 则修改替换. 如果不存在key, 则新增.
    print(dic)
    print(dic1)

    1.2.4 查询

    查询⼀般⽤key来查找具体的数据.

    print(dic['name'])
    # print(dic['sylar']) # 报错
    print(dic.get("ok"))
    print(dic.get("sylar")) # None
    print(dic.get("sylar", "⽜B")) # ⽜B

    1.2.5 其他相关操作

    dic = {"id": 123, "name": 'sylar', "age": 18, "ok": "科⽐"}
    
    print(dic.keys()) # dict_keys(['id', 'name', 'age', 'ok']) 不⽤管它是什么.当成list来⽤就⾏ for key in dic.keys():    print(key)
    print(dic.values()) # dict_values([123, 'sylar', 18, '科⽐']) ⼀样. 也当 list来⽤ for value in dic.values():    print(value)
    print(dic.items()) # dict_items([('id', 123), ('name', 'sylar'), ('age',18), ('ok', '科⽐')]) 这个东⻄也是list. 只不过list中装的是tuple for key, value in dic.items(): # ?? 这个是解构    print(key, value)
    # 解构 a, b = 1, 2 print(a, b)
    (c, d)
    = 3, 4 print(c, d)
    e, f
    = [1, 2, 3] # 解构的时候注意数量必须匹配 print(e, f)

    1.3 字典的嵌套

    # 字典的嵌套
    dic1 = {
       "name": "汪峰",
       "age": 18,
       "wife": {
       "name": '章⼦怡',
       "age": 28
       },
       "children": ['第⼀个⽑孩⼦', '第⼆个⽑孩⼦'],
       "desc": '峰哥不会告我吧. 没关系. 我想上头条的'
    }
    print(dic1.get("wife").get("name"))
    print(dic1.get("children"))
    print(dic1.get("children")[1])

    2. is和==

    2.1 ==的作用

    a = 'alex'
    b = 'alex'
    print(a == b)  # True
    
    n = 10
    n1 = 10
    print(n == n1) # True

    li1 = [1,2,3]
    li2 = [1,2,3]
    print(li1 == li2) True

    从测试来看:

    == 比较的是值

    2.2 is的作用

    id():获得内存地址

    a = 'alex'
    print(id(a))   # 36942544  内存地址
    
    n = 10
    print(id(n))     #1408197120
    
    li = [1,2,3]
    print(id(li))      #38922760
    
    #字符串
    a = 'alex'
    b = 'alex'
    print(a is b)  #True
    #数字
    n = 10
    n1 = 10
    print(n is n1)   #True
    
    #列表
    li =[1,2,3]
    li2 =[1,2,3]
    print(li is li2)  #False
    #元组
    tu =(1,2,3)
    tu1 =(1,2,3)
    print(tu is tu1)   # False
    #字典
    dic1 = {'name':'alex'}
    dic = {'name':'alex'}
    print(dic1 is dic)    #False

    从测试来看:

    is 比较的是内存地址

    2.3 特殊情况-小数据池

    2.3.1 数字小数据池的范围 -5 ~ 256

    n = -6
    n1 = -6
    print(n is n1)  #False
    
    n = -5
    n1 = -5
    print(n is n1)    #True
    
    n = 257
    n1 = 257  # 在pycharm中会显示true,在终端中是false,因为pycharm会做出它认为是优化的方案,但是却打破了python的功能
    print(n is n1)     #True

    2.3.2 字符串中如果有特殊字符他们的内存地址就不一样

    a = 'alex@'a1 = 'alex@'print(a is a1)    # Fales

    2.3.3 字符串中单个*20以内他们的内存地址一样,单个*21以上内存地址不一致

    a = 'a'*21b = 'a'*21print(a is b)    #False
    
    a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'b = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'print(a is b)    #True

    3. 编码和解码

    3.1 几种编码

    ASCII码:

    不支持中文

    支持英文、数字、符号

    8位 一个字节

    GBK码 国标:

    支持 中文,英文,数字,符号

    英文 16位 二个字节

    中文 16位 二个字节

    UNICODE万国码:

    支持 中文,英文,数字,符号

    英文 32 位 四个字节

    中文 32位 四个字节

    UTF-8:

    长度可变的万国码 最少用8位

    英文 8位 一个字节
    中文 24位 三个字节

    3.2 编码和解码操作

    encode(编码方式) ---- 拿到明文编码后对应的字节

    decode(编码方式) -----将编码后的字节解码成对应的明文

    s = 'alex'print(s.encode('utf-8'))    # 编码 encode('utf-8') utf-8 是指定要编码成什么样的编码类型print(s1.decode('utf-8'))   # 
    
    s = '饿了's1 = s.encode('gbk')      #b'饿了吗'    #b'xe9xa5xbfxe4xbax86xe5x90x97'print(s.encode('gbk'))                 #b'xb6xf6xc1xcbxc2xf0'print(s1)print(s1.decode('utf-8'))

    注意: 用什么进行编码就要什么进行解码  不然后会懵逼!

  • 相关阅读:
    关于32位操作系统和64位操作系统对InstallShield打包的影响
    NEWS: Symantec宣布Wise Package Studio将终止
    InstallShield 2012新功能试用(2) 调用MsiGetProperty等MSI API发生变化
    Basic INFO 在命令行Build InstallShield安装包工程获得压缩安装包
    NEWS InstallShield 2012 Service Pack 1发布
    Basic INFO InstallShield Basic MSI工程中如何在SetupCompleteSuccess界面中启动Readme
    Basic INFO InstallShield的脚本编辑器中如何显示代码行号
    Basic INFO 关于在InstallShield制作的安装包界面中删除InstallShield文字的厂商回复
    Basic INFO InstallShield工程中如何让产品的快捷方式名称始终与产品名保持一致
    Basic INFO: 创建隐藏文件夹
  • 原文地址:https://www.cnblogs.com/liuhui0308/p/11805216.html
Copyright © 2011-2022 走看看