学习对序列做切片
实现了__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__方法