概述
前几天入手了Fluent Python,觉得还是有必要写一下读书笔记的。
大致的介绍一下这本书的结构,噢,豆瓣给这版9.4的评分,所以书是真的好。大致分为六部分,第一部分对Python的数据类型进行一个概览;第二部分是序列,映射,集合;第三部分是一些函数的特性,包括闭包装饰器等特性;第四部分是类的构建;第五部分包括生成器,协程和yield等语法;最后一部分比较偏底层,包括一些类装饰器和元类的高级概念。
知识点比较零散,在这里用列表的方式记录:
数据模型
- Magic method的存在是为了被Python解释器调用的,你自己不需要调用,因此没有object.__len__()这一说,而是使用len(object)。
- 对于内置类型,使用len方法,CPython会抄近路使用PyVarObject里面的ob_size属性,直接读取的话会比使用方法快得多。
- Python有一个名为"repr"的内置函数,用来表示一个对象的字符串表达形式,而repr使用的是__repr__这个magic方法来得到一个字符串的表达形式,同时如果一个对象没有__str__函数,而Python又需要调用它的时候,解释器会用__repr__作为代替。
序列
- 容器序列(list,tuple,collections.deque)与扁平序列(str,bytes,array.array)。
- 如果使用的列表推导的代码超过了两行,可能就要考虑需不需要使用for重写。
- Python2中出现的变量泄露的问题,在Python3中已经被正确的修复了。
-
In [1]: (i for i in range(3)) Out[1]: <generator object <genexpr> at 0x0000026411BB88B8> In [2]: tuple(i for i in range(3))
如果不使用tuple(),元素推导只会以生成器的类型返回
-
元组拆包有一个很优雅的应用,即不适用中间变量来交换两个变量的值。
-
在切片和区间操作中忽略最后一个元素是Python等很多语言的风格,不仅可以快速看到切片和区间返回的元素的个数,同时可以快速计算切片和区间的长度。除此之外,使用任意一个下标分割序列也是常用的操作。
-
*+都有会创建一个新序列;而对于可变序列(list),a+=b实现了就地加法;当然对于不可变序列肯定是不支持的。
-
In [16]: t = (1,2,[3]) In [17]: t[2]+=[4] --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-17-97bdecf87d05> in <module> ----> 1 t[2]+=[4] TypeError: 'tuple' object does not support item assignment In [18]: t Out[18]: (1, 2, [3, 4])
经典谜题,t[2]既发生了改变,同时也出现了报错。这是因为“TOP = [3] += [4]”这个操作可以完成,而"t[2] = TOP"这个操作由于t是不可变的,所以失败了。因此增量赋值并不是一个原子操作。但是这里有个问题,为什么通过t[2].append()就可以添加元素而不报错呢。通过id我们可以看到不管怎么操作t[2]的地址是不变的。
-
In [26]: a,b = [21,341,2],[21,341,2] In [27]: a.sort() In [28]: sorted(b) Out[28]: [2, 21, 341]
.sort会返回None,实现就地排序,这也是就地操作的惯例,好让你知道没有产生一个新的列表;而sorted()会返回新的列表。
-
可选参数“key”属性大有作用,key = len和key = str或者key = int得到的结果可能是完全不同的。
-
数组不再支持list.sort()的方法。
-
collections.deque中,maxlen可以决定队列最大长度,溢出时再添加会删除原元素。
最后
以上就是长情紫菜为你收集整理的Fluent Python读书笔记(1)的全部内容,希望文章能够帮你解决Fluent Python读书笔记(1)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复