Python⾼级编程(第2版)
内容简介
Python 作为⼀种⾼级程序设计语⾔,凭借其简洁、易读及可扩展性⽇渐成为程序设计领域备受推崇的语⾔之⼀。
本书基于 Python 3.5 版本进⾏讲解,深度揭⽰了 Python 编程的⾼级技巧。本书从 Python 语⾔及其社区的现状开始介绍,对 Python
语法、命名规则、Python 包的编写、部署代码、扩展程序开发、管理代码、⽂档编写、测试开发、代码优化、并发编程、设计模式等重要话题进⾏了全⾯系统化的讲解。
本书适合想要进⼀步提⾼⾃⾝ Python 编程技能的读者阅读,也适合对 Python 编程感兴趣的读者参考学习。全书结合典型且实⽤的开发案例,可以帮助读者创建⾼性能的、可靠且可维护的 Python 应⽤。
作者简介
Michał Jaworski 有着7年 Python 编程的经验。他还是 graceful 的创建者,这是⼀个构建于 falcon 之上的 REST 框架。他曾在不同的公司担任过多种⾓⾊,从⼀名普通的全栈开发⼈员到软件架构师再到
⼀家快节奏创业公司的⼯程副总裁。他⽬前是 Opera 软件公司 TV Store(电视应⽤商店)团队的⾸-席后端⼯程师。他在设计⾼性能的分布式服务⽅⾯拥有丰富的经验。他还是⼀些流⾏的 Python 开源项⽬的活跃贡献者。
Tarek Ziade是 Mozilla 的⼯程经理,与⼀个专门⽤ Python 为 Firefox 构建⼤规模 Web 应⽤的团队合作。他对 Python 打包做出过贡献,⽽且从早期 Zope 开始就使⽤过各种不同的 Python Web 框架。
本书内容
前⾔
Python 很棒!
从20世纪80年代末出现的最早版本到当前版本,Python 的发展⼀直遵循着相同的理念:提供⼀个同时具备可读性和⽣产⼒的多范式编程语⾔。
⼈们曾经将 Python 看作另⼀种脚本语⾔,认为它不适合构建⼤型系统。但多年以来,在⼀些先驱公司的努⼒下,Python 显然可以⽤于构建⼏乎任何类型的系统。
实际上,许多其他语⾔的开发者也醉⼼于 Python,并将它作为⾸选语⾔。
如果你购买了这本书,可能已经知道这些内容了,所以⽆需再向你证明这门语⾔的优点。
本书展现了作者多年构建各种 Python 应⽤的经验,从⼏个⼩时完成的⼩型系统脚本,到许多开发⼈员历经数年编写的⼤型应⽤。
本书描述了开发⼈员使⽤ Python 的最佳实践。
本书包含了⼀些主题,这些主题并不关注语⾔本⾝,⽽是更多地关注如何利⽤相关的⼯具和技术。
换句话说,本书描述了⾼级 Python 开发⼈员每天的⼯作⽅式。
本书内容
第1章介绍了 Python 语⾔及其社区的现状。本章展⽰了 Python 不断变化的⽅式及原因,还解释了为什么这些事实对任何想要⾃称Python 专家的⼈来说是很重要的。本章还介绍了最流⾏和最公认的 Python ⼯作⽅式——常⽤的⽣产⼒⼯具和现已成为标准的约定。
第2章深⼊介绍迭代器、⽣成器、描述符等内容。本章还包括关于 Python 习语和 CPython 类型内部实现的有⽤注释,这些类型的计算复杂度是对这些习语的阐释。
第3章介绍了语法最佳实践,但重点放在类级别以上。本章包括 Python 中更⾼级的⾯向对象的概念和机制。学习这些知识是为了理解本章最后⼀节的内容,其中介绍的是 Python 元编程的各种⽅法。
第4章介绍了如何选择好的名称。它是对 PEP 8 中命名最佳实践的扩展,并且给出了⼀些如何设计良好 API 的提⽰。
第5章介绍如何创建 Python 包以及使⽤哪些⼯具,以便在官⽅的 Python 包索引或其他包仓库中正确地分发。对于 Python 包还补充了⼀些⼯具的简要回顾,这些⼯具可以让你⽤ Python 源代码创建独⽴可执⾏⽂件。
第6章主要针对 Python Web 开发⼈员和后端⼯程师,因为讲的是代码部署。本章解释了如何构建 Python 应⽤,使其可以轻松部署到远
程服务器,还介绍了可以将这个过程⾃动化的⼯具。本章是第5章的延续,因此还介绍了如何使⽤包和私有包仓库来简化应⽤部署。
第7章解释了为什么为 Python 编写 C 扩展程序有时可能是⼀个好的解决⽅案。本章还展⽰了只要使⽤了正确的⼯具,它并不像想象中那么难。
第8章深⼊介绍了项⽬代码库的管理⽅式,还介绍了如何设置各种持续开发流程。
第9章包含⽂档相关的内容,提供了有关技术写作和 Python 项⽬⽂档化⽅式的建议。
第10章解释了测试驱动开发的基本原理,还介绍了可⽤于这种开发⽅法的⼯具。
第11章解释了何为优化,介绍了分析技术和优化策略指南。
第12章是对第11章的扩展,为 Python 程序中经常出现的性能问题提供了⼀些常⽤的解决⽅案。
第13章介绍了 Python 并发这⼀宏⼤的主题。本章解释了并发的概念、何时需要编写并发应⽤,以及 Python 程序员主要使⽤的并发⽅
法。
第14章⽤⼀套有⽤的设计模式以及 Python 的代码⽰例对本书进⾏了总结。
阅读本书的前提
本书⾯向的是可以在任何操作系统上使⽤ Python 3 进⾏软件开发的⼈员。
这不是⼀本⾯向初学者的书,所以我假设你已经在开发环境中安装了 Python,或者知道如何安装 Python。不管怎样,本书考虑到以下事实:不是每个⼈都需要充分了解 Python 的最新功能或官⽅推
荐的⼯具。因此,第1章概述了常见的实⽤程序(例如虚拟环境和 pip),这
编程scratch网站些实⽤程序现在已经成为 Python 专业开发⼈员的标准⼯具。
⽬标读者
本书⾯向的是想要进⼀步掌握 Python 的开发⼈员。开发⼈员主要指的是专业⼈⼠,即⽤ Python 编写软件的程序员。这是因为本书主要侧重于⼯具和实践,它们对于创建⾼性能的、可靠且可维护的 Python 软件⾄关重要。
这并不意味着业余爱好者⽆法从本书中发现有趣的内容。对于任何对学习 Python ⾼级概念感兴趣的⼈来说,本书都是很棒的。任何具备Python 基本技能的⼈都应该能够读懂本书的内容,虽然经验不⾜的程序员可能需要⼀些额外的努⼒。对于有点落后仍在继续使⽤ Python 2.7 或更⽼版本的⼈来说,本书也是对 Python 3.5 的全⾯介绍。
最后,从阅读本书中受益最多的⼈应该是 Web 开发者和后端⼯程师。这是因为本书重点介绍了在他们的⼯作领域中特别重要的两个主题:可靠的代码部署与并发。源代码删除兑换码
本书约定
二叉树实验报告
本书⽤多种⽂本样式来区分不同种类的信息。下⾯是这些样式的⽰例及其含义解释。
python编程基础电子版⽂本中的代码、数据库表的名称、⽂件夹名称、⽂件名称、⽂件扩展名、路径名称、虚拟 URL、⽤户输⼊和 Twitter 句柄的格式如下所
⽰:“利⽤de(encoding, errors)⽅法,⽤注册编解码器对字符串进⾏编码。”
代码块的格式如下所⽰:
[print("hello world")print "goodbye python2"
如果我们想让你将注意⼒集中在代码块的特定区域,相关的⼏⾏或⼏项将会被设成粗体,如下所⽰:
cdef long long fibonacci_cc(unsigned int n) nogil:    if n < 2:        return n    else:        return fibonacci_cc(n - 1) + fibonacci_cc(n - 2)
命令⾏的输⼊或输出如下所⽰:
$ pip show pip---Metadata-Version: 2.0Name: pipVersion: 7.1.2Summary: The PyPA recommended tool for installing Python packages.Home-page: https:/
新术语和重要词语将以粗体显⽰。你会在屏幕上看到的单词(例如在菜单或对话框中)将以下⾯这种⽂本形式出现:“单击 Next 按钮可跳转⾄下⼀屏”。
读者反馈
我们⼗分欢迎读者的反馈意见。让我们了解你对本书的看法——喜欢哪些内容,不喜欢哪些内容。这些反馈对我们很重要,因为它有助于我们编写出对读者真正有帮助的书。
⼀般性的反馈请发送邮件⾄ feedback@packtpub,并在邮件主题中注明本书的标题。
如果你是某个领域的专家,并且有兴趣写⼀本书或者参与出版⼀本书,请参阅我们的作者指南。
客户⽀持概率论伽马函数的使用
现在你已经成为这本 Packt 图书的拥有者,为了让你的购买物超所值,我们还为你提供了许多其他⽅⾯的服务。
下载⽰例代码
你可以⽤⾃⼰的账号在 Packt 的官⽅⽹站下载本书的⽰例代码⽂件。如果你是在其他地⽅购买的本书,可以访问 Packt 的官⽅⽹站并注册,⽂件会直接通过邮件发送给你。
下载代码⽂件的步骤如下所⽰。
正规数据分析师培训机构
⽤你的电⼦邮件地址和密码登录或注册我们的⽹站。
将⿏标指针悬停在顶部的 SUPPORT 选项卡上。
单击 Code Downloads & Errata。
在 Search 框中输⼊本书的名字。
选择你要下载代码⽂件的书籍。
从下拉菜单中选择本书的购买途径。
单击 Code Download。
你还可以在Packt⽹站的本书页⾯单击 Code Files 按钮来下载代码⽂件。在 Search 框输⼊本书的书名即可访问该页⾯。请注意,你需要登录 Packt 账号。
⽂件下载完成后,请确保⽤下列软件的最新版本对⽂件夹进⾏解压或提取。
在 Windows 上⽤ WinRAR 或 7-Zip。
在 Mac 上⽤ Zipeg、iZip 或 UnRarX。
在 Linux 上⽤ 7-Zip 或 PeaZip。
本书的代码包也托管在 。在 GitHub 上还有⼤量图书和视频资源。快去看⼀下吧!
勘误
尽管我们已经竭尽全⼒确保本书内容的准确性,但错误在所难免。如果你发现了书中的错误,⽆论是正⽂错误还是代码错误,希望你能将其报告给我们,我们将不胜感激。这样不仅能够减少其他读者的困惑,还能帮助我们改进本书后续版本的质量。如果你需要提交勘误,请访问,选择相应的书名,单击 Errata Submission Form 链接,然后输⼊你的勘误信息并提交。⼀旦通过验证,我们将接受你提交的勘误,同时勘误内容也将被上传到我们的⽹站,或者被添加到对应勘误区的现有勘误列表中。
想要查看之前提交的勘误,请访问 ,并在搜索框中输⼊相应的书名。你想查看的信息将出现在 Errata 下⾯。
侵权⾏为
所有媒体在互联⽹上都⼀直饱受版权侵害的困扰。Packt 坚持对版权和授权进⾏全⼒保护。如果你在互联⽹上发现我社图书任何形式的盗版,请⽴即为我们提供⽹址或⽹站名称,以便我们采取进⼀步的措施。
请将疑似盗版材料的链接发送到 copyright@packtpub。
我们感谢你对作者的保护,这有助于我们继续为你提供更有价值的内容。
疑难解答
如果你对本书的某个⽅⾯抱有疑问,请通过 questions@packtpub ,我们会尽⼒为你解决。
第01章:Python 现状(上)
Python 很适合开发者使⽤。
⽆论你或你的客户⽤的是什么操作系统,都可以使⽤ Python。例如你可以在 Linux 上⼯作,然后部署到其他系统上,除⾮你的代码与特定平台相关,或者⽤到了特定平台的库。但这⼀特性已经不新鲜了(Ruby、Java 等很多其他语⾔都可以做到这⼀点)。本书还会讲到Python 的其他特性,所有这些特性是使得 Python 成为⼀家公司主⼒开发语⾔的重要原因。
本书主要讲的是 Python 的 3.5 版本,如果没有明确说明的话,书中所有代码⽰例都是⽤这个版本的 Python 编写的。由于这⼀版本尚未被⼴泛使⽤,本章将会向读者介绍⼀下 Python 3 的当前现状,同时介绍 Python 的现代开发⽅法。本章主要包括以下内容。
如何保持 Python 2 和 Python 3 之间的兼容性。
为了开发的顺利进⾏,在应⽤层⾯和操作系统层⾯如何解决开发环境隔离的问题。
如何增强 Python 提⽰符的功能。
如何使⽤ pip 安装 Python 包。
每本书的开头都要来点开胃⼩菜。如果你对 Python 已经很熟悉了(特别是最新的 3.x 版本),并且掌握了开发中做环境隔离的正确⽅法,你可以跳过本章的前两节,快速阅读其他⼩节即可。其他⼩节会讲到⼀些⼯具和资源,它们并⾮必不可少,但可以⼤⼤提⾼ Python 开发效率。不过⼀定要读⼀下关于应⽤层环境隔离和 pip 的⼀节,因为这⼀节提到的⼯具会在本书后⾯的内容中⽤到。
1.1 Python 的现状与未来
Python 的历史最早可追溯到20世纪80年代末,但是1.0版的发⾏时间是在1994年,所以 Python 并不是⼀门⾮常年轻的语⾔。这⾥本该介绍 Python 主要版本发布的整个时间线,但其实真正重要的⽇期只有⼀个:2008年12⽉3⽇,也就是 Python 3.0 的发布⽇期。
在写作本书时,Python 3 的⾸次发布已经过去了7年。PEP 404 也已经创建了4年,PEP 404 是“取消
发布"(un-release)Python 2.8 并正式关闭 Python 2.x 分⽀的官⽅⽂档。虽然过去了这么长的时间,Python 社区中依然存在明显的分歧。语⾔本⾝在迅速发展,但⼤量⽤户却并不想更新版本。
1.2 Python 升级及其原因
原因很简单。Python 升级是因为有这样的需求。语⾔之间的竞争随时都在上演。每隔⼏个⽉都会突然冒出⼀门新语⾔,声称解决了之前所有语⾔中存在的问题。对于⼤多数类似的项⽬,开发⼈员很快就会失去兴趣,它们的名⽓也只是⼀时炒作。
不管怎样,这也表⽰存在着更严重的问题。⼈们之所以设计新的编程语⾔,是因为他们发现现有的语⾔⽆法以最佳⽅式来解决问题。认识不到这样的需求是⽬光短浅的。此外,Python 的使⽤范围也越来越⼴泛,⼈们发现它有许多可以改进的地⽅,也应该做出这样的改进。
Python 的很多改进往往是由特定应⽤领域的需求驱动的。其中最重要的领域是 Web 开发,这⼀领域需要 Python 改进对并发的处理。
有些变化只是由于 Python 项⽬的历史原因导致的。这些年已经发现了 Python 的⼀些不合理之处,有些是标准库模块结构混乱或冗余,有些是程序设计缺陷。最初,发布 Python 3 是要对这门语⾔进⾏较⼤的清理与更新,但结果显⽰,这个计划并没有收到预期的效果。在很长⼀段时间内,很多开发⼈员对 Python 3 只是抱着好奇的态度⽽已,但希望这种情形正在好转。
1.3 追踪 Python 最新变化——PEP ⽂档
Python 社区有⼀种应对变化的固定⽅法。虽然各种各样的 Python 语⾔修改意见主要在邮件列表()中进⾏讨论,但只有发布了名为 PEP 的新⽂档,新的变化才会⽣效。PEP 的全称是 Python 改进提案(Python Enhancement
Proposal,PEP)。它是提交 Python 变化的书⾯⽂档,也是社区对这⼀变化进⾏讨论的出发点。这些⽂档的整个⽬的、格式和⼯作流程的标准格式也都包含在⼀份 Python 改进提案中,也就是 。
PEP ⽂档对 Python 的作⽤⼗分重要,根据讨论的主题,PEP 主要有以下3种⽤途。
通知:汇总 Python 核⼼开发者需要的信息,并通知 Python 发布⽇程。
标准化:提供代码风格、⽂档或其他指导意见。
设计:对提交的功能进⾏说明。
所有提交过的 PEP 都被汇总在⼀个⽂档中,就是 。由于这些 PEP 都在同⼀个⽹站上很容易到,其 URL 也很容易猜到,因此本书⼀般⽤编号来指代这些⽂档。
如果你对 Python 语⾔的未来发展⽅向感兴趣,但⼜没时间跟踪 Python 邮件列表中的讨论,那么 PEP 0 会是很好的信息来源。它会告诉你,哪些⽂档已被接受但尚未实施,哪些⽂档仍在审议中。
PEP还有其他的⽤途。⼈们通常会问这样的问题:
A 功能为什么要以这样的⽅式运⾏?
Python 为什么没有B功能?
⼤多数情况下,关于该功能的某个 PEP ⽂档已经给出了上述问题的详细回答。很多提交的关于 Python 语⾔功能的 PEP ⽂档并没有通过。这些⽂档可作为历史资料来参考。
1.4 当前 Python 3 的普及程度
Python 3 有许多强⼤的新功能,那么它在社区中⼴泛普及了吗?遗憾的是,并没有。有⼀个著名的⽹站叫“Python 3 荣耀之墙(Python 3 Wall of Superpowers)”,⾥⾯记录了⼤多数常⽤软件包与 Python 3 的兼容性,不久前这个⽹站刚刚改名为“Python 3 耻辱之墙(Python 3 Wall of Shame)”。⽬前这种状况正在逐步改善,上述⽹站的软件包列表中绿⾊的⽐例也在每⽉缓慢增加 。尽管如此,但这并不代表很快所有应⽤开发团队都只使⽤ Python 3。当所有常⽤软件包都⽀持 Python 3 时,“我们所⽤的软件包还没有迁移到 Python 3”这⼀常⽤借⼝将不再适⽤。
造成⽬前这种状况的主要原因是,将现有应⽤从 Python 2 迁移到 Python 3 上总是⼀项不⼩的挑战。像2to3之类的⼯具可以进⾏代码⾃动转换,但⽆法保证转换后的代码100%正确。⽽且,如果不做⼈⼯修改的话,转换后的代码性能可能不如转换前。将现有的复杂代码库迁移到 Python 3 上可能需要付出巨⼤的精⼒和成本,某些公司可能⽆法负担这些成本。但这些成本可以分割成⼩份来逐步完成。⼀些优秀的软件架构设计⽅法可以帮助其逐步实现这⼀⽬标,如⾯向服务的架构或者微服务。新的项⽬组件(服务或微服务)可以⽤新⽅法编写,现有的项⽬组件可以逐步迁移。
长远来看,将项⽬迁移到 Python 3 只有好处。根据 PEP-404 这份⽂档,Python 2.x 分⽀将不会发布2.8版本。⽽且未来所有重要的项⽬(如 Django、Flask 和 NumPy)可能都将放弃 2.x 的兼容性,仅⽀持 Python 3。
我个⼈对这个问题的观点可能会引发争议。我认为在创建新的软件包时,最好⿎励社区完全放弃⽀持 Python 2。当然,这⼀做法极⼤地限制了这些软件的适⽤范围,但对于那些坚持使⽤ Python 2.x 的⼈来说,这可能是改变他们想法的唯⼀⽅法。
1.5 Python 3 和 Python 2 的主要差异
前⾯已经说过,Python 3 打破了对 Python 2 的向后兼容。但它并不是完全重新设计的。⽽且,也并不是说 2.x 版本的 Python 模块在Python 3 下都⽆法运⾏。代码可以完全跨版本兼容,⽆需其他⼯具
或技术在两⼤版本上都可以运⾏,但⼀般只有简单应⽤才能做到这⼀点。
1.5.1 为什么要关注这些差异

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。