店铺推荐
【推荐语】
一、领域好书

【领域好书】Python 进阶指南,精通 Python 绕不开的推荐作品

【好评如潮】Amazon 4.7 星评,豆瓣评分 9.4,近 8 万读者学习

【作者资深】25 年一线研发经验,PSF(Python软件基金会)成员

二、内容精良

【知识聚焦】专注 Python 核心特性和标准库,助你掌握语言底层逻辑

【通俗易读】近 500 段代码示例 + 多图多表,文笔诙谐,语言流畅

【Pythonic】写简洁、流畅、地道的 Python 代码,飙升编程效率

三、新版特色

【优化升级】内容更新率超过 3 成,基于 Python 3.10 新升级

【分上下册】新版拆分为上下两册(480/292页),更方便更易读
【作者】
【作者简介】 卢西亚诺·拉马略(Luciano Ramalho) Thoughtworks首席咨询师、Python软件基金会成员、巴西Python语言学习社区Python Brasil联合创立人。拥有25年Python编程经验,著有编程领域作品《流畅的Python》。 【译者简介】 安道 活跃的技术图书译者,译有《流畅的Python》《Flask Web开发:基于Python的Web应用开发实战》《Python网络编程攻略》等图书。
【内容】
本书是Python领域备受推崇的经典作品,致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,写出简洁、流畅、易读、易维护,并且地道的Python代码。本书着重讲解Python语言所独有的功能,助你成功进阶为Python高手。第2版与时俱进,教你跳出旧有经验,探索并运用地道的Python3功能。第2版主体内容分为五部分:数据结构、函数即对象、类和协议、控制流、元编程。每一部分都精彩纷呈,通过丰富的示例和细致的讲解,教你充分利用Python特性,写出有效且现代的Python3代码。对于所有想提升Python开发技能的读者,本书不容错过。
【目录】
《流畅的Python.上册》
前言i
第一部分数据结构
第1章Python数据模型3
1.1本章新增内容4
1.2一摞Python风格的纸牌4
1.3特殊方法是如何使用的7
1.3.1模拟数值类型8
1.3.2字符串表示形式10
1.3.3自定义类型的布尔值11
1.3.4容器API12
1.4特殊方法概述13
1.5len为什么不是方法14
1.6本章小结14
1.7延伸阅读15
第2章丰富的序列17
2.1本章新增内容18
2.2内置序列类型概览18
2.3列表推导式和生成器表达式20
2.3.1列表推导式对可读性的影响20
2.3.2列表推导式与map和filter比较22
2.3.3笛卡儿积22
2.3.4生成器表达式23
2.4元组不仅仅是不可变列表24
2.4.1用作记录24
2.4.2用作不可变列表26
2.4.3列表和元组方法的比较27
2.5序列和可迭代对象拆包28
2.5.1使用*获取余下的项29
2.5.2在函数调用和序列字面量中使用*拆包29
2.5.3嵌套拆包30
2.6序列模式匹配31
2.7切片37
2.7.1为什么切片和区间排除最后一项38
2.7.2切片对象38
2.7.3多维切片和省略号39
2.7.4为切片赋值40
2.8使用+和*处理序列40
2.8.1构建嵌套列表41
2.8.2使用增量赋值运算符处理序列42
2.8.3一个+=运算符赋值谜题43
2.9list.sort与内置函数sorted45
2.10当列表不适用时46
2.10.1数组47
2.10.2memoryview49
2.10.3NumPy50
2.10.4双端队列和其他队列52
2.11本章小结55
2.12延伸阅读56
第3章字典和集合59
3.1本章新增内容60
3.2字典的现代句法60
3.2.1字典推导式60
3.2.2映射拆包61
3.2.3使用|合并映射61
3.3使用模式匹配处理映射62
3.4映射类型的标准API64
3.4.1“可哈希”指什么64
3.4.2常用映射方法概述65
3.4.3插入或更新可变的值67
3.5自动处理缺失的键69
3.5.1defaultdict:处理缺失键的另一种选择69
3.5.2__missing__方法70
3.5.3标准库对__missing__方法的使用不一致72
3.6dict的变体73
3.6.1collections.OrderedDict73
3.6.2collections.ChainMap73
3.6.3collections.Counter74
3.6.4shelve.Shelf74
3.6.5子类应继承UserDict而不是dict75
3.7不可变映射76
3.8字典视图77
3.9dict的实现方式对实践的影响78
3.10集合论79
3.10.1set字面量80
3.10.2集合推导式81
3.11集合的实现方式对实践的影响81
3.12字典视图的集合运算84
3.13本章小结85
3.14延伸阅读86
第4章Unicode文本和字节序列88
4.1本章新增内容89
4.2字符问题89
4.3字节概要90
4.4基本的编码解码器92
4.5处理编码和解码问题93
4.5.1处理UnicodeEncodeError94
4.5.2处理UnicodeDecodeError95
4.5.3加载模块时编码不符合预期抛出的SyntaxError95
4.5.4如何找出字节序列的编码96
4.5.5BOM:有用的鬼符97
4.6处理文本文件98
4.7为了正确比较而规范化Unicode字符串105
4.7.1大小写同一化107
4.7.2规范化文本匹配的实用函数108
4.7.3特别“规范化”:去掉变音符109
4.8Unicode文本排序111
4.9Unicode数据库113
4.9.1按名称查找字符114
4.9.2字符的数值意义115
4.10支持str和bytes的双模式API117
4.10.1正则表达式中的str和bytes117
4.10.2os函数中的str和bytes118
4.11本章小结119
4.12延伸阅读119
第5章数据类构建器123
5.1本章新增内容124
5.2数据类构建器概述124
5.3典型的具名元组128
5.4带类型的具名元组130
5.5类型提示入门131
5.5.1运行时没有作用131
5.5.2变量注解句法132
5.5.3变量注解的意义132
5.6@dataclass详解135
5.6.1字段选项136
5.6.2初始化后处理139
5.6.3带类型的类属性140
5.6.4初始化不作为字段的变量141
5.6.5@dataclass示例:都柏林核心模式142
5.7数据类导致代码异味144
5.7.1把数据类用作脚手架145
5.7.2把数据类用作中间表述145
5.8模式匹配类实例145
5.8.1简单类模式145
5.8.2关键字类模式146
5.8.3位置类模式147
5.9本章小结148
5.10延伸阅读149
第6章对象引用、可变性和垃圾回收152
6.1本章新增内容152
6.2变量不是盒子153
6.3同一性、相等性和别名154
6.3.1在==和is之间选择156
6.3.2元组的相对不可变性157
6.4默认做浅拷贝157
6.5函数的参数是引用时161
6.5.1不要使用可变类型作为参数的默认值162
6.5.2防御可变参数164
6.6del和垃圾回收165
6.7Python对不可变类型施加的把戏167
6.8本章小结168
6.9延伸阅读169
第二部分函数即对象
第7章函数是一等对象175
7.1本章新增内容176
7.2把函数视为对象176
7.3高阶函数177
7.4匿名函数179
7.59种可调用对象180
7.6用户定义的可调用类型181
7.7从位置参数到仅限关键字参数182
7.8支持函数式编程的包184
7.8.1operator模块184
7.8.2使用functools.partial冻结参数187
7.9本章小结189
7.10延伸阅读189
第8章函数中的类型提示192
8.1本章新增内容193
8.2关于渐进式类型193
8.3渐进式类型实践194
8.3.1Mypy初体验195
8.3.2让Mypy严格要求195
8.3.3参数的默认值196
8.3.4使用None表示默认值198
8.4类型由受支持的操作定义198
8.5注解中可用的类型202
8.5.1Any类型203
8.5.2简单的类型和类205
8.5.3Optional类型和Union类型205
8.5.4泛化容器207
8.5.5元组类型209
8.5.6泛化映射211
8.5.7抽象基类212
8.5.8Iterable214
8.5.9参数化泛型和TypeVar215
8.5.10静态协议218
8.5.11Callable223
8.5.12NoReturn225
8.6注解仅限位置参数和变长参数225
8.7类型不完美,测试须全面226
8.8本章小结227
8.9延伸阅读228
第9章装饰器和闭包232
9.1本章新增内容233
9.2装饰器基础知识233
9.3Python何时执行装饰器234
9.4注册装饰器235
9.5变量作用域规则236
9.6闭包239
9.7nonlocal声明241
9.8实现一个简单的装饰器243
9.9标准库中的装饰器245
9.9.1使用functools.cache做备忘245
9.9.2使用lru_cache248
9.9.3单分派泛化函数249
9.10参数化装饰器252
9.10.1一个参数化注册装饰器253
9.10.2参数化clock装饰器254
9.10.3基于类的clock装饰器256
9.11本章小结257
9.12延伸阅读258
第10章使用一等函数实现设计模式261
10.1本章新增内容262
10.2案例分析:重构策略模式262
10.2.1经典的策略模式262
10.2.2使用函数实现策略模式265
10.2.3选择很好策略的简单方式268
10.2.4找出一个模块中的全部策略269
10.3使用装饰器改进策略模式270
10.4命令模式272
10.5本章小结273
10.6延伸阅读274
第三部分类和协议
第11章符合Python风格的对象279
11.1本章新增内容280
11.2对象表示形式280
11.3再谈向量类281
11.4备选构造函数283
11.5classmethod与staticmethod283
11.6格式化显示284
11.7可哈希的Vector2d287
11.8支持位置模式匹配289
11.9第3版Vector2d的完整代码290
11.10Python私有属性和“受保护”的属性294
11.11使用__slots__节省空间295
11.11.1简单衡量__slot__节省的内存297
11.11.2总结__slots__的问题298
11.12覆盖类属性299
11.13本章小结300
11.14延伸阅读301
第12章序列的特殊方法305
12.1本章新增内容305
12.2Vector类:用户定义的序列类型306
12.3Vector类第1版:与Vector2d类兼容306
12.4协议和鸭子类型308
12.5Vector类第2版:可切片的序列309
12.5.1切片原理310
12.5.2能处理切片的__getitem__方法312
12.6Vector类第3版:动态存取属性313
12.7Vector类第4版:哈希和快速等值测试316
12.8Vector类第5版:格式化321
12.9本章小结327
12.10延伸阅读328
第13章接口、协议和抽象基类332
13.1类型图333
13.2本章新增内容333
13.3两种协议334
13.4利用鸭子类型编程335
13.4.1Python喜欢序列335
13.4.2使用猴子补丁在运行时实现协议337
13.4.3防御性编程和“快速失败”339
13.5大鹅类型340
13.5.1子类化一个抽象基类344
13.5.2标准库中的抽象基类345
13.5.3定义并使用一个抽象基类347
13.5.4抽象基类句法详解351
13.5.5子类化抽象基类Tombola352
13.5.6抽象基类的虚拟子类354
13.5.7register的实际使用356
13.5.8使用抽象基类实现结构类型356
13.6静态协议358
13.6.1为double函数添加类型提示358
13.6.2运行时可检查的静态协议359
13.6.3运行时协议检查的局限性362
13.6.4支持静态协议363
13.6.5设计一个静态协议364
13.6.6协议设计很好实践366
13.6.7扩展一个协议366
13.6.8numbers模块中的抽象基类和Numeric协议367
13.7本章小结369
13.8延伸阅读370
第14章继承:瑕瑜互见374
14.1本章新增内容375
14.2super()函数375
14.3子类化内置类型很麻烦377
14.4多重继承和方法解析顺序379
14.5混入类384
14.6多重继承的实际运用385
14.6.1抽象基类也是混入类386
14.6.2ThreadingMixIn和ForkingMixIn386
14.6.3Django泛化视图混入类387
14.6.4Tkinter中的多重继承390
14.7应对多重继承391
14.7.1优先使用对象组合,而不是类继承391
14.7.2理解不同情况下使用继承的原因392
14.7.3使用抽象基类显式表示接口392
14.7.4通过混入明确重用代码392
14.7.5为用户提供聚合类392
14.7.6仅子类化为子类化设计的类393
14.7.7避免子类化具体类393
14.7.8Tkinter的好、不好以及令人厌恶的方面394
14.8本章小结394
14.9延伸阅读395
第15章类型提示进阶399
15.1本章新增内容399
15.2重载的签名400
15.2.1重载max函数401
15.2.2重载max函数的启示405
15.3TypedDict405
15.4类型校正411
15.5在运行时读取类型提示413
15.5.1注解在运行时的问题414
15.5.2解决这个问题416
15.6实现一个泛化类417
15.7型变419
15.7.1一个不变的自动售货机419
15.7.2一个协变的自动售货机421
15.7.3一个逆变的垃圾桶421
15.7.4型变总结423
15.8实现泛化静态协议425
15.9本章小结426
15.10延伸阅读427
第16章运算符重载431
16.1本章新增内容432
16.2运算符重载入门432
16.3一元运算符433
16.4重载向量加法运算符+435
16.5重载标量乘法运算符*439
16.6把@当作中缀运算符使用441
16.7算术运算符总结443
16.8众多比较运算符443
16.9增量赋值运算符446
16.10本章小结450
16.11延伸阅读451
《流畅的Python.下册》
第四部分控制流
第17章迭代器、生成器和经典协程457
17.1本章新增内容458
17.2单词序列458
17.3序列可以迭代的原因:iter函数459
17.4可迭代对象与迭代器462
17.5为Sentence类实现__iter__方法465
17.5.1Sentence类第2版:经典迭代器465
17.5.2不要把可迭代对象变成迭代器466
17.5.3Sentence类第3版:生成器函数467
17.5.4生成器的工作原理468
17.6惰性实现版本470
17.6.1Sentence类第4版:惰性生成器470
17.6.2Sentence类第5版:惰性生成器表达式471
17.7何时使用生成器表达式473
17.8一个等差数列生成器474
17.9标准库中的生成器函数477
17.10可迭代的归约函数486
17.11yieldfrom:从子生成器中产出487
17.11.1重新实现chain488
17.11.2遍历树状结构489
17.12泛化可迭代类型493
17.13经典协程495
17.13.1示例:使用协程计算累计平均值496
17.13.2让协程返回一个值498
17.13.3经典协程的泛化类型提示501
17.14本章小结502
17.15延伸阅读503
第18章with、match和else块507
18.1本章新增内容508
18.2上下文管理器和with块508
18.2.1contextlib包中的实用工具511
18.2.2使用@contextmanager512
18.3案例分析:lis.py中的模式匹配516
18.3.1Scheme句法516
18.3.2导入和类型517
18.3.3解析器518
18.3.4环境519
18.3.5REPL521
18.3.6求值函数522
18.3.7实现闭包的Procedure类529
18.3.8使用OR模式529
18.4先做这个,再做那个:if语句之外的else块530
18.5本章小结532
18.6延伸阅读533
第19章Python并发模型537
19.1本章新增内容538
19.2全景概览538
19.3术语定义539
19.4一个演示并发的“HelloWorld”示例541
19.4.1使用线程实现旋转指针541
19.4.2使用进程实现旋转指针544
19.4.3使用协程实现旋转指针545
19.4.4对比几版supervisor函数548
19.5GIL真正的影响549
19.6自建进程池552
19.6.1基于进程的方案554
19.6.2理解用时554
19.6.3利用多核进行素数检测的程序代码555
19.6.4实验:进程数多一些或少一些558
19.6.5基于线程的方案并不可靠559
19.7多核世界中的Python559
19.7.1系统管理560
19.7.2数据科学560
19.7.3服务器端Web和移动开发561
19.7.4WSGI应用程序服务器563
19.7.5分布式任务队列564
19.8本章小结565
19.9延伸阅读566
19.9.1使用线程和进程实现并发566
19.9.2GIL567
19.9.3标准库之外的并发世界567
19.9.4Python之外的并发和伸缩世界569
第20章并发执行器572
20.1本章新增内容572
20.2并发网络下载573
20.2.1依序下载的脚本574
20.2.2使用concurrent.futures模块下载576
20.2.3future对象在哪里577
20.3使用concurrent.futures启动进程580
20.4实验Executor.map方法583
20.5显示下载进度并处理错误585
20.5.1flags2系列示例处理错误的方式589
20.5.2使用futures.as_completed函数591
20.6本章小结593
20.7延伸阅读594
第21章异步编程596
21.1本章新增内容597
21.2一些定义597
21.3一个asyncio示例:探测域名598
21.4新概念:可异步调用对象600
21.5使用asyncio和HTTPX下载601
21.5.1原生协程的秘密:默默无闻的生成器602
21.5.2“不成功便成仁”问题603
21.6异步上下文管理器603
21.7增强asyncio版下载脚本的功能605
21.7.1使用asyncio.as_completed和一个线程605
21.7.2使用信号量请求607
21.7.3每次下载发起多个请求610
21.8把任务委托给执行器612
21.9使用asyncio编写服务器613
21.9.1一个FastAPIWeb服务614
21.9.2一个使用asyncio编写的TCP服务器617
21.10异步迭代和异步可迭代对象622
21.10.1异步生成器函数623
21.10.2异步生成器表达式和异步推导式627
21.11asyncio之外的异步世界:Curio629
21.12异步对象的类型提示631
21.13异步原理与陷阱632
21.13.1阻塞型调用导致漫长等待633
21.13.2I/O密集型系统的误区633
21.13.3绕开CPU密集型陷阱633
21.14本章小结634
21.15延伸阅读635
第五部分元编程
第22章动态属性和特性641
22.1本章新增内容642
22.2使用动态属性转换数据642
22.2.1使用动态属性访问JSON类数据643
22.2.2处理无效属性名646
22.2.3使用__new__方法灵活创建对象647
22.3计算特性649
22.3.1第1步:数据驱动属性创建650
22.3.2第2步:通过特性获取链接的记录651
22.3.3第3步:用特性覆盖现有属性654
22.3.4第4步:自己实现特性缓存655
22.3.5第5步:使用functools缓存特性656
22.4使用特性验证属性658
22.4.1LineItem类第1版:表示订单中商品的类658
22.4.2LineItem类第2版:能验证值的特性659
22.5特性全解析660
22.5.1特性覆盖实例属性661
22.5.2特性的文档663
22.6定义一个特性工厂函数664
22.7处理属性删除操作666
22.8处理属性的重要属性和函数667
22.8.1影响属性处理方式的特殊属性667
22.8.2处理属性的内置函数668
22.8.3处理属性的特殊方法668
22.9本章小结669
22.10延伸阅读670
第23章属性描述符674
23.1本章新增内容675
23.2描述符示例:属性验证675
23.2.1LineItem类第3版:一个简单的描述符675
23.2.2LineItem类第4版:为储存属性自动命名680
23.2.3LineItem类第5版:一种新型描述符681
23.3覆盖型描述符与非覆盖型描述符对比683
23.3.1覆盖型描述符685
23.3.2没有__get__方法的覆盖型描述符686
23.3.3非覆盖型描述符687
23.3.4覆盖类中的描述符687
23.4方法是描述符688
23.5描述符用法建议690
23.6描述符的文档字符串和覆盖删除操作691
23.7本章小结692
23.8延伸阅读692
第24章类元编程695
24.1本章新增内容696
24.2身为对象的类696
24.3type:内置的类工厂函数697
24.4类工厂函数698
24.5引出__init_subclass__700
24.6使用类装饰器增强类的功能706
24.7导入时和运行时比较708
24.8元类入门713
24.8.1元类如何定制类715
24.8.2一个友好的元类示例715
24.8.3元类求解时间实验718
24.9使用元类实现Checked类722
24.10元类的实际运用726
24.10.1可简化或代替元类的现代功能726
24.10.2元类是稳定的语言功能726
24.10.3一个类只能有一个元类726
24.10.4元类应作为实现细节727
24.11使用元类的__prepare__方法实现新颖的构思727
24.12小结729
24.13本章小结730
24.14延伸阅读730
结语733
【媒体评论】
“在我刚学习Python时,这本书对我帮助非常大,我从书中学习到了Python的各种优秀特性。如今这本书出第2版了,内容也做了全面升级,依旧干货满满,每个学习Python的朋友都不容错过!” ———崔庆才,《Python3网络爬虫开放实战》作者 微软(中国)软件工程师 “《流畅的Python》是我心中很棒的编程书之一,它教会了我许多。从技术角度,书中对于Python数据模型、面向对象和元编程等知识的透彻讲述,让我的编程技术得到了很大提升。另外,作者精心打磨的遍布全书的各类细节,更是对我影响深远。书中每个示例都经过精心设计,每行疑难代码都有批注说明。当我自己开始技术写作时,我从这本书中获益良多。 “第2版在第1版的基础上,将Python版本更新到了Python 3.10,同时追加了异步编程部分,是助你精通Python语言的不二之选。” ——朱雷(@piglei),腾讯公司高级工程师 《Python工匠:案例、技巧与工程实践》作者
返回顶部