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'))

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

  • 相关阅读:
    路由网址这是mvc时代系列之三:网络路由与ASP.NET MVC生命周期(上)
    调用代码JCFXBL与WebView整合打造安卓应用服务平台
    服务安装Mongodb应用实战教程:windows下安装与安全策略配置
    方法选择Android从SD卡中选择图片的三种方法及自定义系统选择框标题的方法
    图层照片如何扣头发丝
    对象方法JavaScript脚本语言初解
    数据库方法django中ModelForm学习系列一~save方法
    团队位置《楚汉传奇》聊管理
    包查找*.so对应的rpm包
    现实世界的Windows Azure:就Metanga采访MetraTech公司CEO,Scott Swartz先生
  • 原文地址:https://www.cnblogs.com/liuhui0308/p/11805216.html
Copyright © 2011-2022 走看看