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
V2EX  ›  Python

Python in a nutshell

  •  
  •   arobota · 2020-10-14 11:56:00 +08:00 · 1363 次点击
    这是一个创建于 1537 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 13:55:15 +08:00
    好像没人看
    qW7bo2FbzbC0
        2
    qW7bo2FbzbC0  
       2020-10-14 14:24:21 +08:00
    ```
    元组不仅仅是不可变的序列,一个更重要的作用是作为数据的一条记录
    不要把不可变类型放到可变序列里做元素。不要把 tuple 放到 list 里
    ```
    这个不理解

    然后 编写,复写.使用魔术方法(dunder),这都是 Python 的骚操作之一。
    xiaolinjia
        3
    xiaolinjia  
       2020-10-14 16:12:13 +08:00   ❤️ 1
    写反了吧。确定不是不要把 list 放 tuple 里?
    因为如果把 list 放到 tuple 里,容易误操作。(0, [1])[1] += [1],这个会修改不可变类型 tuple,但同时抛异常。
    arobota
        4
    arobota  
    OP
       2020-10-14 16:23:00 +08:00
    @xiaolinjia 这个地方确实是写反了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1145 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:57 · PVG 01:57 · LAX 09:57 · JFK 12:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.