
https://github.com/LeoSirius/code_fluent_python/blob/master/python_in_a_nutshell.md 不断补充中。
仓库本身是用 jupyter notebook 写的 fluent Python 的笔记。这篇文章又是对笔记的总结,可以说是精华中的精华。但然,目前还没完成
下面是正文
按照元素类型:
按照序列本身可变性:
__setitem__, __delitem__, append, pop等方法dict 和 set 都是由 hash 表实现的。他们的 key 都必须是 hashable 的,hashable 的两个条件
__hash__())__eq__())内建不可变类型都是 hashable 的
注意 dict 和 set 的 key 是不可变的,但 dict 和 set 对象本身是可变类型
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 的区别:
first-class functions是functions as first-class objects的缩写
first-class objects的特点:
python 中 7 种可调用对象:
__call__,则实例可以像函数一样调用以函数为参数的可调用对象>>> 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',) ==判断的是对象是值是否相等,is判断的是是否是同一个对象 1 arobota OP 好像没人看 |
2 qW7bo2FbzbC0 2020 年 10 月 14 日 ``` 元组不仅仅是不可变的序列,一个更重要的作用是作为数据的一条记录 不要把不可变类型放到可变序列里做元素。不要把 tuple 放到 list 里 ``` 这个不理解 然后 编写,复写.使用魔术方法(dunder),这都是 Python 的骚操作之一。 |
3 xiaolinjia 2020 年 10 月 14 日 写反了吧。确定不是不要把 list 放 tuple 里? 因为如果把 list 放到 tuple 里,容易误操作。(0, [1])[1] += [1],这个会修改不可变类型 tuple,但同时抛异常。 |
4 arobota OP @xiaolinjia 这个地方确实是写反了 |