effective python学习笔记_列表与字典

学习对序列做切片

实现了__getitem__类即可支持切片,实现了__setitem__类可支持切片赋值

切片时下标索引可以越界,但按下标访问元素不可以越界,会IndexError

可以通过切片赋值不相等数量元素实现元素添加或赋值

切片不建议同时提供起始下标和步进,一次切片只用其中一个就行,如果两个非要用建议两次切片,因为同时写会比较难懂。两次切片时,第一次用步进还是起始下标,可以看用哪个获取的切片最短就用哪个,因为切片是浅拷贝,元素越少越省内存

用*unpacking捕获多个元素而不是序列切片

对序列切片赋值给变量因为序列切片下标会比较凌乱,推荐用形如*a, b = lista赋值

写法需注意,使用带*解包时,并列需要一个普通不带*的变量,如果只有一个带*的变量,还不如不带*。而且一个表达式赋值号左边不可以出现两个以上带*变量,元素数量会不确定

*解包得到的变量一定是一个列表,如果没有元素分配则是个空列表

优点是写法更清晰,比用切片分割序列赋值更好点

sort时用key参数表明sort依据

sort默认用升序排列元素

当对自定义对象排序时,如果不处理可能会报错,此时可通过给sort函数传入key参数对应排序逻辑(函数),可用lambda

当需要多个依据比较时,lambda函数可返回一个元组,比较时会按元素从前往后比较。但多个依据比较时,sort函数只能按升或降排所有元素,不能a元素升序然后b元素降序,可以通过元素前面添加负号实现反排序,但一元减操作符不支持所有类型,比如str无法用-'a'。此种情况可以多次sort排序,因为sort排序是个稳定排序算法(元素排序相等时,排序前后元素的相对前后位置不会改变,如果改变了则是不稳定排序)

不应依赖字典类型添加元素的原始顺序

py3.5以前,字典不保证插入元素顺序和迭代顺序一致,py3.6以后保持了一致,因为字典保存了添加元素的顺序,类属性也类似于字典,后来会保存属性顺序,属性顺序即为属性定义顺序

其实保留插入顺序的dict和collections.OrderedDict很像,但性能有区别,如果频繁增删改,可优先考虑OrderedDict,性能可能好点,详见 稳定和性能章节笔记

当需要强制执行函数注解检查时,可以python -m mypy --strict abc.py。这样当函数入参和注解不一样时,mypy会检查出来并打日志

key不在字典中时用get判断而不是in和KeyError

判断字典是否包含key有如下方法:in判断,捕获keyerror,get方法和setdefault方法

get相比于in和KeyError可避免重复赋值,更简单,而in需要写两遍key,keyerror需要用try捕获也要写两次

先get字典值,再判断这个获取的值,其实用了一行代码,可以用海象运算符替代(py3.8以上才能用)

用setdefault虽然相比海象运算符可减少一行代码,但不好懂,且每次调用无论key是否存在都需要实例化默认值,如果是自定义类,可能会有一些性能开销

用defaultdict处理key不存在情况而不是setdefault

优点 1default只有键不存在才会创默认值,键存在时不会创默认值,省开销,setdefault无论键是否存在都会实例化默认值,开销大 2defaultdict无需setdefault写法,更简介易懂

用__missing__构造依赖键的默认值

当get,in,keyerror,setdefault,defaultdict都无法满足要求时,可用__missing__处理缺失键的情况,可继承dict然后实现__missing__方法,比如当希望defaultdict默认值支持入参时,前五种方法都不太行,需要用__missing__方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值