11. 学会对序列做切片

12. 不要在切片里同时使用起止下标和步进

a[s:e:stride],尽量避免这三个同时存在,一方面,难懂;另一方面,指定stride后需要仔细考虑是向前还是向后遍历。可以将同时出现三个的情况分成多步计算。

13. 用带星号*的unpacking操作捕获多个元素,不要用切片

下标容易出错,看起来乱,并且修改一行后,可能需要同时修改多行;星号表达式是一种unpacking操作,可接受多个变量,这个操作在函数形参定义中也适用,修改后更加简洁了。但是需要和至少一个普通变量搭配,不然会报错,并且同级中最多只能有一个星号,比如不能有a, *b。

  1. arr = [1, 2, 3, 4]
  2. # 通常
  3. a = arr[0]
  4. b = arr[1]
  5. c = arr[2:]
  6. # 修改
  7. a, b, *c = arr

14. 用sort的key参数来表示复杂的排序逻辑

15. 不要过分依赖给字典添加条目时的顺序

python3.5及之前的版本,dict存入顺序和最终读取的顺序可能是不一样的;我们很容易就能定义跟标准的字典很像但本身并不是dict实例的对象。对于这种类型的对象,不能假设迭代时看到的顺序必定与插入时的顺序相同。

16. 用get处理键不存在的情况,而不要使用in或keyerror

简洁易懂

  1. # in
  2. dic = {}
  3. if 'key' not in dic:
  4. pass
  5. else:
  6. pass
  7. # get
  8. value = dic.get('key')
  9. value = dic.get('key', default_value)

17. 用defaultdict处理缺失的元素,而不是setdefault

可以节省开销,setdefault是无论key是否存在,都会执行。defaultdict中传入的函数必须的无参的。

18. 利用missing构造键不存在时的默认值

这个方法是用在继承dict的类里,适合创建默认值需要较大开销,可能抛出异常。
def missing(self, key)