Python in a nutshell - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
arobota

Python in a nutshell

  •  
  •   arobota 2020 年 10 月 14 日 1728 次点击
    这是一个创建于 2019 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

    • dunder 函数是给解释器调用的,自己不要随便调用

    Chapter 2 Sequence

    序列的分类

    按照元素类型:

    • 容器序列:可以存放任意类型对象的引用。如 list 、tuple 、collections.deque 等
    • 扁平序列:只能存放基础类型的值。其实一段连续的内存空间,更接近于 c 的数组

    按照序列本身可变性:

    • 不可变序列
    • 可变序列:可变序列是不可变序列的子类,多了__setitem__, __delitem__, append, pop等方法

    列表推导和生成器表达式

    • 列表推导是直接把元素生成好,放在内存里
    • 生成器表达式是惰性的。在使用到相应元素的时候,才会在内存里把那个元素创建出来。

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

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

    Chapter 3 Dictionaries and Sets

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

    • hash 值在生命周期内不变(__hash__()
    • hash 值能进行比较(__eq__()

    内建不可变类型都是 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 的区别:

    • 新 dict 是有序的
    • 新 dict 的 hash 表时密集的

    Chapter 5 First Class Functions

    函数是对象

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

    first-class objects的特点:

    • 在运行时创建
    • 能被赋值给变量
    • 能做为函数的参数,能被函数返回

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

    可调用对象

    python 中 7 种可调用对象:

    • 用户定义的函数:def 或 lambda 函数
    • 内置函数:C 实现的函数
    • 内置方法:C 实现的方法,如 dict.get()
    • 类的实例:类定义了__call__,则实例可以像函数一样调用
    • 方法
    • 生成器函数:函数中用 yield,返回的是一个生成器对象

    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判断的是是否是同一个对象

    arobota
        1
    arobota  
    OP
       2020 年 10 月 14 日
    好像没人看
    qW7bo2FbzbC0
        2
    qW7bo2FbzbC0  
       2020 年 10 月 14 日
    ```
    元组不仅仅是不可变的序列,一个更重要的作用是作为数据的一条记录
    不要把不可变类型放到可变序列里做元素。不要把 tuple 放到 list 里
    ```
    这个不理解

    然后 编写,复写.使用魔术方法(dunder),这都是 Python 的骚操作之一。
    xiaolinjia
        3
    xiaolinjia  
       2020 年 10 月 14 日   1
    写反了吧。确定不是不要把 list 放 tuple 里?
    因为如果把 list 放到 tuple 里,容易误操作。(0, [1])[1] += [1],这个会修改不可变类型 tuple,但同时抛异常。
    arobota
        4
    arobota  
    OP
       2020 年 10 月 14 日
    @xiaolinjia 这个地方确实是写反了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1422 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 56ms UTC 17:03 PVG 01:03 LAX 10:03 JFK 13:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86