此栏目记录我学习《流畅的Python》一书的学习笔记,这是一个自用笔记,所以写的比较随意,随缘更新

泛映射类型

collections.abc 模块中有 Mapping 和 MutableMapping 这两个抽象基类,它们的作用是为dict 和其他类似的类型定义形式接口

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

运行结果:
True
通过isinstance 的结果能够判断出字典是广义上的映射类型

可散列的数据类型

如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现 __hash__() 方法。另外可散列对象还要有__qe__()方法,这样才能跟其他键做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的……

多种方式创建字典

# 多种方式创建字典
a = dict(id=1, name='jack', address='A1')
b = {'id': 1, 'name': 'jack', 'address': 'A1'}
c = dict(zip(['id', 'name', 'address'], [1, 'jack', 'A1']))
d = dict([('id', 1), ('name', 'jack'), ('address', 'A1')])
e = dict({'id': 1, 'name': 'jack', 'address': 'A1'})
print(a == b == c == d == e)

运行结果:
True
原来还可以有这么多种方式创建字典

字典推导

# 字典推导
# 字典推导
info_list = [[1, 'id'], ['jack', 'name'], ['A1', 'address']]
info_dict = {x1: x2 for x1, x2 in info_list}
print(info_dict)# 按条件推导
rider_list = [(2000, 'Kuuga'), (2001, 'Agito'), (2002, 'Ryuki'),(2003, 'Faiz'), (2004, 'Blade'), (2005, "Hibiki"),(2006, 'Kabuto'), (2007, 'Den-o'), (2008, 'Kiva'),(2009, 'Decade'), (2010, 'W')]
# 取2010年之前的骑士做字典推导
rider_dict = {x1: x2 for x1, x2 in rider_list if x1<2010}
print(rider_dict)

运行结果:
{1: ‘id’, ‘jack’: ‘name’, ‘A1’: ‘address’}
{2000: ‘Kuuga’, 2001: ‘Agito’, 2002: ‘Ryuki’, 2003: ‘Faiz’, 2004: ‘Blade’, 2005: ‘Hibiki’, 2006: ‘Kabuto’, 2007: ‘Den-o’, 2008: ‘Kiva’, 2009: ‘Decade’}

用setdefault处理找不到的键

书上那个例子太复杂,看了半天才看懂,自己写了一个

test_dict = {'A': 1, 'B': 2, 'C': 3}  # 测试用字典
# 找test_dict['D'](肯定是找不到)
# 可以用 d.get(k, default) 来代替 d[k],给找不到的键一个默认的返回值
print(test_dict.get('D', 'error'))
#  但是要更新某个键对应
# 的值的时候,不管使用 __getitem__ 还是 get 都会不自然,而且效率低。
# 使用setdefault设置一个默认空值
index_list = ['A', 'B', 'C', 'D', 'E', 'F']
for item in index_list:# 如果遇到test_dict[item],且索引item不存在,则补一个默认值test_dict.setdefault(item, 'No Info')
print(test_dict)

运行结果:
{‘A’: 1, ‘B’: 2, ‘C’: 3, ‘D’: ‘No Info’, ‘E’: ‘No Info’, ‘F’: ‘No Info’}

有时候为了方便起见,就算某个键在映射里不存在,我们也希望在通过这个键读取值的时候能得到一个默认值。有两个途径能帮我们达到这个目的,一个是通过 defaultdict 这个类型而不是普通的 dict,另一个是给自己定义一个 dict 的子类,然后在子类中实现__missing__ 方法。

defaultdict:处理找不到的键的一个选择

import collections# 使用 list 作为 default_factory ,可以轻松地将一系列键值对分组到列表字典中
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = collections.defaultdict(list)
for k, v in s:d[k].append(v)print(s)
# factory_function可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0。
dd = collections.defaultdict(str)
l = ['111', 'aaa', 'ddd']
dd['111'] = '?'
for i in l:# 对应的键没给值,全都变成空字符串print(dd[i])

运行结果:
[(‘yellow’, 1), (‘blue’, 2), (‘yellow’, 3), (‘blue’, 4), (‘red’, 1)]
?

特殊方__missing__

# 继承字典类的子类
class MyDict(dict):def __missing__(self, key):self[key] = '默认'return self[key]# 测试一下
d = MyDict({'A': 1, 'B': 2, 'C': 3})
print(d)# 找不存在的索引对应的值
print(d['D'])

运行结果:
{‘A’: 1, ‘B’: 2, ‘C’: 3}
默认

【流畅的Python学习笔记】2023.4.29相关推荐

  1. 【流畅的Python学习笔记】2023.4.21

    此栏目记录我学习<流畅的Python>一书的学习笔记,这是一个自用笔记,所以写的比较随意 特殊方法(魔术方法) 不管在哪种框架下写程序,都会花费大量时间去实现那些会被框架本身调用的方法,P ...

  2. 【流畅的Python学习笔记】2023.4.22

    此栏目记录我学习<流畅的Python>一书的学习笔记,这是一个自用笔记,所以写的比较随意 元组 元组其实是对数据的记录:元组中的每个元素都存放了记录中一个字段的数据,外加这个字段的位置.简 ...

  3. 流畅的python学习笔记(三):数据结构(1)

    文章目录 概述 序列 列表推导和生成器表达式 列表推导和可读性 列表推导同filter和map的比较 笛卡尔积 生成器表达式 元组不仅仅是不可变的列表 把元组用作记录 元组拆包 嵌套元组拆包 具名元组 ...

  4. 流畅的python学习笔记

    1.1 一摞python风格的纸牌 import collections Card=collections.namedtuple('Card',['rank','suit']) class Frenc ...

  5. 流畅的python学习笔记(三):数据结构(3:文本和字节序列)

    文本和字节序列 大纲 1. 字符问题 2. 字节概要 2.1 结构体和内存视图 3. 基本的编解码器 4. 了解编解码问题 4.1 处理UnicodeEncodeError 4.2 处理Unicode ...

  6. python基础课程第12章_流畅的python学习笔记-第12章

    第12章-类继承 super函数 Py 2.x 和 Py 3.x 中有一个很大的区别就是类,无论是类的定义还是类的继承. Py 3.x 中类的继承可以直接使用 super() 关键字代替原来的 sup ...

  7. [python教程入门学习]python学习笔记(CMD执行文件并传入参数)

    本文章向大家介绍python学习笔记(CMD执行文件并传入参数),主要包括python学习笔记(CMD执行文件并传入参数)使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...

  8. Python学习笔记(十一)

    Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...

  9. python学习笔记(五)缩进

    python学习笔记(五)缩进 原作:http://www.cnblogs.com/vamei/archive/2012/05/29/2524706.html 笔记: #!/usr/bin/env p ...

最新文章

  1. [转]Android蓝牙开发浅谈
  2. Safari浏览器的智能跟踪预防工作原理
  3. boost::smart_ptr模块boost/pointer_cast.hpp 的测试
  4. 发布订阅之direct
  5. 网络知识:内网、外网、宽带、带宽、流量、网速之间的联系?
  6. jqgrid下载,引入
  7. 【Python】【Python语言】Python3.7.2的关键字与保留字
  8. 使用window自带的截图工具
  9. 转载 树莓派vnc 教程
  10. html 文章阅读次数,关于浏览次数和浏览次数缓存的问题
  11. enspar启动失败40_适合烘焙新手第一次做的芝士面包,简单易上手,好吃松软零失败...
  12. spark的安装详细步骤
  13. 关于虚拟机xp系统上不了网的问题
  14. 提取 Wallpaper Engine 的 pkg 壁纸文件,获得静态壁纸
  15. AD画芯片的原理图和封装
  16. C#调用QQ邮箱简单代码(网络摘抄笔记)
  17. markdown中数学符号和公式总结
  18. 如何减小电压跟随器输出电阻_逐次比较式模数转换器如何获取最佳采样频率
  19. 重庆封闭式计算机学校有哪些,重庆市十佳高三学校排名榜
  20. dfs根目录_分布式文件系统DFS详细解读

热门文章

  1. 参加kaggle竞赛是怎样一种体验?
  2. 专利缴费信息网上补充及管理系统--操作指南
  3. VScode中配置 C/C++ 环境,超级详细,问题分析全面,绝对好用
  4. ESP32 开发之旅③ Ticker——定时库
  5. 计算区间素数和,杨老师正在上《离散数学》课程的“数论”内容,讲授素数的知识。素数又称为质数。一个大于1的整数p是素数,当且仅当p只能被1和自身整除。很显然,2是最小的素数。他想设计一个程序
  6. 数据仓库之【用户行为数仓】12:【dws层:数据汇总层】【appc层:数据应用层】需求5:操作系统活跃用户相关指标
  7. 如何安装.iso 后缀(镜像文件)的电脑应用软件
  8. 多波束成像声呐在不同安装角下对空间的切割方式分析
  9. VB.NET实现DirectSound9 (7) 录音
  10. 高德地图、百度地图、腾讯地图坐标相互转换