欢迎来到巨蟒学徒!本书的目标是为您提供实用而全面的 Python 编程语言介绍,为您提供成为几乎所有 Python 项目的高效成员所需的工具和见解。Python 是一种大型语言,我们并不打算在本书中涵盖所有需要了解的内容。相反,我们希望帮助您建立坚实的基础,让您了解有时令人困惑的 Python 世界,并让您能够指导自己的继续学习。
这本书主要是针对那些有使用另一种语言编程经验的人。如果你现在正在编程的任何主流的命令式或面向对象语言,如 C++,C 语言,或 java,那么你将有你需要的背景,以获得最大的这本书。如果您在其他类型的语言方面有经验——例如,函数式语言或基于角色的语言——那么您可能会有一个更陡峭的 Python 学习曲线,但您不会遇到任何严重的困难。大多数程序员发现 Python 非常平易近人和直观,只要稍加练习,他们就会很快适应它。
另一方面,如果你没有任何编程经验,这本书可能有点让人望而生畏。您不仅将学习一种编程语言,还将同时学习所有语言共有的许多主题和问题。公平地说,我们没有花太多时间来解释这些“假定知识”领域。**这并不意味着你不能从这本书中学习!**这只是意味着你可能需要更加努力地工作,多读几节,也许还需要从其他人那里得到指导。不过,这一努力的回报是,您将开始培养学习其他语言的知识和本能,这是专业程序员的一项关键技能。
在第一章中,我们将快速浏览 Python 语言。我们将介绍 Python 是什么(提示:它不仅仅是一种语言!),看看它是如何开发的,现在仍然是如何开发的,并了解是什么使它如此吸引如此多的程序员。我们还将简要介绍本书其余部分的结构。
首先,Python 有什么伟大之处?你为什么想学它?这些问题有很多很好的答案。一是 Python 功能强大。Python 语言富于表现力和生产力,它附带了一个伟大的标准库,它是庞大的第三方库的中心。使用 Python,您可以构建从简单脚本到复杂应用程序的所有内容,您可以快速、安全地完成,并且可以使用比您可能想象的更少的代码行完成。
但这只是 Python 伟大之处的一部分。另一个原因是 Python 非常开放。它是开源的,所以如果你愿意,你可以了解它的各个方面。同时,Python 非常受欢迎,并且有一个很棒的社区在你遇到麻烦时支持你。这种开放性和庞大用户群的结合意味着几乎任何人——从普通程序员到专业软件开发人员——都可以在他们需要的级别上使用这种语言。
大型用户群的另一个好处是 Python 正在越来越多的地方出现。您可能想学习 Python 只是因为它是您想使用的某种技术的语言,这并不奇怪——世界上许多最流行的 web 和科学软件包都是用 Python 编写的。
但对于许多人来说,这些原因让我们回到更重要的事情上:Python 很有趣!Python 富有表现力、可读性强的风格、快速编辑和运行的开发周期以及“包含电池”的理念意味着您可以坐下来享受编写代码的乐趣,而不是与编译器和棘手的语法作斗争。Python 将与您一起成长。当您的 实验变成原型,原型变成产品时,Python 不仅使编写软件变得更容易,而且让人真正享受。
在 Randall Munroe 的中,“加入我们吧!编程再次充满乐趣!”
这本书包括 10 章(不包括这一章)。这两章是建立在彼此的基础上的,因此,除非您已经对 Python 有了一定的了解,否则您需要按照顺序遵循它们。我们将首先将 Python 安装到您的系统中,并对您进行一些指导。
然后我们将介绍语言元素、特性、习惯用法和库,所有这些都是由您能够随文本一起构建的工作示例驱动的。我们坚信,通过实践而不仅仅是阅读,你会学到更多,因此我们鼓励你自己运行这些示例。
在本书的结尾,您将了解 Python 语言的基础知识。您还将了解如何使用第三方库,并了解自己开发这些库的基础知识。我们甚至还将介绍测试的基础知识,以便您能够确保和维护所开发代码的质量。
各章内容如下:
-
**入门:**我们将完成 Python 的安装,了解一些基本的 Python 工具,并介绍语言和语法的核心元素。
-
**字符串和集合:**我们研究一些基本的复杂数据类型:字符串、字节序列、列表和字典。
-
**模块性:**我们来看看 Python 用于构建代码的工具,比如函数和模块。
-
**内置类型和对象模型:**我们详细研究了 Python 的类型系统和对象系统,对 Python 的引用语义有了很强的理解。
-
**探索内置集合类型:**我们将更深入地讨论一些 Python 集合类型,并介绍一些其他类型。
-
**异常:**我们了解 Python 的异常处理系统以及异常在语言中扮演的核心角色。
-
**理解、iterables 和生成器:**我们探索 Python 优雅、普遍且强大的面向序列的部分,如理解和生成器函数。
-
**用类定义新类型:**我们将介绍如何使用类来支持面向对象编程,在 Python 中开发自己的复杂数据类型。
-
**文件和资源管理:**我们了解如何在 Python 中使用文件,并介绍 Python 用于资源管理的工具。
-
**使用 Python 标准库进行单元测试:**我们向您展示了如何使用 Python 的 unittest 包来生成无缺陷代码,并按照预期工作。
那么什么是 Python?简而言之,Python 是一种编程语言。它最初是由 Guido van Rossum 于 20 世纪 80 年代末在荷兰开发的。Guido 继续积极参与指导语言的发展和演变,以至于他被授予了“终身仁慈独裁者”的称号,或者更常见的称号,即BDFL。Python 是作为一个开源项目开发的,可以免费下载和使用。非营利的 Python 软件基金会 Ty3T3 管理 Python 的知识产权,在促进语言方面起到了很强的作用,并且在某些情况下资助了它的发展。
在技术层面上,Python 是一种强类型语言。这意味着语言中的每一个对象都有一个确定的类型,通常没有办法绕过该类型。同时,Python 是动态类型的,这意味着在运行代码之前不需要对代码进行类型检查。这与静态类型语言(如 C++或 java)相反,编译器在这里为你做了很多类型检查,拒绝了滥用对象的程序。最终,Python 类型系统的最佳描述是,它使用duck 类型,其中对象对上下文的适用性仅在运行时确定。我们将在第 8 章用类定义新类型中更详细地介绍这一点。
Python 是一种通用编程语言。它不打算在任何特定领域或环境中使用,而是可以有效地用于各种各样的任务。当然,在某些领域,Python 不如其他语言适用——例如在对时间极其敏感或内存受限的环境中——但在大多数情况下,Python 与许多现代编程语言一样灵活,适应性也一样强,甚至比大多数语言都强。
Python 是一种解释语言。从技术上讲,这是一个有点错误的说法,因为 Python在执行之前通常被编译成字节码的形式。然而,这种编译是无形的,使用 Python 的经验通常是在没有明显编译阶段的情况下立即执行代码。编辑和运行之间没有中断是使用 Python 的最大乐趣之一。
Python 的语法设计为清晰、可读和表达。与许多流行语言不同,Python 使用空格来分隔代码块,并在这个过程中消除了大量不必要的括号,同时实现了通用布局。这意味着所有 Python 代码在重要方面都很相似,您可以很快学会阅读 Python。同时,Python 富有表现力的语法意味着您可以在一行代码中获得很多含义。这种表现力强、可读性强的代码意味着 Python 维护相对容易。
Python 语言有多种实现。最初的——也是迄今为止最常见的——实现是用 C 编写的。这个版本通常被称为CPython。当有人谈论“运行 Python”时,通常可以安全地假设他们谈论的是 CPython,这就是我们将在本书中使用的实现。
Python 的其他实现包括:
-
Jython,针对 Java 虚拟机编写
-
IronPython,针对.NET 平台编写
-
PyPy,用一种称为 RPython 的语言编写(有点循环),该语言是为开发动态语言(如 Python)而设计的
这些实现通常落后于 CPython,后者被认为是该语言的“标准”。您将在本书中学到的许多内容将应用于所有这些实现。
目前常用的 Python 语言有两个重要版本: Python 2 和 Python 3。这两个版本代表了语言的一些关键元素 的变化,为其中一个编写的代码通常不会为另一个工作,除非您采取特殊的预防措施。Python2 比 Python3 更老、更成熟,但 Python3 解决了旧版本中的一些已知缺点。Python3 是 Python 的明确未来,如果可能的话,您应该使用它。
虽然 Python2 和 Python3 之间有一些关键的区别,但这两个版本的大多数基本原理是相同的。如果你学会了其中一个,你所知道的大部分知识都会清晰地传递给另一个。在本书中,我们将教授 Python3,但必要时我们将指出两个版本之间的重要差异。
除了作为一种编程语言,Python 还提供了一个强大而广泛的标准库。Python 哲学的一部分是“包括电池”,这意味着您可以将 Python 用于许多复杂的、现实世界的现成任务,而无需安装第三方软件包。这不仅非常方便,而且意味着 通过使用有趣的、引人入胜的示例开始学习 Python 更容易——这是我们在本书中的目标!
“包含电池”方法的另一个巨大影响是,它意味着许多脚本——即使是不常见的脚本——可以在任何 Python 安装上立即运行。这消除了一个常见的,恼人的障碍,安装软件,你可以面对与其他语言。
标准库通常具有高水平的良好文档。API 有很好的文档记录,模块通常有很好的叙述性描述,包括快速入门指南、最佳实践信息等。标准库文档始终在线提供,如果您愿意,也可以在本地安装。
由于标准库是 Python 非常重要的一部分,因此本书将介绍其中的部分内容。即使如此,我们也不会涵盖其中的一小部分,因此我们鼓励您自行探索。
最后,对 Python 的任何描述都不能完全提到,对许多人来说,Python 代表了编写代码的哲学。清晰性和可读性原则是编写正确或pythonic代码的一部分。并非总是很清楚pythonic在所有情况下的含义,有时可能没有一种正确的 方式来写东西。但是 Python 社区关心的是简单性、可读性和明确性等问题,这意味着 Python 代码往往更…好吧…漂亮!
Python 的许多原则都体现在所谓的 Python 的禅中。“禅”不是一套硬性的规则,而是一套在编码时要牢记的准则或试金石。当你发现自己试图在几条行动路线之间做出决定时,这些原则通常会给你一个正确的方向。在本书中,我们将重点介绍“Python 禅宗”中的元素。
我们认为 Python 是一种很棒的语言,我们很高兴能帮助您开始使用它。当您读完这本书时,您将能够编写大量 Python 程序,并且能够阅读更复杂的程序。更重要的是,你将有必要走出去发现所有高级语言中的主题,希望我们能让你对 Python 真正兴奋不已。Python 是一种大型语言,内置和围绕着它的是一个巨大的软件生态系统,发现它所能提供的一切可能是一次真正的冒险。
欢迎来到 Python!
尽管越来越多的项目开始“主要是 Python 3”甚至“仅限于 Python 3”。
这本书是以迂回的方式写成的。2013 年,当我们将总部位于挪威的软件咨询和培训业务北六十合并时,在线视频培训材料出版商Pluralsight邀请我们为快速增长的 MOOC 市场制作 Python 培训视频。当时,我们没有制作视频培训材料的经验,但我们确信我们希望仔细地构建介绍性 Python 内容,以尊重某些约束。例如,我们想要绝对最小的转发引用,因为这对我们的观众来说非常不方便。我们都是言辞丰富的人,都遵循图灵奖得主莱斯利·兰波特(Leslie Lamport)的格言“如果你在思考而不写作,那么你只会认为你在思考”,因此我们很自然地会先写一个脚本来攻击视频课程制作。
很快,我们的在线视频课程由Pluralsight以Python 基础的形式编写、录制并发布,获得了持续多年的巨大好评。从最早的时候起,我们就认为脚本可以构成一本书的基础,尽管可以公平地说,我们低估了将内容从一本好的脚本转换成一本更好的书所需的努力。
Python 学徒就是这种转变的结果。它既可以作为单独的 Python 教程使用,也可以作为我们视频课程的配套卷,具体取决于哪种学习方式最适合您。Python 学徒是三本书三部曲中的第一本,另外包括Python 熟练工和Python 大师.后面的两本书对应于我们随后的Pluralsight课程Python–超越基础和高级 Python(即将推出!)。
本书中的所有材料都经过了彻底的审查和测试;尽管如此,不可避免地会出现一些错误。如果您发现了一个错误,如果您能通过LeanpubPython 学徒讨论页面通知我们,我们将不胜感激,这样我们就可以修改并部署新版本。
本书中的代码示例显示在 lucida 控制台文本中:
>>> def square(x):
... return x * x
...我们的一些示例显示保存在文件中的代码,而其他示例(如上面的示例)则来自交互式 Python 会话。在这种交互式的情况下,我们包括 Python 会话中的提示,例如三箭头>>>和三点...提示。您不需要键入这些箭头或点。同样,对于操作系统外壳命令,我们将在 Linux、macOS 和其他 Unix 上使用美元提示$,或者在特定操作系统对手头任务不重要的情况下:
$ python3 words.py在本例中,您不需要键入$字符。
对于 Windows 特定命令,我们将使用前导的大于提示:
> python words.py同样,不需要输入>字符。对于需要放置在文件中而不是以交互方式输入的代码块,我们在不显示任何前导提示的情况下显示代码:
def write_sequence(filename, num):
"""Write Recaman's sequence to a text file."""
with open(filename, mode='wt', encoding='utf-8') as f:
f.writelines("{0}\n".format(r)
for r in islice(sequence(), num + 1))我们一直在努力确保我们的代码行足够短,以便每一行逻辑代码都对应于您的书中的一行物理代码。然而,在不同的设备上发布电子书的变幻莫测,以及偶尔需要很长的代码行,这意味着我们不能保证这些代码行不会自动换行。然而,我们可以保证的是,在换行的地方,出版商在最后一列中插入了反斜杠字符\。您需要根据自己的判断来确定此字符是否为代码的合法部分,或者是否已由电子书平台添加。
>>> print("This is a single line of code which is very long. Too long, in fact, to fit on a single physical line of code in the book.")如果您在上面引用的字符串中的行尾看到反斜杠,则它不是代码的部分,不应输入。
偶尔,我们会对代码行进行编号,以便在接下来的叙述中轻松地引用它们。这些行号不应作为代码的一部分输入。编号的代码块如下所示:
def write_grayscale(filename, pixels):
height = len(pixels)
width = len(pixels[0])
with open(filename, 'wb') as bmp:
# BMP Header
bmp.write(b'BM')
# The next four bytes hold the filesize as a 32-bit
# little-endian integer. Zero placeholder for now.
size_bookmark = bmp.tell()
bmp.write(b'\x00\x00\x00\x00')有时我们需要提供不完整的代码片段。通常,这是为了简洁起见,我们将代码添加到现有块中,并且希望在不重复块的所有现有内容的情况下明确块结构。在这种情况下,我们使用包含三个点的 Python 注释# ...来表示省略的代码:
class Flight:
# ...
def make_boarding_cards(self, card_printer):
for passenger, seat in sorted(self._passenger_seats()):
card_printer(passenger, seat, self.number(),
self.aircraft_model())这里暗示在make_boarding_cards()函数之前的Flight类块中已经存在一些其他代码。
最后,在本书的文本中,当我们提到一个标识符时,它也是一个函数,我们将使用带有空括号的标识符,就像我们在上一段中对make_boarding_cards()所做的那样。
您可以从您的帐户下载本书的示例代码文件 http://www.packtpub.com 。如果您在其他地方购买了本书,您可以访问http://www.packtpub.com/support 并注册,将文件直接通过电子邮件发送给您。
您可以通过以下步骤下载代码文件:
- 使用您的电子邮件地址和密码登录或注册我们的网站。
- 将鼠标指针悬停在顶部的“支持”选项卡上。
- 点击代码下载和勘误表。
- 在搜索框中输入图书的名称。
- 选择要下载代码文件的书籍。
- 从您购买本书的下拉菜单中选择。
- 点击代码下载。
下载文件后,请确保使用以下最新版本解压或解压缩文件夹:
- WinRAR/7-Zip for Windows
- 适用于 Mac 的 Zipeg/iZip/UnRarX
- 适用于 Linux 的 7-Zip/PeaZip
该书的代码包也托管在 GitHub 上的https://github.com/PacktPublishing/The-Python-Apprentice 。我们在上还提供了丰富的书籍和视频目录中的其他代码包 https://github.com/PacktPublishing/ 。看看他们!
我们还为您提供了一个 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图像。彩色图像将帮助您更好地了解输出中的更改。您可以从下载此文件 https://www.packtpub.com/sites/default/files/downloads/ThePythonApprentice_ColorImages.pdf 。