失效链接处理 |
流畅的Python(第2版) PDF 下载
下载地址:
版权归出版社和原作者所有,链接已删除,请购买正版
用户下载说明:
电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍:
https://product.dangdang.com/11417187647.html
相关截图: 资料简介: 本书是Python领域备受推崇的经典作品,致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,写出简洁、流畅、易读、易维护,并且地道的Python代码。本书着重讲解Python语言所独有的功能,助你成功进阶为Python高手。第2版与时俱进,教你跳出旧有经验,探索并运用地道的Python3功能。第2版主体内容分为五部分:数据结构、函数即对象、类和协议、控制流、元编程。每一部分都精彩纷呈,通过丰富的示例和细致的讲解,教你充分利用Python特性,写出有效且现代的Python3代码。对于所有想提升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 |