zoukankan      html  css  js  c++  java
  • Python标准库映射类型与可散列数据类型的关系

     映射类型:

      Python>3.2中,collections.abc模块有Mapping和MutableMapping两个抽象基类(Python2.6~3.2隶属于collections模块),作用是为dict和其他类似类型定义形式接口。

      它们构建一个映射类型所需的最基本接口,可以跟instance一起被用来判断某个数据是不是广义上的映射类型:

    from collections import abc
    
    my_dict = {}
    print(isinstance(my_dict, abc.Mapping))  # True

      判断类型不是只有type。


      可散列数据类型:

    """
        可散列的数据类型:
            如果一个对象是可散列的,在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现__hash__()方法,__qe__()方法.
            如果两个可散列对象是相等的,那么它们的散列值一定是一样的.
    """
    
    tt = (1, 2, (30, 40))
    print(hash(tt))  # 8027212646858338501
    
    t1 = (1, 2, [30, 40])  # 元组只有当一个元组包含所有元素都是可散列类型的情况下,才是可散列的。
    # print(hash(t1))
    
    tf = (1, 2, frozenset([30, 40]))
    print(hash(tf))  # -4118419923444501110
    """
        原子不可变数据类型(str、bytes和数值类型)都是可散列类型,frozenset(生成不可变集合,冻结的集合)也是可散列的,其可容纳可散列类型
        Python里所有不可变类型都是可散列的,这个说法不准确
    """
    a = dict(one=1, two=2, three=3)
    b = {'one':1, 'two':2, 'three':3}
    c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
    d = dict([('two', 2), ('one', 1), ('three', 3)])
    e = dict({'three':3, 'one':1, 'two':2})
    print(a, '
    ', b, '
    ', c, '
    ', d, '
    ', e)
    print(a ==b == c ==d == e)  # True

      映射类型与可散列数据类型关系:

      标准库里所有映射类型都是利用dict来实现的,它们有个共同限制,只有可散列的数据类型才能用作这些映射类型的键,值不需要是可散列的数据类型。

  • 相关阅读:
    正则表达式(转)
    Collections中的shuffle()方法
    Fermat定理
    哈希算法(转)
    Hungarian method (匈牙利算法)----解决指派问题(转)
    蒙塔卡洛模拟
    线程的礼让
    线程间的沟通
    安装rlwrap
    yum切到光盘源
  • 原文地址:https://www.cnblogs.com/zaixiachengxuyuan/p/14465669.html
Copyright © 2011-2022 走看看