Python in a nutshell

2020-10-14 11:56:00 +08:00
 arobota

https://github.com/LeoSirius/code_fluent_python/blob/master/python_in_a_nutshell.md 不断补充中。

仓库本身是用 jupyter notebook 写的 fluent Python 的笔记。这篇文章又是对笔记的总结,可以说是精华中的精华。但然,目前还没完成

下面是正文

python in a nutshell

Chapter 1 The Python Data Model

Chapter 2 Sequence

序列的分类

按照元素类型:

按照序列本身可变性:

列表推导和生成器表达式

元组不仅仅是不可变的序列,一个更重要的作用是作为数据的一条记录

不要把不可变类型放到可变序列里做元素。不要把 tuple 放到 list 里

Chapter 3 Dictionaries and Sets

dict 和 set 都是由 hash 表实现的。他们的 key 都必须是 hashable 的,hashable 的两个条件

内建不可变类型都是 hashable 的

注意 dict 和 set 的 key 是不可变的,但 dict 和 set 对象本身是可变类型

dict 的实现机制

3.6 及之前是像下面这样实现的

entries = [
    ['--', '--', '--'],
    ['--', '--', '--'],
    [hash, key, value],
    ['--', '--', '--'],
    ['--', '--', '--'],
]

3.7 及之后,引入了一个 indices 列表

indices = [1, None, None, 0, None, None]
# 此时 enteies 会插入第一个元素
entries = [
    [12343543, 'name', 'leo'],
    [34323545, 'hanmeimei', 'lihua']
]

由上可以看出,3.7 及以后 dict 和旧版本 dict 的区别:

Chapter 5 First Class Functions

函数是对象

first-class functionsfunctions as first-class objects的缩写

first-class objects的特点:

高阶函数:以函数为参数,返回函数的函数

可调用对象

python 中 7 种可调用对象:

Chapter 7 Function Decorators and Closures

装饰器

对一个函数使用多个装饰器,装饰器会从里到外(从上到下)执行

>>> def d1(f):
...     print('in d1')
...     return f
... 
>>> def d2(f):
...     print('in d2')
...     return f
... 
>>> @d1
... @d2
... def f():
...     print('in f')
... 
in d2    # 可以看到先执行了 d2,再执行 d1
in d1
>>> f()
in f

调用的 f 相当于f = d1(d2(f))

闭包:一种延伸了作用域的函数

在闭包中用 nonlocal 可以把变量声明为自由变量

>>> def make_averager():
...     series = []
...     
...     def averager(new_value):
...         series.append(new_value)       # 这里的 series 称为自由变量,这个术语专指未在本地作用域中绑定的变量
...         total = sum(series)
...         return total / len(series)
...     
...     return averager
... 
>>> avg = make_averager()
>>> 
>>> avg(1)
1.0
>>> avg(2)
1.5
>>> avg.__code__.co_varnames   # 显示局部变量
('new_value', 'total')
>>> avg.__code__.co_freevars   # 显示自由变量
('series',)

Chapter 8 Object References Mutability and Recycling

变量都是引用

==判断的是对象是值是否相等,is判断的是是否是同一个对象

1265 次点击
所在节点    Python
4 条回复
arobota
2020-10-14 13:55:15 +08:00
好像没人看
qW7bo2FbzbC0
2020-10-14 14:24:21 +08:00
```
元组不仅仅是不可变的序列,一个更重要的作用是作为数据的一条记录
不要把不可变类型放到可变序列里做元素。不要把 tuple 放到 list 里
```
这个不理解

然后 编写,复写.使用魔术方法(dunder),这都是 Python 的骚操作之一。
xiaolinjia
2020-10-14 16:12:13 +08:00
写反了吧。确定不是不要把 list 放 tuple 里?
因为如果把 list 放到 tuple 里,容易误操作。(0, [1])[1] += [1],这个会修改不可变类型 tuple,但同时抛异常。
arobota
2020-10-14 16:23:00 +08:00
@xiaolinjia 这个地方确实是写反了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/714797

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX