ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【读书笔记】 《流畅的python》3.1-3.4 读书笔记

2021-09-08 10:58:03  阅读:157  来源: 互联网

标签:__ str 映射 读书笔记 python default 3.4 dict key


《流畅的python》3.1-3.4 读书笔记

一、泛映射类型(3.1)
collections.abc 模块中有 Mapping 和 MutableMapping 这两个抽象基类,它们的作 用是为 dict 和其他类似的类型定义形式接口(在 Python 2.6 到 Python 3.2 的版本中,这些 类还不属于 collections.abc 模块,而是隶属于 collections 模块)。
非抽象映射类型一般不会直接继承这些抽象基类,它们会直接对 dict 或是 collections.User.Dict 进行扩展。这些抽象基类的主要作用是作为形式化的文档,它 们定义了构建一个映射类型所需要的最基本的接口。然后它们还可以跟 isinstance 一起 被用来判定某个数据是不是广义上的映射类型:

my_dict = {} 
print(isinstance(my_dict, abc.Mapping))

输出 True
这里用 isinstance 而不是 type 来检查某个参数是否为 dict 类型,因为这个参数有可 能不是 dict,而是一个比较另类的映射类型。 标准库里的所有映射类型都是利用 dict 来实现的,因此它们有个共同的限制,即只有可 散列的数据类型才能用作这些映射里的键(只有键有这个要求,值并不需要是可散列的 数据类型)。
什么是可散列的数据类型
如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变 的,而且这个对象需要实现 hash() 方法。另外可散列对象还要有 qe() 方法,这样才能跟其他键做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的……
原子不可变数据类型(str、bytes 和数值类型)都是可散列类型,frozenset 也是 可散列的,因为根据其定义,frozenset 里只能容纳可散列类型。元组的话,只有 当一个元组包含的所有元素都是可散列类型的情况下,它才是可散列的。

	tt = (1, 2, (30, 40)) 
	hash(tt) 8027212646858338501 
	tl = (1, 2, [30, 40]) 
	hash(tl) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' 
	tf = (1, 2, frozenset([30, 40]))
	hash(tf) -4118419923444501110

一般来讲用户自定义的类型的对象都是可散列的,散列值就是它们的 id() 函数的返 回值,所以所有这些对象在比较的时候都是不相等的。如果一个对象实现了 eq 方法,并且在方法中用到了这个对象的内部状态的话,那么只有当所有这些内部状态 都是不可变的情况下,这个对象才是可散列的。
二、字典推导(3.2)
字典推导(dictcomp)可以从任何以键值对作为元素的可 迭代对象中构建出字典。

 DIAL_CODES = [ (86, 'China'),   # 一个承载成对数据的列表,它可以直接用在字典的构造方法中。
               (91, 'India'),
               (1, 'United States'),
               (62, 'Indonesia'),
               (55, 'Brazil'),
               (92, 'Pakistan'),
               (880, 'Bangladesh'),
               (234, 'Nigeria'),
               (7, 'Russia'),
               (81, 'Japan')
               ]
country_code = {country: code for code, country in DIAL_CODES}  # 这里把配好对的数据左右换了下,国家名是键,区域码是值。
print(country_code)
print({code: country.upper() for country, code in country_code.items()
if code < 66})   # 跟上面相反,用区域码作为键,国家名称转换为大写,并且过滤掉区域码大于或等于 66 的地区。

输出

{'China': 86, 'India': 91, 'United States': 1, 'Indonesia': 62, 'Brazil': 55, 'Pakistan': 92, 'Bangladesh': 880, 'Nigeria': 234, 'Russia': 7, 'Japan': 81}
{1: 'UNITED STATES', 62: 'INDONESIA', 55: 'BRAZIL', 7: 'RUSSIA'}

三、常见的映射方法(3.3)
dict、defaultdict 和 OrderedDict 的常见方法,后面两个数据类型是 dict 的变种,位于 collections 模块内。

dictdefaultdictOrderedDict
d.clear()移除所有元素
d.contains(k)检查 k 是否在 d 中
d.copy()浅复制
d.copy()用于支持 copy.copy
d.default_factorymissing 函数中被调用的函数,用以给未找到的 元素设置值

标签:__,str,映射,读书笔记,python,default,3.4,dict,key
来源: https://blog.csdn.net/TengTesting/article/details/120172925

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有