写给程序员的Python教程

978-7-115-50538-5
作者: [挪]罗伯特·斯莫尔希雷(Robert Smallshire)[美]奥斯汀·宾厄姆(Austin Bingham)
译者: 阿信
编辑: 武晓燕
分类: Python

图书目录:

详情

Python语言具有免费开源、简单易学、可移植性和解释性强、可扩展可嵌入等优点,在国内外都得到了广泛的应用。 本书基于Python 3的版本进行讲解。本书共有11章,由浅入深地讲解了Python的相关知识。本书从Python的安装开始讲起,对数据类型、函数、内置类型、集合类型、异常、生成器、文件和资源管理、单元测试等重要知识进行了系统化的讲解。

图书摘要

版权信息

书名:写给程序员的Python教程

ISBN:978-7-115-50538-5

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [挪] 罗伯特·斯莫尔希雷(Robert Smallshire)

     [美] 奥斯汀·宾厄姆(Austin Bingham)

译    阿 信

责任编辑 武晓燕

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Copyright © 2017 Packt Publishing. First published in the English language under the title The Python Apprentice, ISBN 978-1788293181. All rights reserved.

本书由英国Packt Publishing公司授权人民邮电出版社有限公司出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


Python语言具有免费开源、简单易学、可移植性和解释性强、可扩展可嵌入等优点,在国内外都得到了广泛的应用。

本书基于Python 3的版本进行讲解。本书共有11章,由浅入深地讲解了Python的相关知识。本书从Python的安装开始讲起,对数据类型、函数、内置类型、集合类型、异常、生成器、文件和资源管理、单元测试等重要知识进行了系统化的讲解。

本书适合想要进一步提高自身Python编程技能的读者阅读,也适合对Python编程感兴趣的读者参考学习。


罗伯特·斯莫尔希雷(Robert Smallshire)是Sixty North的创始人之一。Sixty North是挪威的一家软件咨询和培训公司,该公司服务于整个欧洲,并且该公司主要使用Python工作。Robert从事高级架构和技术管理方面的工作,曾为多家软件公司提供能源领域的工具。他对尖端科学和企业级软件有着深刻的理解,并且在这些领域设计、倡导并实现了高效的软件架构。他主要使用Python、C++、C#、F#以及JavaScript。Robert经常在技术大会、聚会和企业软件活动中发表演讲,而且主题多种多样,主要有软件开发中的行为微观经济学和在8位微控制器上实现Web服务等。他是奥斯陆Python小组的组织者,并且拥有自然科学的博士学位。

奥斯汀·宾厄姆(Austin Bingham)也是Sixty North的创始人之一。Austin出生于得克萨斯州,2008年移居挪威斯塔万格,在那里他使用C++和Python开发了业界领先的原油储藏建模软件。在此之前,他曾在美国国家仪器公司开发LabVIEW,在得克萨斯大学奥斯汀分校的应用研究实验室(Applied Research Labs)为美国海军和一些电信公司开发声呐系统。他是一位经验丰富的主持人和教师,曾在众多会议、软件组织和企业内部场所发表过演讲。Austin还是开源社区的活跃成员,定期为各种Python和Emacs项目贡献智慧。他还是斯塔万格软件开发联盟(Stavanger Software Developers)的创始人。斯塔万格软件开发联盟是斯塔万格最大、最活跃的社交软件开发组织之一。Austin拥有得克萨斯大学奥斯汀分校计算机工程硕士学位。


欢迎阅读本书!本书的目的是为你提供Python编程语言实用且深入的介绍,使你具备几乎所有Python项目中高效开发者所需的工具和洞察力。Python是一门内容丰富且精深的语言。本书不打算覆盖Python所有的知识。相反,本书希望帮助你打下扎实的基础,带你进入眼花缭乱的Python世界,并让你具备自我继续学习的能力。

本书主要适合那些使用其他语言编程的读者阅读。如果你目前正在使用C++、C#或Java等主流的命令式或面向对象的语言编程,那么你可以充分利用本书。如果你有其他类型语言的经验——例如函数式或基于ACTOR模型的语言,那么你的Python学习曲线可能有点陡峭,但是你不会遇到较大的困难。大多数程序员都认为Python非常通俗易懂,只需稍微练习一下就可以很快地熟悉它。

如果你没有任何编程经验,阅读本书可能会有点困难。通过本书,你不仅可以学习编程语言,还可以学习到许多语言的常见知识。公平起见,本书不会花很多时间来解释这些“假定知识”的领域。这并不意味着你无法学习本书!这只是意味着你可能需要更加努力,反复阅读一些章节,或者可能需要寻求他人的指导。然而,这些努力会让你有所收获,你将开始拥有掌握其他语言的技能,这是专业程序员的一项关键 技能。

在第1章中,我们将快速浏览Python语言。我们将介绍Python是什么(提示:它不仅仅是一门语言),了解它是如何工作的以及它是如何被开发的,并且感受一下它为什么吸引了如此多的程序员使用。我们还会简要介绍一下本书其余部分的结构。

Python的优势何在?为什么要学习它?这些问题已经有了很多好的答案。Python是强大的。Python语言具有很强的表现力和生产力,它自带了一套很棒的标准库,它也是庞大的第三方库世界的中心。使用Python,你可以构建很多内容,从简单的脚本到复杂的应用程序,你都可以快速地完成、安全地执行,并且代码的行数可能要比你想象中的要少。

但这仅仅是Python强大之处的一部分。Python是开源的,所以,只要你需要,你就可以了解它的每个方面。与此同时,Python也是非常受欢迎的。当你遇到麻烦时,Python有一个很好的社区来支持你。这种开放性和大型用户群的组合意味着几乎任何人——从业余程序员到专业软件开发人员,都可以在所需的层面上与语言交互。

得益于Python庞大的用户群,Python在越来越多的领域崭露头角。你可能正想要简单地了解一下Python,因为它是你想要使用的一些技术的编程语言。这并不奇怪,世界上许多流行的网络和科学软件包都是用Python编写的。

但是对于很多人来说,这些原因比很多重要的事情要优先:Python很有趣!Python的表现力、可读性、快速编辑和运行的开发周期以及“内置电池”的理念意味着你可以享受编写代码,而不必纠结于编译器和棘手的语法,并且Python会与你一起成长。随着你的实验成为原型,原型成为产品,Python使你编写软件的体验不仅是容易,你会真正地感到愉快。

用Randall Munroe的话来说:“加入我们!编程很有趣!”

本书共有11章。这些章节互相联系,所以除非你曾经接触过Python,否则你需要按照顺序进行阅读。本书将从指导你安装Python开始。

然后,本书将介绍语言元素、特性、惯用句法和库,所有这些都由可运行的示例驱动,你可以跟着本书一起构建。我们坚信,自己动手实践得到的收获远远大于单纯的阅读,因此我们鼓励你自己运行示例。

在本书的最后,你将了解Python语言的基础知识。你还将了解如何使用第三方库,并且你将了解自己开发第三方库所需要的基础知识。本书也会涵盖测试的基础知识,所以你可以确保并维护你所开发的代码的质量。

本书主要内容如下。

第1章,入门。我们将安装Python,了解一些基本的Python工具,同时本章也会涵盖语言和语法的核心元素。

第2章,字符串与集合类型。本章介绍了一些基本的数据类型:字符串、字节序列、列表和字典。

第3章,模块化。本章讲解Python中用于组织代码的工具,如函数和模块。

第4章,内置类型和对象模型。在本章,我们将详细学习Python的类型系统和对象系统,还将深入介绍Python的引用语义。

第5章,探究内置集合类型。在本章,我们将深入了解一些Python集合类型,并且会介绍一些相关内容。

第6章,异常。在本章,我们将学习Python的异常处理系统以及异常在语言中的核心作用。

第7章,推导、可迭代与生成器。在本章,我们将探索Python中优雅、普遍且强大的面向序列的部分内容,如推导和生成器函数。

第8章,使用类定义新类型。本章将讲解如何使用类来开发你自己的复杂数据类型,以支持面向对象编程。

第9章,文件和资源管理。在本章,我们将了解如何在Python中操作文件,并将介绍Python中的资源管理的工具。

第10章,使用Python库进行单元测试。在本章,我们将向你展示如何使用Python的unittest软件包编写符合预期的无缺陷代码。

第11章,使用PDB进行调试。在本章,我们将向你展示如何使用Python的PDB调试器来排查程序中出现的问题。

Python是什么呢?简单地说,Python是一门编程语言。它最初由Guido van Rossum于20世纪80年代末开发。Guido继续积极参与并指导了语言的发展和演变,以至于他获得了“仁慈的独裁者(Benevolent Dictator for Life,BDFL)”的称号。

Python是一个开源项目,你可以随意下载和使用。

非营利性Python软件基金会管理Python的知识产权,该组织在促进语言发展方面发挥着重要作用,并在某些情况下资助Python开发。

在技术层面上,Python是一门强类型的语言。这意味着语言中的每个对象都有一个确定的类型,通常没有办法规避该类型。同时,Python是动态类型的,这意味着在运行代码之前,程序员无须对代码进行类型检查。这与静态类型的语言(如C++或Java)相反,编译器为你进行了大量的类型检查,拒绝了滥用对象的程序。最终,Python使用鸭子类型,这是对Python类型系统的最贴切的描述,其中对象对上下文的适用性仅在运行时确定。我们将在第8章中更详细地介绍这一点。

Python是一门通用编程语言。它不受限于任何特定的域或环境,可以有效地用于各种各样的任务。当然还有一些领域,相比其他语言,Python不太适合,例如在极端的时间敏感或内存受限的环境中。但是在大多数情况下,Python与许多现代编程语言一样灵活且可适应,甚至比大多数语言可能还要更好。

Python是一门解释型语言。在技术上这样说可能有点错误,因为Python在执行之前通常被编译成特定格式的字节码。但是,这个编译是不可见的,在使用Python时,程序通常是立即执行代码,而没有明显的编译阶段。编辑和运行之间没有中断,是使用Python的好兆头之一。

Python的语法清晰、易读,并且富有表现力。与许多流行的语言不同,Python使用空格来分隔代码块,并且在执行通用布局的过程中,会消除不必要的括号。这意味着所有Python代码看起来都相似,你可以很快地学会阅读Python。与此同时,Python的表达式语法意味着你可以在单行代码中获得很多信息。这种富有表现力且高可读性的代码意味着Python代码的维护比较容易。

Python语言有多种实现。最初的并且仍然是最常见的实现是用C编写的。这个版本通常被称为CPython。当有人谈论“运行Python”时,可以基本确定他们是在讨论CPython,这也是我们将要在本书中使用的实现。

Python的其他实现:

这些实现通常落后于CPython,CPython被认为是Python语言的“标准”。在本书中你学到的大部分内容适用于所有这些实现。

现在,有两种重要的Python语言版本被使用:Python 2和Python 3。这两个版本代表了Python语言的一些关键元素的变化,而针对一个版本编写的代码通常不适用于另外一个版本,除非你采取了特殊的预防措施。Python 2比Python 3更古老、更成熟,但 Python 3解决了旧版本中的一些已知的缺点。Python 3是Python的明确未来,你应该尽可能地使用它。

虽然Python 2和Python 3之间存在一些关键的区别,但两个版本的大部分基本原理是一样的。如果你学习了一个版本,那么你所知道的大部分知识都适用于另一个版本。在本书中,我们将学习Python 3,但是我们会在必要时指出Python 2和Python 3之间的重要区别。

除了作为一种编程语言,Python还提供了一个功能强大且用途广泛的标准库。“内置电池(batteries included)”是Python哲学的一部分,这意味着你可以将Python立即用于现实世界中的许多复杂的任务,而无须安装第三方软件包。这不仅非常方便,而且意味着通过使用有趣的例子来开始学习Python是比较容易的——这也是本书的目标!

“内置电池”方法的另一个重要影响是,这意味着许多脚本甚至是一些复杂的脚本,都可以在任何安装了Python的系统上立即运行。这样可以清除一个常见的烦人障碍,即安装软件,你在使用其他语言时可能会面临这个问题。

标准库通常具有高水平的文档。这些API有很好的文档,并且模块通常具有良好的叙述性说明文档,包括快速入门指南、最佳实践信息等。网上也提供了标准库文档,如果你需要,也可以将它安装在本地。

由于标准库是Python的重要组成部分,我们将在本书中介绍其中的部分内容。本书仅仅是涉猎了其中的一小部分,我们鼓励你自己去进行探索。

最后,上面提到的那些关于Python的介绍都是不完整的,对许多人来说,Python代表了编写代码的哲学。清晰和易读的原则是编写正确或Python化的代码的一部分。Python社区关心的是简单性、可读性和明确性等问题,这意味着Python代码往往更加优雅!

许多Python的原则都体现在所谓的Python之禅中。“禅”不是一套硬性的规定,而是一组在编写代码时应该铭记于心的指南或者准则。当你发现自己试图在几个行动方案之间做出决定时,这些原则往往会给你一个正确的方向。我们将在本书中突出“Python之禅”中的元素。

Python是一门伟大的语言,我们很高兴能帮助你开始使用它。当你读完本书的时候,你将能够编写大量的Python程序,并且将能够阅读更复杂的Python程序。更重要的是,你将拥有牢固的Python基础,并了解该语言中的更高级的主题,希望本书能够真正做到让你对Python充满激情。Python是一门大型语言,其内置以及周边构成了庞大的软件生态系统,它提供了一场真正可以探索一切的冒险之旅。

欢迎来到Python!

现在,越来越多的项目在开发之初就支持Python3,甚至只支持Python3。

这本书的诞生之路有些曲折。2013年,当我们整合了挪威的软件咨询和培训业务的Sixty North公司时,我们受到Pluralsight(一家在线视频培训材料出版商)的邀请,为快速增长的MOOC市场制作Python培训视频。当时,我们没有制作视频培训材料的经验,但我们相信自己肯定能做好。考虑到某些限制,我们希望认真且谨慎地构思Python的介绍性内容。例如,我们希望只用很少的前向引用,因为这些对读者来说是非常不方便的。我们都深信图灵奖获得者Leslie Lamport的那句格言——“如果你只想不干,那你也仅仅是在空想”。因此,我们自然而然地首先为视频课程产品编写了一个脚本。

很快,我们编写、录制好了在线视频教程——Python基础,并且由Pluralsight发布,该课程持续多年广受好评。从一开始,我们就认定以这些脚本为基础可以编写出一本书,不过可以很公正地说,我们低估了将脚本中的内容转换成一本好书所需的努力。

本书就是转化的成果。它可以用作独立的Python教程,也可以作为我们的视频课程的辅助工具,这具体取决于最适合你的学习方式。本书是三部曲中的第一本,该系列还包括The Python JourneymanThe Python Master。后两本书对应于我们以后的Pluralsight课程Python–Beyond the Basics和Advanced Python。(即将推出!)

本书的全部内容已经经过了全面的检查和测试,尽管如此,有些错误可能也无法避免。如果你发现了错误,那你可以通过Leanpub网站上的本书的讨论页面告知我们,这样我们可以修改并部署新版本,对此,我们由衷地表示感谢。

本书中的代码示例以以下字体显示:

>>> def square(x):
...     return x * x
...

一些实例代码保存在文件中,其他的例如上面的代码来自于交互式Python会话。在这种交互的情况下,我们会包含Python会话中的提示,如三箭头>>>和三点…提示。你不需要键入这些箭头或点。同样,对于操作系统的shell命令,在Linux、macOS、类UNIX系统以及一些对于手头的任务不重要的特定操作系统上,我们将使用一个提示符$(字体原因,导致全书字形有异):

$ python3 words.py

在这种情况下,你无须输入$字符。

对于特定的Windows命令,我们将在最前面使用一个大于号提示:

> python words.py

同样,这里不需要输入>字符。对于需要放置在文件中,而不是以交互方式输入的代码块,我们将不加任何前置提示,直接显示代码:

def write_sequence(filename, num):
    """将Recaman序列写入文本文件"""
    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.")

如果在上面引用的字符串中的行末尾看到一个反斜杠,它不是代码的一部分,不应该输入。

偶尔,我们也会为代码行编号,便于我们可以从下面的叙述中轻松地引用它们。这些行号不应作为代码的一部分输入。编号的代码块如下所示:

01.  def write_grayscale(filename, pixels):
02.      height = len(pixels)
03.      width = len(pixels[0])
04. 
05.      with open(filename, 'wb') as bmp:
06.          # BMP文件头
07.          bmp.write(b'BM')
08.          # 接下来的4个字节将作为32位的小端整数保存文件大小
09.          # 现在用零占位
10.          size_bookmark = bmp.tell()
11.          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()一样。


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

本书提供如下资源:

要获得以上配套资源,请在异步社区本书页面中点击,跳转到下载界面,按提示进行操作即可。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/ selfpublish/submission即可)。

如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号


在本章中,我们将介绍如何在Windows、Ubuntu Linux和macOS系统上获取并安装Python。我们还将编写我们的第一个基本的Python代码,并熟悉主要的Python编程文化,比如Python之禅,同时还会讲解语言名称有趣的起源。

Python语言有两个主要版本,Python 2是被广泛部署的遗留版本,而现存的Python 3则是Python语言的未来。许多Python代码同时兼容最后的Python 2版本以及最新的Python 3版本。然而,Python的主要版本之间存在着一些关键的区别,严格来说它们是不兼容的。我们将在本书中使用Python 3.5,但是将指出它与Python 2的关键区别。这是一本关于Python基础知识的书,我们所提供的一切将适用于Python 3的未来版本,不要害怕尝试Python版本,因为它们都是可用的。

在开始使用Python语言进行编程之前,我们需要了解Python环境。Python是一种高度可移植的语言,它可以运行在所有主流的操作系统上。你可以在Windows、Mac或Linux上学习本书。接下来就要讲解与平台相关的主要内容——Python 3的安装,你可以自由跳过你不感兴趣的部分。

在Windows平台上安装Python 3的执行步骤如下。

(1)对于Windows系统,你需要访问Python的官方网站,并单击左侧的链接进入下载页面。然后选择其中一个MSI安装程序①[1],这具体取决你运行的是32位还是64位系统。

(2)下载并运行安装程序。

(3)在安装程序的过程中,选择是否只为自己安装Python,或者为自己机器上的所有用户安装Python。

(4)选择Python发行版的安装位置。默认安装在C:\Python35目录下。我们不建议将Python安装到Program Files文件夹中,因为在Windows Vista及更高版本中用于将应用程序彼此隔离的虚拟化文件存储库可能会干扰第三方Python软件包的安装。

(5)在安装向导的自定义Python页面上,我们建议保留默认值,该默认值使用不到40MB的空间。

(6)除了安装Python运行时和标准库之外,安装程序还将使用Python解释器来注册各种文件类型,例如*.py文件。

(7)一旦安装了Python,你需要将Python添加到系统的PATH环境变量中。具体方法为:从“控制面板”中选择“系统和安全”,然后选择“系统”。另一种快捷的访问方法是按住Windows键,然后按键盘上的Break键。使用左侧的任务窗格选择“高级系统设置”以打开“系统属性”对话框的“高级”选项卡。然后单击环境变量打开子对话框。

(8)如果你拥有管理员权限,你应该可以将路径C:\Python35和C:\Python35\Scripts添加到与PATH系统变量相关联的、以分号分隔的项目列表中。如果没有,你应该能够为特定的用户创建或附加包含相同值的PATH变量。

(9)现在打开一个新的控制台窗口——Powershell或者cmd,它们可以正常工作,然后你可以在命令行中运行python以进行验证:

> python
Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

欢迎来到Python!

三箭头提示(>>>)表明Python正在等待你的输入。

此时,你可能想跳过这一部分。接下来我们将展示如何在Mac和Linux上安装Python。

在macOS平台上安装Python的步骤如下。

(1)对于macOS,你需要访问Python的官方网站 ,然后单击左侧的链接进入下载页面。找到匹配你的系统版本的安装程序,单击链接并下载它。

(2)下载一个DMG磁盘映像文件,你可以从你的Downloads stack或Finder中打开它。

(3)在打开的Finder窗口中,你可以看到Python.mpkg安装程序文件。使用“辅助”功能单击以打开该文件的上下文菜单。从该菜单中,选择“打开”。

(4)在某些版本的macOS上,你会收到“该文件来自不明身份的开发人员”的提示。单击此对话框上的“打开”按钮继续安装。

(5)现在已经进入Python安装程序中。按照向导提示进行操作。

(6)无须自定义安装,应该保持默认设置。当安装程序可用时,单击“安装”按钮安装Python。程序可能会要求你输入密码以授权进行安装。安装完成后,单击“关闭”按钮以关闭安装程序。

现在Python 3已安装成功。打开一个终端窗口,你可以在命令行里运行python进行验证:

> python
Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

欢迎来到Python!

三箭头提示表明Python正在等待你的输入。

在Linux平台上安装Python的步骤如下。

(1)要在Linux上安装Python,你可以使用系统的软件包管理器。我们将展示如何在最新版本的Ubuntu上安装Python[2],在大多数其他现代Linux发行版中,安装过程非常相似。

(2)在Ubuntu上,首先启动Ubuntu软件中心,通常可以通过单击启动器中的图标来运行。或者,你可以在Dashboard上搜索Ubuntu软件中心然后单击运行它。

(3)进入软件中心后,在右上角的搜索栏中输入搜索词“python 3.5”,然后按回车键。

(4)搜索结果中有这样一条:Python (v3.5) with Python Interpreter (v3.5),在页面下面以小字体显示。选择此条目,然后单击出现的“安装”按钮。

(5)此时你可能需要输入密码才能安装软件。

(6)你现在应该看到了进度指示器,安装完成后它将消失。

打开终端(使用Ctrl+Alt+T组合键),然后你可以在命令行中运行python 3.5进行验证:

 $ python3.5
Python 3.5.0+ (default, Oct 11 2015, 09:05:38)
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

欢迎来到Python!

三箭头提示表明Python正在等待你的输入。

现在我们已经安装并运行了Python,你可以立即开始使用它了。和在正常开发过程中用于实验和快速测试的工具一样,开始使用都是了解编程语言的好方法。

Python的命令行环境叫作Read-Eval-Print-Loop(读取—求值—输出—循环)。Python将读取(read)我们输入的任何内容,进行求值(evaluate)并输出(print)结果,然后循环(loop)回到开始。你会经常听到它被简称为“REPL”。

启动时,REPL将输出一些当前运行的Python的版本的信息,然后显示三箭头提示。此提示告诉你,Python正在等待你输入内容。

在交互式Python会话中,你可以输入Python程序的片段并查看即时结果。我们从一些简单的算术开始:

>>> 2 + 2
4
>>> 6 * 7
42

可以看到,Python读取输入,进行求值,输出结果,并循环回到开始以重复执行。

我们可以在REPL中给变量赋值:

>>> x = 5

只需输入变量名即可输出其内容:

>>> x
5

也可以在表达式中引用变量:

>>> 3 * x
15

在REPL中,你可以使用特殊的下划线变量来引用最近输出的值,这是Python中极少数鲜为人知的快捷键之一:

>>> _
15

或者,你可以在表达式中使用特殊的下划线变量:

>>> _ * 2
30

请记住,这个有用的技巧只适用于REPL,下划线在Python脚本或程序中没有任何特殊的含义。

请注意,并非所有语句都具有返回值。当我们将5赋值给x时,没有返回值,只是生成了变量x。其他语句可能有更明显的副作用。

尝试一下以下命令:

>>> print('Hello, Python')
Hello, Python

你会看到Python立即求值并执行此命令,输出字符串“Hello,Python”,并返回到另一个提示。重要的是要理解这里的响应,就是print()函数的副作用,而不是由REPL求值并输出的表达式的结果。

除此之外,输出(print)是Python 2和Python 3之间最大的区别之一。在Python 3中,括号是必需的,而在Python 2中则不是。这是因为在Python 3中,print()是一个函数调用。后续会有更多的关于函数的内容。

在这一节,我将告诉你如何退出REPL并返回到你的系统shell提示符中。我们通过将文件结尾(end-of-file)控制字符发送给Python来实现退出功能。但是,发送该字符的方法因平台而异。

如果你使用Windows系统,那么按住组合键Ctrl+Z退出。

如果你使用Mac系统或者Linux系统,那么按住组合键Ctrl+D退出。

如果你经常在平台之间切换,并且你在类UNIX系统上意外地按了组合键Ctrl+Z,那么你将在无意中暂停Python解释器并返回到操作系统的shell。你可以通过将Python置为前台进程而重新激活它,这样只需运行fg命令即可:

fg

现在按几次回车键(Enter),就可以看到三箭头Python提示:

>>>

启动Python 3解释器:

python

在Windows上启动的代码如上,而在Mac或者Linux上,启动的代码如下:

$ python3

Python的控制流结构,如for循环、while循环以及 if 语句,都是由以冒号终止的语句引入的,表示其构造的语句体紧随其后。例如,for循环需要一个循环体,如果你输入:

>>> for i in range(5):
...

Python会显示三点的提示,要求你提供循环体。Python的一个独特的(有时也饱受争议)方面就是前置的空格是有语法意义的。

这意味着Python使用缩进级别,而不像其他语言使用大括号来划分代码块。根据惯例,同级的Python代码都以4个空格缩进。

所以当Python显示三点提示时,我们提供4个空格和一个语句来形成循环体:

...    x = i * 10

循环体中还将包含第二条语句,所以在接下来的三点提示中按回车键之后,我们再输入4个空格,然后调用内置的print()函数:

...    print(x)

要终止代码块,那么必须在REPL中输入一个空行:

...

随着我们完成代码块,Python会执行待处理的代码,输出小于50且为10的倍数的数字:

0
10
20
30
40

看一下满屏的Python代码,我们可以看到清晰匹配的缩进——实际上必须匹配——程序的结构如图1.1所示。

图1.1 代码中的空格

即使我们用灰线替换代码,程序的结构也很清楚,如图1.2所示。

图1.2 用灰线替换代码

以冒号结束的每个语句都会开始一个新行,并引入一个额外的缩进级别,直到取消缩进(dedent)将缩进恢复到上一级为止。每个级别的缩进通常是4个空格,稍后会更详细地介绍这些规则。

Python使用的这种缩进语法有3大优点。

(1)它迫使开发人员在代码块中使用单一级别的缩进。在很多语言中,这通常被认为是好的做法,因为它使代码更加易读。

(2)具有缩进语法的代码不会被不必要的花括号混淆,而你永远也不会遇到有关代码标准的争辩——花括号应该在哪里。你可以很容易地识别Python代码中的所有代码块,并且每个人都以相同的方式编写代码。 

(3)缩进语法要求作者、Python运行时系统以及需要读取代码的未来维护者必须对代码的结构给出一致的解释。因此,你不会遇到有歧义的代码结构。 

Python缩进的规则看起来很复杂,但在实践中却相当简单。

严格的代码格式化方法就是像Guido一样进行缩进代码,也许更恰当的说法是像Guido一样缩进它!重视代码质量如可读性已经成为Python文化的核心,接下来我们将探索一下这个问题。

许多编程语言是文化运动的中心。它们有自己的社区、价值观、实践和哲学,Python也不例外。开发者通过Python Enhancement Proposals(以下缩写为PEP)这一系列文档对Python语言的开发进行管理。其中一个PEP(名为PEP 8)解释了如何格式化代码,我们在本书中也会遵循该指南。例如,我们在新的Python代码中使用4个空格进行缩进,这也是PEP推荐的方式。

这些PEP文档中的另外一个文档PEP 20,被称为“Python之禅”。它引用了20条描述Python指导原则的格言,其中只有19条被记录下来。方便的是,Python之禅也内置在Python解释器中,你可以通过输入以下命令从REPL中看到它:

>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

在本书中,我们将在禅之刻(moments of zen)中特别强调Python之禅中的至理名言,以理解它们是如何运用在我们所学的知识中的。正如我们刚刚介绍的Python的缩进语法,这是我们展示禅之刻的好时机。

有时候,你会感激Python的缩进语法,它让你的代码变得优雅,也可以让你轻松读懂他人的代码。

如前所述,Python自带了大量的标准库,这是Python被经常提到的一个优点,这些标准库通常被称为内置电池(battery included)。标准库被构建为模块(module),稍后我们将会讨论模块的主题。在这个阶段,重要的是你要知道可以使用import关键字来访问标准库模块。

导入模块的基本形式就是在import关键字后加上一个空格和模块的名称。让我们看看如何使用标准库的math模块来计算平方根。在三箭头提示符后,我们输入以下  命令:

>>> import math

由于import是一个不返回值的语句,如果导入成功,Python不会输出任何内容,而是立即返回提示符。我们可以通过使用模块的名称访问导入的模块的内容,先输入模块的名称,随后是一个点,然后是你需要的模块中的属性名称。像许多面向对象的语言一样,点操作符用于深入对象结构。作为专家级Python爱好者,我们已经知道math模块包含一个名为sqrt()的函数。我们尝试使用以下命令:

>>> math.sqrt(81)
9.0

但是,如何才能在math模块中找到其他可以用的函数呢?

REPL有一个特殊的函数help(),它可以从提供了文档的对象(如标准库模块)中检索任何嵌入的文档。

要获得帮助,只需在提示符下输入help

>>> help
Type help() for interactive help, or help(object) for help about object.

你可以自行探索第一个选项——交互式帮助。这里我们将介绍第二个选项,将math模块作为我们需要帮助的对象传入:

>>> help(math)
Help on module math:

NAME
    math

MODULE REFERENCE
    http://docs.python.org/3.3/library/math
    The following documentation is automatically generated from the
    Python source files. It may be incomplete, incorrect or include
    features that are considered implementation detail and may vary
    between Python implementations. When in doubt, consult the module
    reference at the location listed above.

DESCRIPTION
    This module is always available. It provides access to the
    mathematical functions defined by the C standard.

FUNCTIONS
    acos(...)
        acos(x)
        Return the arc cosine (measured in radians) of x.

你可以使用空格键来浏览帮助,如果你使用的是Mac或Linux系统,则可以使用箭头键上下滚动。

在浏览这些函数的过程中,你会看到一个计算阶乘的数学函数——factorial。按Q键退出帮助浏览器,并返回Python的REPL。

现在练习使用help()查看factorial函数的具体帮助:

>>> help(math.factorial)
Help on built-in function factorial in module math:

factorial(...)
    factorial(x) -> Integral

    Find x!. Raise a ValueError if x is negative or non-integral.

Q键返回Python的REPL。

让我们开始使用factorial()函数。该函数接收一个整数参数并返回一个整数值,如下:

>>> math.factorial(5)
120
>>> math.factorial(6)
720

注意我们如何使用模块命名空间来限定函数名称。这通常是一个很好的做法,因为它非常清楚地标明了函数的出处。但是,它可能导致代码过于冗长。

让我们使用阶乘来计算在学校里常遇到的一种数学问题:从有5个苹果的集合中取3个苹果,有多少种取法:

>>> n = 5
>>> k = 3
>>> math.factorial(n) / (math.factorial(k) * math.factorial(n - k))
10.0

所有的函数都引用了math模块,这让这个简单的表达式相当冗长。Python的import语句有一种可选的形式,我们可以使用from关键字将模块中的特定函数导入到当前命名空间中:

>>> from math import factorial
>>> factorial(n) / (factorial(k) * factorial(n - k))
10.0

这是一个很好的改进,但是对于这样一个简单的表达式来说,仍然有点冗长。

我们可以使用import语句的第三种形式对导入的函数重命名。这对可读性是很有用的,也能避免命名空间冲突。尽管如此,我们仍然建议你少用或者慎重地使用此特性:

>>> from math import factorial as fac
>>> fac(n) / (fac(k) * fac(n - k))
10.0

记住,当我们单独使用factorial()时,它会返回一个整数。但是,为了计算组合的值,上面那个复杂的表达式生成了一个浮点数。这是因为我们使用了“/”——Python的浮点除法运算符。由于我们想限定我们的操作只会返回整数结果,所以我们可以使用“//”来改进我们的表达式,“//”是Python的取整除法运算符:

>>> from math import factorial as fac
>>> fac(n) // (fac(k) * fac(n - k))
10

值得注意的是,在许多其他编程语言中,即使是比较合适的n值,上述表达式也可能会失败。在大多数编程语言中,常规普通的有符号整数只能存储小于231的值:

>>> 2**31 - 1
2147483647

然而,阶乘增长得如此之快,以至于可以适合32位有符号整数的最大阶乘是12!,而13!就太大了:

>>> fac(13)
6227020800

在被广泛使用的编程语言中,你可能需要更复杂的代码或更精密的数学运算,以计算从有13!个苹果的集合中抽取3个苹果有多少种方法。Python不会遇到这样的问题,你可以用任意大的整数进行计算,它只受限于计算机的内存。为了进一步进行说明,我们尝试一下更大的问题:计算从100种不同的水果中挑选两种水果,有多少种选法?(假设我们可以放下这么多水果)

>>> n = 100
>>> k = 2
>>> fac(n) // (fac(k) * fac(n - k))
4950

为了强调该表达式的第一个项目有多大,我们单独计算一下100!:

>>> fac(n)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

这个数字甚至比已知宇宙中的原子数还大得多,它的数量很大。如果你像我一样,想知道有多少位数字,我们可以将整数转换为文本字符串,并计算其中的字符数:

>>> len(str(fac(n)))
158

这绝对是很多数字。它也显示了Python不同的数据类型。在这种情况下,整数、浮点数和文本字符串很自然地工作在一起。在下一节中,我们将基于这种经验,更详细地介绍整数、字符串和其他内置类型。

Python自带了一些内置的数据类型,主要包括基本标量类型(如整数)以及集合类型(如字典)。这些内置类型足够强大,可以满足许多编程需求,你在构建代码块时也可以使用它们创造更加复杂的数据类型。

我们将要用到的基本内置标量类型主要有:

现在我们只是看看它们的基本细节,了解它们的字面量形式以及如何创建它们。

在之前的学习中我们已经看到相当多的Python整数了。Python整数是有符号的,实际上,它是具有无限精度的。这意味着它们可以代表的值的大小没有预先定义的限制。

Python中的整数字面量通常被规定为十进制:

>>> 10
10

使用0b前缀时为二进制:

>>> 0b10
2

使用了0o前缀时为八进制:

>>> 0o10
8

使用了0x前缀时为十六进制:

>>> 0x10
16

我们还可以通过调用int构造函数来构造整数,该构造函数可以把其他数据类型(如浮点数)转换为整数:

>>> int(3.5)
3

请注意,当使用int构造函数时,凑整始终朝向零值:

>>> int(-3.5)
-3
>>> int(3.5)
3

我们也可以把字符串转换成整数:

>>> int("496")
496

请注意,如果该字符串不表示一个整数,那么Python会抛出异常(稍后会详细地介绍异常)。

在对字符串进行转换时,你甚至可以提供可选的进制数。例如,若要将字符串转换为三进制,只要将3作为第二个参数传递给构造函数即可:

>>> int("10000", 3)
81

Python通过浮点类型来支持浮点数。Python的浮点类型实现了具有53位二进制精度的IEEE-754双精度浮点数,这相当于十进制的15~16位有效数字。

Python把任何包含小数点的数字字面量解释为float类型:

3.125

我们可以使用科学计数法,所以对于较大的数,如3×108,我们可以这样写:

>>> 3e8
300000000.0

对于像普朗克常量这样的小数——6.626×10-34J·s,我们可以这样写:

>>> 6.626e-34
6.626e-34

注意Python如何自动地将显示形式切换为最可读的形式。

和整数类似,我们可以使用float构造函数将其他数字或字符串类型转换为浮点数。例如,构造函数可以接收一个int类型的数:

>>> float(7)
7.0

float构造函数也可以接收一个字符串:

>>> float("1.618")
1.618

1.特殊的浮点数值

通过将某些字符串传递给浮点构造函数,我们可以创建特殊浮点值NaN(Not a Number),也可以创建正无穷大和负无穷大:

>>> float("nan")
nan
>>> float("inf")
inf
>>> float("-inf")
-inf

2.提升为浮点数

任何涉及intfloat的计算的结果都会被提升为浮点数:

>>> 3.0 + 1
4.0

你可以在Python文档中阅读更多有关Python数字类型的信息。

Python具有一个名为None的特殊空值,首字母为大写N。None用于表示缺少值。Python REPL不会打印None的结果,因此在REPL中输入None是无效的:

>>> None
>>>

像其他对象一样,可以把空值None绑定到变量名称上:

>>> a = None

我们可以使用is运算符判断一个对象是否为None:

>>> a is None
True

可以看到响应是True,这是我们接下来要介绍的bool类型。

bool类型表示逻辑状态,在Python的几个控制流结构中起着重要的作用,很快我们就会看到它的“厉害”。正如你所知道的,有两个bool值——TrueFalse,首字母都是大写:

>>> True
True
>>> False
False

Python也有一个bool构造函数,它可以把其他类型转换为bool类型。我们来看看它是如何工作的。对于整数,零被认为是假,所有其他值是真:

>>> bool(0)
False
>>> bool(42)
True
>>> bool(-1)
True

浮点数和整数一样,只有零被认为是假:

>>> bool(0.0)
False
>>> bool(0.207)
True
>>> bool(-1.117)
True
>>> bool(float("NaN"))
True

在转换集合(如字符串或列表)时,只有空的集合才被视为是假。在转换列表(我们稍后会看)时,只有空的列表(字面量形式显示为[])才为

>>> bool([])
False
>>> bool([1, 5, 9])
True

类似,在字符串中,把空字符串""传递给bool函数时,计算结果是False

>>> bool("")
False
>>> bool("Spam")
True

特殊情况是,你不能使用bool构造函数来转换TrueFalse的字符串表示形式:

>>> bool("False")
True

由于字符串False不为空,所以其计算结果为True。这些向bool的转换很重要,因为它们广泛应用于Python的if语句和while循环,这些语句都接收bool值作为  条件。

布尔值通常由Python的关系运算符生成,这些运算符主要用于比较对象。使用非常广泛的两个关系运算符是Python的等于和不等于,它们实际上是测试值的等价或不等价。也就是说,如果一个对象可以代替另一个对象,则两个对象是相等的。我们将在本书后面详细讲解对象相等的概念。现在我们来比较简单的整数。

我们先从对变量g进行赋值或者绑定一个值开始:

>>> g = 20

我们用==来测试等于,如下面的命令所示:

>>> g == 20
True
>>> g == 13
False

使用!=测试不等于:

>>> g != 20
False
>>> g != 13
True

我们还可以使用其他比较运算符来比较数值的大小。使用“<”判定第一个参数是否小于第二个参数:

>>> g < 30
True

同样地,使用“>”判定第一个参数是否大于第二个参数:

>>> g > 30
False

你可以使用“<=”来测试小于等于:

>>> g <= 20
True
>>> g >= 20
True

如果你有其他编程语言的关系运算符的使用经验,那么Python的运算符根本就不足为奇。只要记住,这些运算符用于比较等值而不是同一性即可,我们将在下面的章节中详细介绍这个区别。

现在我们已经学习了一些基本的内置类型,接下来我们来看看两个重要的控制流结构:if语句和while循环,它们都依赖向bool类型的转换。

我们可以基于表达式的值使用条件语句来做分支执行。语句的形式是if关键字、后跟的表达式,以及冒号终止后引入的新代码块。在REPL中试一下:

>>> if True:

记住要在代码块中缩进4个空格。如果条件为True,则添加一些要执行的代码,然后用空行终止该块:

...     print("It's true!")
...
It's true!

此时,代码块将被执行,因为条件是True。相反,如果条件为False,则块中的代码不会被执行:

>>> if False:
...     print("It's true!")
...
>>>

if语句一起使用的表达式将被转换为bool,就像使用了bool()构造函数一样,所以:

>>> if bool("eggs"):
...     print("Yes please!")
...
Yes please!

如果该值完全等于某个值,那么我们这样使用if语句:

>>> if "eggs":
...     print("Yes please!")
...
Yes please!

幸亏有这个有用的简写,我们很少会在Python中使用bool构造函数将值显式地转换为bool

if语句支持一个可选的else子句,它由else关键字(后跟冒号)引入到代码块中,该关键字与if关键字有相同的缩进级别。我们先创建(但不是完成)一个if代码块:

>>> h = 42
>>> if h > 50:
...     print("Greater than 50")

在这种情况下,为了开始else代码块,我们省略了三个点之后的缩进:

... else:
...     print("50 or smaller")
...
50 or smaller

对于多条件的情况,你可能会试图做这样的事情:

>>> if h > 50:
...     print("Greater than 50")
... else:
...     if h < 20:
...         print("Less than 20")
...     else:
...         print("Between 20 and 50")
...
Between 20 and 50

每当你发现else代码块中包含一个嵌套的if语句时,你应该考虑使用Python的elif关键字,它是else-if的组合。

正如Python之禅提醒我们的,扁平优于嵌套

>>> if h > 50:
...     print("Greater than 50")
... elif h < 20:
...     print("Less than 20")
... else:
...     print("Between 20 and 50")
...
Between 20 and 50

这个版本更容易阅读。

Python有两种类型的循环:for循环和while循环。在介绍缩进语法时,我们已经见到了for循环,我们很快又要介绍它,但是现在我们先学习while循环。

Python中的while循环由while关键字引入,后面是一个布尔表达式。与if语句的条件一样,表达式将被隐式地转换为布尔值,就好像它已被传递给bool()构造函数一样。while语句由冒号终止,因为它引入了一个新的代码块。

让我们在REPL中编写一个循环:从5倒数到1。我们将初始化一个名为c的计数器变量,它的初值为5,并保持循环直到它为零。这里我们会用到另一个新的语言特性,就是增强型赋值运算符-=,在每次迭代中对计数器的值减一。其他基本的数学运算(如加法和乘法)也存在类似的增强型赋值运算:

>>> c = 5
>>> while c != 0:
...     print(c)
...     c -= 1
...
5
4
3
2
1

条件或者断言将被隐式地转换为bool,就像调用bool()构造函数一样,我们可以用以下代码代替上面的代码:

>>> c = 5
>>> while c:
...     print(c)
...     c -= 1
...
5
4
3
2
1

这样也能正常运行,将整数值c转换为bool的结果为Truec递减直到为0,此时c将被转换为False。也就是说,在这种情况下使用这种简短的形式,大家会认为这是非Python化(un-Pythonic)的,回顾Python之禅,显式优于隐式。相比第二种形式的简洁性,我们更看重第一种形式的可读性。

在Python中,while循环通常用于需要无限循环的地方。我们通过将True作为断言表达式传递给while语句来实现这一点:

>>> while True:
...     print("Looping!")
...
Looping!
Looping!
Looping!
Looping!
Looping!
Looping!
Looping!
Looping!

现在你可能想知道我们该如何离开这个循环并重新获得对REPL的控制!只需按组合键Ctrl+C

Looping!
Looping!
Looping!
Looping!
Looping!
Looping!^C
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt
>>>

Python拦截到这个键盘输入,并引发一个特殊的异常,这个异常会终止循环。我们将在第6章中更详细地说明什么是异常,以及如何使用它们。

使用break退出循环

许多编程语言支持这种类型循环结构,该结构将断言测试放在循环的结尾,而不是开始。例如,C、C++、C#和Java支持do-while结构。其他语言使用(repeat-until)的循环。在Python中并不是这样。Python的惯用方式是,可以在while True中使用break语句,它可以让我们尽早地退出循环。

break语句可跳出循环——只有最内层的循环(如果已经嵌套了一些循环),然后继续执行循环体之后的内容。

我们来看一个break的例子,顺便介绍Python的其他一些功能,我们来逐行查看:

>>> while True:
...     response = input()
...     if int(response) % 7 == 0:
...         break
...

while True开始,这是一个无限循环。在while代码块的第一行语句中,我们使用内置的input()函数来接收一个来自用户的字符串。我们将该字符串赋值给一个名为response的变量。

现在,我们使用if语句来测试提供的值能否被7整除。我们使用int()构造函数将response字符串转换为整数,然后使用取模运算符%除以7,并给出余数。如果余数等于零,则response可以被7整除。我们进入if代码块。

if代码块中有两个级别的缩进深度,我们从8个空格开始,然后使用break关键字。break会终止最内层的循环(while循环),然后跳转并执行循环后的第一个语句。

在这里,循环后的第一个语句是结束程序。我们在3点提示中输入一个空白行,以关闭if代码块和while代码块。执行该循环,它会暂停在input()的调用处,等待我们输入数字。我们来试一下:

12
67
34
28
>>>

一旦我们输入一个可被7整除的数字,则断言就为True,此时会进入if语句里,然后我们从循环中退出,程序运行结束,返回REPL提示符。

[1] 不同的Python版本提供的安装程序可能有差别,你也可以下载EXE安装程序,请根据Python官网的实际情况选择。——译者注

[2] 很多Linux系统都自带了Python而无须单独安装,但是系统自带的Python版本各有差别,而且修改系统自带的Python版本可能会影响系统的使用。——译者注


相关图书

深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
动手学自然语言处理
动手学自然语言处理
Web应用安全
Web应用安全
Python高性能编程(第2版)
Python高性能编程(第2版)
图像处理与计算机视觉实践——基于OpenCV和Python
图像处理与计算机视觉实践——基于OpenCV和Python
Python数据科学实战
Python数据科学实战

相关文章

相关课程