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
判断的是是否是同一个对象这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.