序
《流畅的python》是还在上学时就被安利的一本奇书,马克了很久一直没机会系统拜读。最近碰巧偶得第二版的pdf。经济周期的下行阶段正是用来学习充电的,于是乎打算捡起荒废许久的blog,读读书,写写字,蓄势待东风。
第一章
本章主要讲了自定义类时需要重载的几个重要方法。学到的新知识如下:
f字符串
是对于.format()函数的扩展,可以兼容各种基本数据类型的格式化,但需要注意:
1、单引号、双引号、三单引号、三双引号引号的配对使用;
2、字符’{‘用’{{'表示,而不是转义;
有序的字典
python3.6之前的版本中,打印dict,kv对不是按照插入顺序排序,但从python3.6版本开始,dict变得有序了。原因是低层数据保存形式从一个稀疏二维表变成了一个稀疏一维数组和一个稠密二维数组。见https://blog.csdn.net/somenzz/article/details/120620348。
str__和__repr
__repr__用于表示一个对象(可视作该对象的官方文档,故应当客观准确);__str__用于建立该对象的字符串形式,可在print()中调用。
重载__repr__的同时会重载__str__。
len
内建数据类型调用len,会直接返回低层的一个C语言结构体的字段,因此速度极快。
第二章
本章主要介绍几种序列类型的相关操作。
序列的类型
容器序列:包括list、tuple、collections.deque:成员类型不唯一,内存中存放成员的引用。(意味着改变引用变量的值,可以修改该对象的值,更意味着tuple只是长度不变,内容是可变的)
扁平序列:包括str、bytes、array.array:成员类型唯一吗,内存中存放成员本身。
列表推导式
如
codes = [ord(x) for x in x]
速度不慢于map、filt;比生成器表达式(类的构造函数)效率低
序列和可迭代对象的拆包
1、并行赋值
a,b = (2,2)
a,b = b,a
2、*,可以用于获取args剩余变量
>>> a, b, *rest = range(5)
>>> a, b, rest
(0, 1, [2, 3, 4])
>>> a, b, *rest = range(3)
>>> a, b, rest
(0, 1, [2])
>>> a, b, *rest = range(2)
>>> a, b, rest
(0, 1, [])
切片
计头不计尾的好处:容易计算区间长度,(如range(3)只包含3项,range(2,3)包含1=3-2项),拆分不重叠(如my_list[:x]和my_list[x:]即可划分my_list)
增量运算符
+=前的对象有没有变取决于是否重载__iadd__方法