跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Python in a nutshell
未分類
23 10 月 2020

Python in a nutshell

Python in a nutshell

資深大佬 : arobota 5

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

大佬有話說 (4)

  • 主 資深大佬 : arobota

    好像没人看

  • 資深大佬 : hjahgdthab750

    “`
    元组不仅仅是不可变的序列,一个更重要的作用是作为数据的一条记录
    不要把不可变类型放到可变序列里做元素。不要把 tuple 放到 list 里
    “`
    这个不理解

    然后 编写,复写.使用魔术方法(dunder),这都是 Python 的骚操作之一。

  • 資深大佬 : xiaolinjia

    写反了吧。确定不是不要把 list 放 tuple 里?
    因为如果把 list 放到 tuple 里,容易误操作。(0, [1])[1] += [1],这个会修改不可变类型 tuple,但同时抛异常。

  • 主 資深大佬 : arobota

    @xiaolinjia 这个地方确实是写反了

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具