【流畅的Python学习笔记】2023.4.29

news/2024/10/19 0:22:45/

此栏目记录我学习《流畅的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}
默认


http://www.ppmy.cn/news/58028.html

相关文章

构建OVS网络

构建OVS网络 1. 配置虚拟机环境 &#xff08;1&#xff09;配置虚拟机交换机 1 创建一个名为br-xd的虚拟交换机。 # ovs-vsctl add-br br-xd 2 查询虚拟交换机。 # ovs-vsctl show 5a1cd870-fc31-4820-a7f4-b75c19450582 Bridge br-xd Port br-xd …

OJ刷题 第十四篇(递归较多)

23204 - 进制转换 时间限制 : 1 秒 内存限制 : 128 MB 将一个10进制数x(1 < x < 100,000,000)转换成m进制数(2< m < 16) 。分别用 ABCDEF表示10以上的数字。 输入 x m (1 < x < 100,000,000, 2< m < 16) 输出 m进制数 样例 输入 31 16 输出 1F 答…

华为OD机试 - 日志首次上报最多积分(Python)

题目描述 日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。 如果上报太频繁,会对服务端造成压力; 如果上报太晚,会降低用户的体验; 如果一次上报的条数太多,会导致超时失败。 为此,项目组设计了如下的上报策略: 每成功上报一条日…

电子绘画画笔笔刷模式的学习笔记

PS画笔笔刷模式的学习笔记 笔刷基础画笔本身的性质理解画笔在计算机层面上的实现方式 图层之间关系总结 笔刷基础 本学习笔记以Photoshop为例&#xff0c;讲解电子绘画的画笔、图层的关系。 画笔本身的性质 首先&#xff0c;电子绘画中数位笔的特点是能够感知绘画时的力度&a…

( 字符串) 205. 同构字符串 ——【Leetcode每日一题】

❓205. 同构字符串 难度&#xff1a;简单 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符&#xff0c;同时不改变字符的顺序。不同…

JavaScript中的模块化编程

JavaScript是一种强大的编程语言&#xff0c;它可以在浏览器中进行客户端脚本编写&#xff0c;并且在服务器端也有广泛的应用。随着JavaScript应用的增多&#xff0c;JavaScript代码的复杂度也不断增加。为了提高代码的可维护性和重用性&#xff0c;模块化编程变得越来越重要。…

JUnit 5 使用教程 及 JUnit 4/5的差异

1. JUnit 5产生的原因 JDK 8在java中带来了迷人的功能,最值得注意的是lambda表达式 为了适应 Java 8 风格的编码和新的功能特性,JUnit 提供了JUnit 5 2. JUnit 5 架构 与 JUnit 4 相比,JUnit 5 由来自三个不同子项目的几个不同模块组成:JUnit 5 = JUnit Platform + JUni…

Java NIO(Java Non-Blocking IO:非阻塞式IO)(2)

1.NIO非阻塞网络编程原理分析 1>.NIO非阻塞网络编程相关的(Selector、SelectionKey、ServerScoketChannel和SocketChannel)关系梳理图: 说明: ①.当客户端连接时,会通过服务器端ServerSocketChannel得到/生成对应的SocketChannel; ②.通过register(Selector sel,int ops)…