fluent Python 读书笔记(五)

今天写对于 这本书第三章的回顾

1.可散列的数据类型

原子不可变数据类型(数值,str)都是可散列的

元组只有它所有元素是可散列的它才是散列的

什么叫可散列的数据类型?

1.要能实现hash方法,且每次Hash出来的值是一样的

2.要能实现eq方法,a==b为true 时散列值也想等


2.创建字典有很多种方法

介绍几种不常见的

a = dict(one = 1)
b = dict(zip(['one'],[1]))
c = dict({'one':1})
d = dict([('one',1)])


3.字典推导式

a = {b:c for b,c in L}


4.多种不同的映射方法

这里尝试实验一下字典的update方法

d = {'one':3,'two':4}
d.update(zip(['one', 'two'], [1, 2]))
print(d)

结果确实改变了


用setdefault 处理找不到的键可极大的简化代码

稍微解释一下代码

occurreces = index.get(word, [])

从index这个字典里找一个单词,找不到返回空列表

occurences.append(location)

在occurences 中加入我们现在找到的坐标

index[word] = occurences

重新赋值


用setdefault就会非常方便

index.setdefault(word,[]).append(location)

先尝试获取word在index里的值,不存在就会自动建立一个空列表对应这个word,并返回那个空列表的引用。

所以我们就可以直接append了,

无论word存不存在


这个setdefault是返回这个我们设定的默认值的引用

但defaultdict不同,它会在你执行dd['new-key'] = default value

dd = defaultdict(list)
print(dd['one'])

'one'是dd里没有的键,这样的结果会是一个空列表

defaultdict的这种功能是通过default_factory实现的


同时不能忽略__missing__

它会在你字典找不到对应值的时候调用

记住,missing 只会被getitem调用


接下来我们来实现一个在查询时既接受数字查询又接受字符串查询的字典

class StrKeyDict1(dict):
    def __missing__(self, key):
        if isinstance(key, str):
            raise KeyError(key)
        return self[str(key)]

    def get(self, key, default=None):
        try:
            return self[key]
        except KeyError:
            return default

    def __contains__(self, key):
        return key in self.keys() or str(key) in self.keys()

raise KeyError就是像递归停止条件一样,必须要有,否则回陷入无限递归!

key in dict 会调用__contains__,若这样写同样陷入无限递归

key in dict.keys()不会调用__contains__

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值