流畅的Python pdf

流畅的Python

内容简介

本书致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道Python风格的代码。本书尤其深入探讨了Python语言的高级用法,涵盖数据结构、Python风格的对象、并行与并发,以及元编程等不同的方面。

作者简介

Luciano Ramalho,从1998年起就成为了Python程序员。他是Python软件基金会的成员,Python.pro.br(巴西的一家培训公司)的共同所有者,还是巴西众创空间Garoa Hacker Clube的联合创始人。他领导过多个软件开发团队,还在巴西的媒体、银行和政府部门教授Python课程。

安道,专注于现代计算机技术的自由翻译,译有《Flask Web 开发》《Python 网络编程攻略》《Ruby on Rails 教程》等书。

吴珂,现为Airbnb公司软件工程师,所在团队主要负责开发和维护各类可伸缩、高性能服务,并在Airbnb内推广面向服务的系统架构。在分布式系统、云存储服务和跨平台SDK开发,以及大规模数据处理等方面有多年经验。

目录

前言  xvii

第一部分 序幕

第1章 Python 数据模型  2

1.1 一摞 Python 风格的纸牌  3

1.2 如何使用特殊方法  6

1.2.1 模拟数值类型  7

1.2.2 字符串表示形式  9

1.2.3 算术运算符  10

1.2.4 自定义的布尔值  10

1.3 特殊方法一览  10

1.4 为什么 len 不是普通方法  12

1.5 本章小结  12

1.6 延伸阅读  13

第二部分 数据结构

第2章 序列构成的数组  16

2.1 内置序列类型概览  17

2.2 列表推导和生成器表达式  18

2.3 元组不仅仅是不可变的列表  22

2.4 切片  28

2.5 对序列使用 + 和 *  31

2.6 序列的增量赋值  33

2.7  list.sort 方法和内置函数 sorted  36

2.8 用 bisect 来管理已排序的序列  37

2.9 当列表不是首选时  41

2.10 本章小结  49

2.11 延伸阅读  50

第3章 字典和集合  54

3.1 泛映射类型  54

3.2 字典推导  56

3.3 常见的映射方法  57

3.4 映射的弹性键查询  61

3.5 字典的变种  65

3.6 子类化 UserDict  65

3.7 不可变映射类型  67

3.8 集合论  68

3.9  dict 和 set 的背后  73

3.10 本章小结  80

3.11 延伸阅读  81

第4章 文本和字节序列  83

4.1 字符问题  84

4.2 字节概要  85

4.3 基本的编解码器  88

4.4 了解编解码问题  89

4.5 处理文本文件  94

4.6 为了正确比较而规范化 Unicode 字符串  99

4.7 Unicode 文本排序  105

4.8 Unicode 数据库  108

4.9 支持字符串和字节序列的双模式 API  109

4.10 本章小结  112

4.11 延伸阅读  113

第三部分 把函数视作对象

第5章 一等函数  118

5.1 把函数视作对象  119

5.2 高阶函数  120

5.3 匿名函数  122

5.4 可调用对象  122

5.5 用户定义的可调用类型  123

5.6 函数内省  124

5.7 从定位参数到仅限关键字参数  126

5.8 获取关于参数的信息  127

5.9 函数注解  131

5.10 支持函数式编程的包  132

5.11 本章小结  137

5.12 延伸阅读  137

第6章 使用一等函数实现设计模式  141

6.1 案例分析:重构“策略”模式  142

6.2 “命令”模式  150

6.3 本章小结  151

6.4 延伸阅读  152

第7章 函数装饰器和闭包  154

7.1 装饰器基础知识  155

7.2 Python 何时执行装饰器  156

7.3 使用装饰器改进“策略”模式  157

7.4 变量作用域规则  159

7.5 闭包  161

7.6  nonlocal 声明  164

7.7 实现一个简单的装饰器  165

7.8 标准库中的装饰器  168

7.9 叠放装饰器  172

7.10 参数化装饰器  173

7.11 本章小结  177

7.12 延伸阅读  178

第四部分 面向对象惯用法

第8章 对象引用、可变性和垃圾回收  182

8.1 变量不是盒子  183

8.2 标识、相等性和别名  184

8.3 默认做浅复制  187

8.4 函数的参数作为引用时  190

8.5  del 和垃圾回收  195

8.6 弱引用  196

8.7 Python 对不可变类型施加的把戏  199

8.8 本章小结  201

8.9 延伸阅读  201

第9章 符合 Python 风格的对象  205

9.1 对象表示形式  206

9.2 再谈向量类  206

9.3 备选构造方法  208

9.4  classmethod 与 staticmethod  209

9.5 格式化显示  210

9.6 可散列的 Vector2d  213

9.7 Python 的私有属性和“受保护的”属性  218

9.8 使用 __slots__ 类属性节省空间  220

9.9 覆盖类属性  222

9.10 本章小结  224

9.11 延伸阅读  225

第10章 序列的修改、散列和切片  229

10.1  Vector 类:用户定义的序列类型  230

10.2  Vector 类第1 版:与 Vector2d 类兼容  230

10.3 协议和鸭子类型  232

10.4  Vector 类第2 版:可切片的序列  233

10.5  Vector 类第3 版:动态存取属性  237

10.6  Vector 类第4 版:散列和快速等值测试  240

10.7  Vector 类第5 版:格式化  244

10.8 本章小结  251

10.9 延伸阅读  251

第11章 接口:从协议到抽象基类  256

11.1 Python 文化中的接口和协议  257

11.2 Python 喜欢序列  258

11.3 使用猴子补丁在运行时实现协议  260

11.4 Alex Martelli 的水禽  262

11.5 定义抽象基类的子类  266

11.6 标准库中的抽象基类  267

11.7 定义并使用一个抽象基类  270

11.8  Tombola 子类的测试方法  278

11.9 Python 使用 register 的方式  281

11.10 鹅的行为有可能像鸭子  281

11.11 本章小结  283

11.12 延伸阅读  284

第12章 继承的优缺点  289

12.1 子类化内置类型很麻烦  289

12.2 多重继承和方法解析顺序  292

12.3 多重继承的真实应用  296

12.4 处理多重继承  298

12.5 一个现代示例:Django 通用视图中的混入  301

12.6 本章小结  304

12.7 延伸阅读  304

第13章 正确重载运算符  307

13.1 运算符重载基础  308

13.2 一元运算符  308

13.3 重载向量加法运算符 +  310

13.4 重载标量乘法运算符 *  315

13.5 众多比较运算符  318

13.6 增量赋值运算符  321

13.7 本章小结  325

13.8 延伸阅读  326

第五部分 控制流程

第14章 可迭代的对象、迭代器和生成器  330

14.1  Sentence 类第1 版:单词序列  331

14.2 可迭代的对象与迭代器的对比  334

14.3  Sentence 类第2 版:典型的迭代器  337

14.4  Sentence 类第3 版:生成器函数  339

14.5  Sentence 类第4 版:惰性实现  343

14.6  Sentence 类第5 版:生成器表达式  344

14.7 何时使用生成器表达式  345

14.8 另一个示例:等差数列生成器  346

14.9 标准库中的生成器函数  349

14.10 Python  3.3 中新出现的句法: yield from  357

14.11 可迭代的归约函数  358

14.12 深入分析 iter 函数  359

14.13 案例分析:在数据库转换工具中使用生成器  360

14.14 把生成器当成协程  362

14.15 本章小结  362

14.16 延伸阅读  363

第15章 上下文管理器和 else 块  368

15.1 先做这个,再做那个: if 语句之外的 else 块  369

15.2 上下文管理器和 with 块  370

15.3  contextlib 模块中的实用工具  374

15.4 使用 @contextmanager  375

15.5 本章小结  378

15.6 延伸阅读  378

第16章 协程  381

16.1 生成器如何进化成协程  382

16.2 用作协程的生成器的基本行为  382

16.3 示例:使用协程计算移动平均值  385

16.4 预激协程的装饰器  386

16.5 终止协程和异常处理  388

16.6 让协程返回值  391

16.7 使用 yield from  393

16.8  yield from 的意义  398

16.9 使用案例:使用协程做离散事件仿真  403

16.10 本章小结  410

16.11 延伸阅读  411

第17章 使用期物处理并发  416

17.1 示例:网络下载的三种风格  416

17.2 阻塞型 I/O 和 GIL  424

17.3 使用 concurrent.futures 模块启动进程  424

17.4 实验 Executor.map 方法  426

17.5 显示下载进度并处理错误  429

17.6 本章小结  437

17.7 延伸阅读  438

第18章 使用 asyncio 包处理并发  442

18.1 线程与协程对比  443

18.2 使用 asyncio 和 aiohttp 包下载  450

18.3 避免阻塞型调用  454

18.4 改进 asyncio 下载脚本  456

18.5 从回调到期物和协程  462

18.6 使用 asyncio 包编写服务器  466

18.7 本章小结  475

18.8 延伸阅读  476

第六部分 元编程

第19章 动态属性和特性  482

19.1 使用动态属性转换数据  483

19.2 使用特性验证属性  498

19.3 特性全解析  500

19.4 定义一个特性工厂函数  504

19.5 处理属性删除操作  506

19.6 处理属性的重要属性和函数  507

19.7 本章小结  510

19.8 延伸阅读  510

第20章 属性描述符  514

20.1 描述符示例:验证属性  514

20.2 覆盖型与非覆盖型描述符对比  526

20.3 方法是描述符  531

20.4 描述符用法建议  533

20.5 描述符的文档字符串和覆盖删除操作  534

20.6 本章小结  535

20.7 延伸阅读  536

第21章 类元编程  538

21.1 类工厂函数  539

21.2 定制描述符的类装饰器  541

21.3 导入时和运行时比较  543

21.4 元类基础知识  547

21.5 定制描述符的元类  552

21.6 元类的特殊方法 __prepare__  554

21.7 类作为对象  556

21.8 本章小结  557

21.9 延伸阅读  557

结语  560

附录 A 辅助脚本  563

Python 术语表  588

作者简介  600

关于封面  600

感悟与笔记

特殊函数:

func,称为双下方法,也是特殊方法或者魔术函数等,是专门给python解释器使用的,自己不要直接使用,而是转换为使用相应的正常函数。比如len()函数对应的是len(),我们自己经常时间的特殊函数是__init__

	python会忽略[] {} ()中的换行,所以可以不加\符号来换行
_占位符
	for country, _ in traveler_ids: 
*符号可迭代元素拆包、替代多余元素
	*(1,2,3,4), *可以拆成单个元素
	a, *body, c,d = range(5), *用于处理剩下元素
*对序列复制
	[1,2,3]*2,复制2份[1,2,3,1,2,3]
None关于是否返回新对象与返回值是否为None编程规范
	如果一个函数是在原对象上面修改,而无需返回值,这时可以返回None表示程序执行成功。
dict和set都是无序的,不应该一遍迭代一遍修改,会混乱,因为添加新键会导致已有键顺序错乱。
dict和set可以散列,所以查找速度非常快。list不可以散列查找速度很慢。但是散列对象是以空间换时间,占用存储空间很大。
什么是可散列对象:
	1、支持hash()函数,且通过__hash__返回值不变
	2、支持通过__eq__判断相等
	3、若a==b,那么hash(a)==hash(b)
__doc__属性用于形成对象的帮助文本,比如给IDE环境使用,比如help(obj)显示

对象引用

关于变量的错误理解是存储数据的盒子。

关于变量的正确理解是对象的引用,是附加在对象上的标注,像便利贴。所以定义一个变量进行赋值,更像把变量贴到对象上。

	别名:一个对象可以有多个标签
is判断相等性
	is判断的实质是id()两个对象的一致,id在对象的生命周期中不会变化。而不仅仅是内容相等。相等的==对象未必是同一个对象
	==判断的是对象的值
	is判断的是对象的id
	is运算速度比==快,is经常用于判断是否为None,x is None
元组是对象的引用,如果元组引用的对象是可变对象,那么元组内容也是可以变化的。比如一个列表组成的元组。
浅复制和深复制:
	copy.copy()和copy.deepcopy()分别为浅复制和深复制
	浅复制只复制第一层对象引用,深复制会进一步复制深层的引用。尤其针对第二层是可变对象时。
函数参数的引用
	python唯一支持的参数传递模式是共享传参。即一个函数的形参获取的是实参引用的副本,函数体内对形参的修改其实也会修改实参数据。
	千万不要使用可变类型作为参数的默认值
		比如不要这样做:def __init__(self, passenger=[]),这样做后果是在模块加载时就会创建这个空列表,导致所有的不带参数的实例化对象都使用同一个列表引用。
		推荐做法 def __init__(self, passenger=None) 然后在函数体内部判断如果为None再创建一个新的空列表
del和垃圾回收
	del仅仅删除对象的引用,而不是对象本身,对象本身只有当该对象所有的引用都没有了之后才会被系统当做垃圾进行回收。
wreakref弱引用
	不增加引用的计数,经常用在缓存中。
	import weakref
	a_set={0,1}
	wref=weakref.ref(a_set)
	a_set={2,3,4}   {0,1}的引用清0
	wref()就会因为原来引用的{1,2}被回收而导致清空。
	WeakValueDictionary和WeakKeyDictionary
		两者也主要用于缓存,也是weakref里面的类。当弱引用的值或key被回收后,字典里对应的键与值也会自动被删除。
	另外,注意不是所有类型都可以做弱引用,比如dict, list,int,tuple都不可以作为弱引用。但自己定义的对象可以。
下面是一些使用细节:
	1、简单的赋值语句不创建副本
	2、+=,-=等增量运算,如果左边是不可变类型会创建新对象,如果左边是可变类型会在原来对象上面修改
	3、对象的重新赋值相当于重新绑定,原来老的对象如果引用数为0会被回收

函数

函数是对象,函数是function类的实例

	高阶函数:将函数作为参数,或者将函数作为结果返回
匿名函数lambda,python对lambda的支持有限制,不能在定义体中使用赋值、while、for等语句。
	格式:lambda x : x in list
可调用对象
	怎么判断一个对象是否可以用()进行调用,用callable(),如果一个类实现了__call__方法,类的对象就是可调用对象
	7种可调用对象:
		自定义函数、内置函数、内置方法、方法、类、类的实例、生成器函数
位置参数和关键字参数的传入方法*和**
	传入未知个数的位置参数用*args,所有参数会存为一个元组
	传入未知个数的关键字参数用**kwargs,所有参数被存为一个字典
	怎么将构造好的参数列表作为一个参数传递给函数,func(**args),args可以是一个字典,里面包含了func所需的所有参数,**会把这些参数作为一个参数传入。
		func会自动解析,多余的参数会传给**kwargs关键字参数
	仅限关键字参数是python3特性,需要放在*args后面,**kwargs前面,比如func(name,*args, address="SH", **kwargs)
		这样address只能接收关键字参数,关键字参数如果不设置默认值,那么调用的时候必须传入参数
		如果仅想支持仅限关键字参数,而不想支持数量不定参数,可以用*号替代*args
函数注解
	def clip(text:str, max_len:'int > 0'=80) -> str:
	参数注解放在参数后面:
	有默认值时的注解在参数和默认值=号之间
	返回值注解是在函数:前
	函数注解是给IDE等解释器或者代码检测用,不影响解释器执行。
	这些注解都会存储在__annotations__属性中,使用inspect.signature()可以检查

会员免费下载

链接:https://pan.baidu.com/s/1ELwHuXCfKFHYWaZaioEqGg

提取码: ****** 查看

¥69/年 开通VIP会员

成为本站VIP会员即可无限下载。 请先点击百度网盘,看资源是否还在,不在请点击链接通知站长补资源。

资源标签点击标签可查看对应分类的资源

Python

资源推荐

免费 图解数据结构:使用Java

C++ 程序设计语言:第4部分 标准库(原书第4版)

C++编程思想(两卷合订本)

CSS世界

JavaScript DOM编程艺术(第2版)

C++ Primer Plus(第6版) 中文版

Vue.js快速入门

Java编程思想(第4版) [thinking in java]

Copyright © 2021-2022 知识猫. All Rights Reserved.