Python程序设计 第3版(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-31 01:22:11

点击下载

作者:(美) 约翰·策勒

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Python程序设计 第3版

Python程序设计 第3版试读:

前言

中提到,Python作为第一种编程语言是接近理想的,因为它不是“玩具语言”。作为Python的创建者,我不想独占所有的功劳:Python源于ABC,这种语言在20世纪80年代初由阿姆斯特丹国家数学和计算机科学研究所(CWI)的Lambert Meertens、Leo Geurts等人设计,旨在教授程序设计。如果说我为他们的工作添加了什么东西,那就是让Python变成了一种非玩具语言,具有广泛的用户群、广泛的标准和大量的第三方应用程序模块。

我没有正式的教学经验,所以我可能没有资格来评判其教育效果。不过,作为一名具有将近30年经验的程序员,读过本书,我非常赞赏本书对困难概念的明确解释。我也喜欢书中许多好的练习和问题,既检查理解,又鼓励思考更深层次的问题。 恭喜本书读者!学习Python将得到很好的回报。我保证在这个过程中你会感到快乐,我希望你在成为专业的软件开发人员后,不要忘记你的第一种语言。——Guido van Rossum,Python之父前言

本书旨在作为大学的一门计算课程的主要教材。它采用相当传统的方法,强调解决问题、设计和编程是计算机科学的核心技能。但是,这些思想利用非传统语言(即Python)来说明。在我的教学经验中,我发现许多学生很难掌握计算机科学和程序设计的基本概念。这个困难可以部分归咎于最常用于入门课程的语言和工具的复杂性。因此,这本教材只有一个总目标:尽可能简单地介绍基础计算机科学概念,但不是过于简单。使用Python是这个目标的核心。

传统的系统语言(如C++、Ada和Java)的发展是为了解决大规模编程中的问题,主要侧重于结构和纪律。它们不是为了易于编写中小型程序。最近脚本(有时称为“敏捷”)语言(如Python)的普及程度上升,这表明了一种替代方法。Python非常灵活,让实验变得容易。解决简单问题的方法简单而优雅。Python为新手程序员提供了一个很好的实验室。

Python具有一些特征,使其成为第一种编程语言的接近完美的选择。Python基本结构简单、干净、设计精良,使学生能够专注于算法思维和程序设计的主要技能,而不会陷入晦涩难解的语言细节。在Python中学习的概念可以直接传递给后续学习的系统语言(如C ++和Java)。但Python不是一种“玩具语言”,它是一种现实世界的生产语言,可以在几乎每个编程平台上免费提供,并且具有自己易于使用的集成编程环境。最好的是,Python让学习编程又变得有趣了。

虽然我使用Python作为语言,但Python教学并不是本书的重点。相反,Python用于说明适用于任何语言或计算环境的设计和编程的基本原理。在某些地方,我有意避免某些Python的功能和习惯用法,它们通常不会在其他语言中使用。市面上有很多关于Python的好书,本书旨在介绍计算。除了使用Python之外,本书还有其他一些特点,旨在使其成为计算机科学的平台。其中一些特点如下。● 广泛使用计算机图形学。学生喜欢编写包含图形的程序。本书提

供了一个简单易用的图形软件包(以Python模块提供),允许学

生们学习计算机图形学原理,并练习面向对象的概念,但没有完

整的图形库和事件驱动编程中固有的复杂性。● 有趣的例子。本书包含了完整的编程示例来解决实际问题。● 易读的行文。本书的叙事风格以自然的方式介绍了重要的计算机

科学概念,这是逐步讨论的结果。我试图避免随意的事实罗列,

或稍微有点关系的侧边栏。● 灵活的螺旋式介绍。因为本书的目的是简单地呈现概念,所以每

一章的组织是为了逐渐向学生介绍新的思想,让他们有时间来吸

收越来越多的细节。前几章介绍了需要更多时间掌握的思想,并

在后面的章节中加以强化。● 时机恰好地介绍对象。介绍面向对象技术的适当时机,是计算机

科学教育中持续存在的争议。本书既不是严格的“早讲对象”,

也不是“晚讲对象”,而是在命令式编程的基础上简要地介绍了

对象概念。学生学习多种设计技巧,包括自顶向下(函数分解)、

螺旋式(原型)和面向对象的方法。另外,教科书的材料足够灵

活,可以容纳其他方法。● 大量的章末习题。每章末尾的练习为学生提供了充分的机会,强

化对本章内容的掌握,并实践新的编程技巧。第2版和第3版的变化

本书的第1版已经有些老旧,但它所采用的方法现在仍然有效,就像当时一样。

虽然基本原则并没有改变,但技术环境却变了。随着Python 3.0的发布,对原始资料的更新变得必要。第2版基本上与最初的版本相同,但更新使用了Python 3.0。本书中的每个程序示例几乎不得不针对新的Python来修改。此外,为了适应Python中的某些更改(特别是删除了字符串库),内容的顺序稍做了调整,在讨论字符串处理之前介绍了对象术语。这种变化有一个好的副作用,即更早介绍计算机图形学,以激发学生的兴趣。

第3版延续了更新课本以反映新技术的传统,同时保留了经过时间考验的方法来教授计算机科学的入门课程。这个版本的一个重要变化是消除了eval的大部分用法,并增加了其危险性的讨论。在连接越来越多的世界中,越早开始考虑计算机安全性越好。

本书添加了几个新的图形示例,在第4章到第12章中给出,以引入支持动画的图形库的新功能,包括简单的视频游戏开发。这使得最新的课本与大作业项目的类型保持一致,这些大作业常在现代的入门课程中布置。

在整个课本中还有一些较小的改动,其中包括:● 第5章添加了文件对话框的内容;● 第6章已经扩展并重新组织,强调返回值的函数;● 为了一致地使用IDLE(标准的“随Python分发的”开发环境),

介绍范围已经改进并简化,这使得本书更适合自学和作为课堂教

科书使用;● 技术参考已更新;● 读者可访问异步社区(www.epubit.com.cn)并搜索本书页面,

以下载示例代码和习题解答。采用本书作为教材的老师,可以联

系contact@epubit.com.cn,申请教学PPT。本书主要内容

为了保持简单的目标,我试图限制2门课不会涵盖的内容数量。不过,这里的内容可能比较多,典型的一学期入门课程也许不能涵盖。我的课程依次介绍了前12章中的几乎所有内容,尽管不一定深入介绍每个部分。第13章(“算法设计与递归”)中的一个或两个主题通常穿插在学期中的适当时候。

注意到不同的教师喜欢以不同的方式处理主题,我试图保持材料相对灵活。第1章~第4章(“计算机和程序”“编写简单程序”“数字计算”“对象和图形”)是必不可少的介绍,应该按顺序进行说明。字符串处理的第5章(“序列:字符串、列表和文件”)的初始部分也是基本的,但是稍后的主题(如字符串格式化和文件处理)可能会被延迟,直到后来需要。第6章~第8章(“定义函数”“判断结构”和“循环结构和布尔值”)设计为独立的,可以以任何顺序进行。关于设计方法的第9章~第12章是按顺序进行的,但是如果教师希望在各种设计技术之前介绍列表(数组),那么第11章(“数据集合”)中的内容可以很容易地提前。希望强调面向对象设计的教师不需要花费很多时间在第9章。第13章包含更多高级材料,可能会在最后介绍或穿插在整个课程的各个地方。致谢

多年来,我教授CS1的方法受到了我读过并用于课堂的许多新教材的影响。我从这些书中学到的很多东西无疑已经融入了本书。有几位专家的方法非常重要,我觉得他们值得特别提及。A. K. Dewdney一直有一个诀窍,找出说明复杂问题的简单例子。我从中借鉴了一些,装上了Python的新腿。我也感谢Owen Astrachan和Cay Horstmann的精彩教科书。我在第4章介绍的图形库直接受到Horstmann设计的类似库的教学经验启发。我也从Nell Dale那里学到了很多关于教授计算机科学的知识,当时我是得克萨斯大学的研究生,很幸运地担任了助教。

许多人直接或间接地为本书做出了贡献。我也得到了沃特伯格学院的同事(和前同事)的很多帮助和鼓励:Lynn Olson在一开始就不动摇地支持,Josef Breutzmann提供了许多项目想法,Terry Letsche为第1版和第3版编写了PowerPoint幻灯片。

我要感谢以下阅读或评论第1版手稿的人:莫赫德州立大学的Rus May、北卡罗莱纳州立大学的Carolyn Miller、谷歌的Guido Van Rossum、加州州立大学(Chico)的Jim Sager、森特学院的Christine Shannon、罗彻斯特理工学院的Paul Tymann、亚利桑那大学的Suzanne Westbrook。我很感激首都大学的Dave Reed,他使用了第1版的早期版本,提供了无数有见地的建议,并与芝加哥大学的Jeffrey Cohen合作,为本版本提供了替代的章末练习。Ernie Ackermann在玛丽华盛顿学院试讲了第2版。第3版是由位于San Luis Obispo的加州理工大学的Theresa Migler和我的同事Terry Letsche在课堂上试讲的。David Bantz对草稿提供了反馈意见。感谢所有的宝贵意见和建议。

我也要感谢Franklin, Beedle and Associates的朋友,特别是Tom Sumner、Brenda Jones和Jaron Ayres,他们把我喜爱的项目变成一本真正的教科书。本版献给Jim Leisy作为纪念,他是Franklin, Beedle and Associates的创始人,在第3版正要付梓时意外过世。Jim是个了不起的人,兴趣非常广泛。正是他的远见、指导、不懈的热情和不断的激励,最终让我成为一名教科书作者,让这本书成功。

特别感谢所有我教过的学生,他们在教学方面给我很多教益。还要感谢沃特伯格学院批准我休假,支持我写书。最后但最重要的是,我要感谢我的妻子Elizabeth Bingham,她作为编辑、顾问和鼓舞士气者,在我写作期间容忍我。第1章计算机和程序学习目标● 了解计算系统中硬件和软件各自的作用。● 学习计算机科学家研究的领域和他们使用的技术。● 了解现代计算机的基本设计。● 了解计算机编程语言的形式和功能。● 开始使用Python编程语言。● 学习混沌模型及其对计算的影响。1.1 通用机器

几乎每个人都用过计算机。也许你玩过计算机游戏,或曾用计算机写文章、在线购物、听音乐,或通过社交媒体与朋友联系。计算机被用于预测天气、设计飞机、制作电影、经营企业、完成金融交易和控制工厂等。

你是否停下来想过,计算机到底是什么?一个设备如何能执行这么多不同的任务?学习计算机和计算机编程就从这些基本问题开始。

现代计算机可以被定义为“在可改变的程序的控制下,存储和操纵信息的机器”。该定义有两个关键要素。第一,计算机是用于操纵信息的设备。这意味着我们可以将信息放入计算机,它可以将信息转换为新的、有用的形式,然后输出或显示信息,让我们解释。

第二,计算机不是唯一能操纵信息的机器。当你用简单的计算器来加一组数字时,就在输入信息(数字),计算器就在处理信息,计算连续的总和,然后显示。另一个简单的例子是油泵。给油箱加油时,油泵利用某些输入:当前每升汽油的价格和来自传感器的信号,读取汽油流入汽车油箱的速率。油泵将这个输入转换为加了多少汽油和应付多少钱的信息。

我们不会将计算器或油泵看作完整的计算机,尽管这些设备的现代版本实际上可能包含嵌入式计算机。它们与计算机不同,它们被构建为执行单个特定任务。这就是定义的第二部分出现的地方:计算机在可改变的程序的控制下运行。这到底是什么意思?“计算机程序”是一组详细的分步指令,告诉计算机确切地做什么。如果我们改变程序,计算机就会执行不同的动作序列,因而执行不同的任务。正是这种灵活性,让计算机在一个时刻是文字处理器,在下一个时刻是金融顾问,后来又变成一个街机游戏。机器保持不变,但控制机器的程序改变了。

每台计算机只是“执行”(运行)程序的机器。有许多不同种类的计算机。你可能熟悉Macintosh、PC、笔记本计算机、平板计算机和智能手机,但不论实际上还是理论上,都有数千种其他类型的计算机。计算机科学有一个了不起的发现,即认识到所有这些不同的计算机具有相同的力量,通过适当的编程,每台计算机基本上可以做任何其他计算机可以做的事情。在这个意义上说,放在你的办公桌上的PC实际上是一台通用机器。它可以做任何你想要它做的事,只要你能足够详细地描述要完成的任务。现在它是一台强大的机器!1.2 程序的力量

你已经知道了计算的一个要点:“软件”(程序)主宰“硬件”(物理机器)。软件决定计算机可以做什么。没有软件,计算机只是昂贵的镇纸。创建软件的过程称为“编程”,这是本书的主要关注点。

计算机编程是一项具有挑战性的活动。良好的编程既要有全局观,又要注意细节。不是每个人都有天赋成为一流的程序员,正如不是每个人都具备成为专业运动员的技能。然而,几乎任何人都可以学习如何为计算机编程。只要有一点耐心和努力,本书将帮助你成为一名程序员。

学习编程有很多好理由。编程是计算机科学的一个基本组成部分,因此对所有立志成为计算机专业人员的人都很重要。但其他人也可以从编程经验中受益。计算机已经成为我们社会中的常见工具。要理解这个工具的优点和局限性,就需要理解编程。非程序员经常觉得他们是计算机的奴隶。然而,程序员是真正的控制者。如果你希望成为一个更聪明的计算机用户,本书就是为你准备的。

编程也有很多乐趣。这是一项智力活动,让人们通过有用的、有时非常漂亮的创作来表达自己。不管你信不信,许多人确实爱好编写计算机程序。编程也会培养有价值的问题解决技能,特别是将复杂系统分解为一些可理解的子系统及其交互,从而分析复杂系统的能力。

你可能知道,程序员有很大的市场需求。不少文科生已经将一些计算机编程课程作为一种有利可图的职业选择。计算机在当今的商业世界中如此常见,以至于理解计算机和编程的能力可能就会让你在竞争中占据优势,不论你是何种职业。灵感迸发时,你就准备好写出下一个杀手级应用程序了。1.3 什么是计算机科学

你可能会惊讶地得知,计算机科学不是研究计算机的。著名计算机科学家Edsger Dijkstra曾经说过,计算机之于计算机科学,正如望远镜之于天文学。计算机是计算机科学中的重要工具,但它本身不是研究的对象。由于计算机可以执行我们描述的任何过程,所以真正的问题是:“我们可以描述什么过程?”换句话说,计算机科学的根本问题就是“可以计算什么”。计算机科学家利用许多研究技术来回答这个问题。其中三种主要技术是设计、分析和实验。

证明某个问题可以解决的一种方式就是实际设计解决方案。也就是说,我们开发了一个逐步的过程,以实现期望的结果。计算机科学家称之为“算法”。这是一个奇特的词,基本上意味着“菜谱”。算法设计是计算机科学中最重要的方面之一。在本书中,你会看到设计和实现算法的技术。

设计有一个弱点,它只能回答“什么是可计算的”。如果可以设计一个算法,那么问题是可解的。然而,未能找到算法并不意味着问题是不可解的。这可能意味着我只是不够聪明,或者碰巧还没有找到正确的想法。这就是引入分析的原因。

分析是以数学方式检查算法和问题的过程。计算机科学家已经指出,一些看似简单的问题不能通过任何算法解决。另一些问题是“难解的”(intractable)。解决这些问题的算法需要太长时间,或者需要太多存储器,因而没有实际价值。算法分析是计算机科学的重要组成部分,在整本书中,我们将探讨一些基本原则。第13章有不可解决和难解问题的例子。

一些问题太复杂或定义不明确,无法分析。在这种情况下,计算机科学家就依靠实验。他们实际实现一些系统,然后研究结果的行为。即使在进行理论分析时,也经常需要实验来验证和完善分析。对于大多数问题,底线是能否构建一个可靠的工作系统。通常我们需要对系统进行经验性测试,以确定这个底线已经满足。当你开始编写自己的程序时,会有很多机会观察你的解决方案的表现。

我已经从设计、分析和评估算法的角度定义了计算机科学,这当然是该学科的核心。然而,当今计算机科学家参与广泛的活动,所有这些活动都在计算这把大伞之下。一些例子包括移动计算、网络、人机交互、人工智能、计算科学(使用强大的计算机来模拟科学过程)、数据库和数据挖掘、软件工程、网络和多媒体设计、音乐制作、管理信息系统和计算机安全。无论在何处进行计算,计算机科学的技能和知识都有应用。1.4 硬件基础

你不必知道计算机工作的所有细节,也能成为一名成功的程序员,但了解基本原理将有助于掌握让程序运行所需的步骤。这有点像驾驶汽车。了解一点内燃机知识,有助于解释为什么必须做一些事情,如加油、点火、踩油门等。你可以通过记住要做什么来学习驾驶,但拥有更多知识会让整个过程更容易理解。让我们花一点时间来看看计算机的内部构造。

虽然不同计算机在具体细节上会显著不同,但在更高的层面上,所有现代数字计算机是非常相似的。图1.1展示了计算机的功能视图。中央处理单元(CPU)是机器的“大脑”。这是计算机执行所有基本操作的地方。CPU可以执行简单的算术运算,如两个数相加,也可以执行逻辑操作,如测试两个数是否相等。图1.1 计算机的功能视图

存储器存储程序和数据。CPU只能直接访问存储在“主存储器”(称为RAM,即随机存取存储器)中的信息。主存储器速度快,但它也是易失性存储。也就是说,当电源关闭时,存储器中的信息会丢失。因此,还必须有一些辅助存储器,提供永久的存储。

在现代个人计算机中,主要的辅助存储器通常是内部的硬盘驱动器(HDD)或固态驱动器(SSD)。HDD将信息以磁模式存储在旋转磁盘上,而SSD使用称为闪存的电子电路。大多数计算机还支持可移动介质作为辅助存储器,如USB存储“棒”(也是一种形式的闪存)和DVD数字多功能光盘,后者以光学模式存储信息,由激光读取和写入。

人类通过输入和输出设备与计算机交互。你可能熟悉常见的设备,如键盘、鼠标和显示器(视频屏幕)。来自输入设备的信息由CPU处理,并可以被移动到主存储器或辅助存储器。类似地,需要显示信息时,CPU将它发送到一个或多个输出设备。

那么,你启动最喜欢的游戏或文字处理程序时,会发生什么?构成程序的指令从(更)持久的辅助存储器复制到计算机的主存储器中。一旦指令被加载,CPU就开始执行程序。

技术上,CPU遵循的过程称为“读取—执行循环”。从存储器取得第一条指令,解码以弄清楚它代表什么,并且执行适当的动作。然后,取得并解码和执行下一条指令。循环继续,指令接着指令。这确实是所有的计算机从你打开它直到再次关闭时做的事情:读取指令、解码、执行。这看起来不太令人兴奋,是吗?但计算机能以惊人的速度执行这个简单的指令流,每秒完成数十亿条指令。将足够多的简单指令以正确的方式放在一起,计算机完成了惊人的工作。1.5 编程语言

请记住,程序只是一系列指令,告诉计算机做什么。显然,我们需要用计算机可以理解的语言来提供这些指令。如果可以用我们的母语告诉计算机做什么,就像科幻电影中那样,当然很好。(“计算机,曲速引擎全速到达行星Alphalpha需要多长时间?”)计算机科学家在这个方向上取得了长足的进步。你可能熟悉Siri(Apple)、Google Now(Android)和Cortana(Microsoft)等技术。但是,所有认真使用过这种系统的人都可以证明,设计一个完全理解人类语言的计算机程序仍然是一个未解决的问题。

即使计算机可以理解我们,人类语言也不太适合描述复杂的算法。自然语言充满了模糊和不精确。例如,如果我说“I saw the man in the park with the telescope”,是我拥有望远镜,还是那个人拥有望远镜?谁在公园里?我们大多数时间都相互理解,因为所有人都拥有广泛的共同知识和经验。但即便如此,误解也是很常见的。

计算机科学家已经设计了一些符号,以准确无二义的方式来表示计算,从而绕过了这个问题。这些特殊符号称为编程语言。编程语言中的每个结构都有精确的形式(它的“语法”)和精确的含义(它的“语义”)。编程语言就像一种规则,用于编写计算机将遵循的指令。实际上,程序员通常将他们的程序称为“计算机代码”(computer code),用编程语言来编写算法的过程被称为“编码”(coding)。[1]

Python是一种编程语言,它是我们在本书中使用的语言。你可能已经听说过其他一些常用的语言,如C ++、Java、Javascript、Ruby、Perl、Scheme和BASIC。计算机科学家已经开发了成千上万种编程语言,而且语言本身随着时间演变,产生多个、有时非常不同的版本。虽然这些语言在许多细节上不同,但它们都有明确定义的、无二义的语法和语义。

上面提到的所有语言都是高级计算机语言的例子。虽然它们是精确的,但它们的设计目的是让人使用和理解。严格地说,计算机硬件只能理解一种非常低级的语言,称为“机器语言”。

假设我们希望让计算机对两个数求和。CPU实际执行的指令可能是这样的:将内存位置2001的数加载到CPU中将内存位置2002的数加载到CPU中在CPU中对这两个数求和将结果存储到位置2003

两个数求和似乎有很多工作,不是吗?实际上,它甚至比这更复杂,因为指令和数字以二进制符号表示(即0和1的序列)。

在Python这样的高级语言中,两个数求和可以更自然地表达为c = a + b。这让我们更容易理解,但我们需要一些方法,将高级语言翻译成计算机可以执行的机器语言。有两种方法可以做到这一点:高级语言可以被“编译”或“解释”。“编译器”是一个复杂的计算机程序,它接受另一个以高级语言编写的程序,并将其翻译成以某个计算机的机器语言表达的等效程序。图1.2展示了编译过程的框图。高级程序被称为“源代码”,得到的“机器代码”是计算机可以直接执行的程序。图中的虚线表示机器代码的执行(也称为“运行程序”)。图1.2 编译高级语言“解释器”是一个程序,它模拟能理解高级语言的计算机。解释器不是将源程序翻译成机器语言的等效程序,而是根据需要一条一条地分析和执行源代码指令。图1.3展示了这个过程。图1.3 解释高级语言

解释和编译之间的区别在于,编译是一次性翻译。一旦程序被编译,它可以重复运行而不需要编译器或源代码。在解释的情况下,每次程序运行时都需要解释器和源代码。编译的程序往往更快,因为翻译是一次完成的,但是解释语言让它们拥有更灵活的编程环境,因为程序可以交互式开发和运行。

翻译过程突出了高级语言对机器语言的另一个优点:可移植性。计算机的机器语言由特定CPU的设计者创建。每种类型的计算机都有自己的机器语言。笔记本计算机中的Intel i7处理器程序不能直接在智能手机的ARMv8 CPU上运行。不同的是,以高级语言编写的程序可以在许多不同种类的计算机上运行,只要存在合适的编译器或解释器(这只是另一个程序)。因此,我可以在我的笔记本计算机和平板计算机上运行完全相同的Python程序。尽管它们有不同的CPU,但都运行着Python解释器。1.6 Python的“魔法”

在你已了解了所有技术细节后,就可以开始享受Python的乐趣了。最终的目标是让计算机按我们的要求办事。为此,我们将编写控制机器内部计算过程的程序。你已经看到,这个过程中没有魔法,但编程的某些方面让人感觉像魔法。

计算机内部的计算过程就像一些魔法精灵,我们可以利用它们为我们工作。不幸的是,这些精灵只能理解一种非常神秘的语言,而我们不懂。我们需要一个友好的小仙子,能指导这些精灵实现我们的愿望。我们的小仙子是一个Python解释器。我们可以向Python解释器发出指令,并指导下面的精灵来执行我们的需求。我们通过一种特殊的法术和咒语(即Python)与小仙子沟通。开始学习Python的最好方法是将我们的小仙子放出瓶子,尝试一些法术。

对于大多数Python安装,你可以用交互模式启动Python解释器,这称为shell。shell允许你键入Python命令,然后显示执行它们的结果。启动shell的具体细节因不同安装而异。如果你使用来自www.python.org的PC或Mac的标准Python发行版,应该有一个名为IDLE的应用程序,它提供了Python shell,正如我们稍后会看到,它还可以帮助你创建和编辑自己的Python程序。本书的支持网站提供了在各种平台上安装和使用Python的信息。

当你第一次启动IDLE(或另一个Python shell),应该看到如下信息:Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06)[MSC v.1600 32 bit (Intel)] on win32Type "copyright", "credits" or "license()" for more information.>>>

确切的启动消息取决于你正在运行的Python版本和你正在使用的系统。重要的部分是最后一行。>>>是一个Python提示符,表示我们的小仙子(Python解释器)正在等待我们给它一个命令。在编程语言中,一个完整的命令称为语句。

下面是与Python shell交互的例子:>>> print("Hello, World!")Hello, World!>>> print(2 + 3)5>>> print("2 + 3 =", 2 + 3)2 + 3 = 5

这里,我尝试了三个使用Python的print语句的例子。第一个print语句要求Python显示文本短语Hello, World!。Python在下一行做出响应,打印出该短语。第二个print语句要求Python打印2与3之和。第三个print结合了这两个想法。Python打印出引号中的部分“2 + 3 =”,然后是2 + 3的结果,即5。

这种shell交互是在Python中尝试新东西的好方法。交互式会话的片段散布在本书中。如果你在示例中看到Python提示符>>>,这就告诉你正在展示交互式会话。启动自己的Python shell并尝试这些例子,是一个好主意。

通常,我们希望超越单行的代码片段,并执行整个语句序列。Python允许我们将一系列语句放在一起,创建一个全新的命令或函数。下面的例子创建了一个名为hello的新函数:>>> def hello(): print("Hello") print("Computers are fun!")>>>

第一行告诉Python,我们正在定义一个新函数,命名为hello。接下来两行缩进,表明它们是hello函数的一部分。(注意:有些shell会在缩进行的开头打印省略号[“...”])。最后的空白行(通过按两次键获得)让Python知道定义已完成,并且shell用另一个提示符进行响应。注意,键入定义并不会导致Python打印任何东西。我们告诉Python,当hello函数用作命令时应该发生什么,但实际上并没有要求Python执行它。

键入函数名称并跟上括号,函数就被调用了。下面是使用hello命令时发生的事情:>>> hello()HelloComputers are fun!>>>

你看到这完成了什么?hello函数定义中的两个print语句按顺序执行了。

你可能对定义中的括号和hello的使用感到好奇。命令可以有可变部分,称为参数(也称为变元),放在括号中。让我们看一个使用参数、自定义问候语的例子。先是定义:>>> def greet(person): print("Hello", person) print("How are you?")

现在我们可以使用定制的问候。>>> greet("John")Hello JohnHow are you?>>> greet("Emily")Hello EmilyHow are you?>>>

你能看到这里发生了什么吗?使用greet时,我们可以发送不同的名称,从而自定义结果。你可能也注意到,这看起来类似于之前的print语句。在Python中,print是一个内置函数的例子。当我们调用print函数时,括号中的参数告诉函数要打印什么。

我们将在后面详细讨论参数。目前重要的是要记住,执行一个函数时,括号必须包含在函数名之后。即使没有给出参数也是如此。例如,你可以使用print而不使用任何参数,创建一个空白的输出行。>>> print()>>>

但是如果你只键入函数的名称,省略括号,函数将不会真正执行。相反,交互式Python会话将显示一些输出,表明名称所引用的函数,如下面的交互所示:>>> greet>>> print

有趣的文本0x8393aec是在计算机存储器中的位置(地址),其中恰好存储了greet函数的定义。如果你在自己的计算机上尝试,几乎肯定会看到不同的地址。

将函数交互式地输入到Python shell中,像我们的hello和greet示例那样,这存在一个问题:当我们退出shell时,定义会丢失。如果我们下次希望再次使用它们,必须重新键入。程序的创建通常是将定义写入独立的文件,称为“模块”或“脚本”。此文件保存在辅助存储器中,所以可以反复使用。

模块文件只是一个文本文件,你可以用任何应用程序来编辑文本,例如记事本或文字处理程序,只要将程序保存为“纯文本”文件即可。有一种特殊类型的应用称为集成开发环境(IDE),它们简化了这个过程。IDE专门设计用于帮助程序员编写程序,包括自动缩进、颜色高亮显示和交互式开发等功能。IDLE是一个很好的例子。到目前为止,我们只将IDLE作为一个Python shell,但它实际上是一个简[2]单却完整的开发环境。

让我们编写并运行一个完整的程序,从而说明模块文件的使用。我们的程序将探索一个被称为混沌(chaos)的数学概念。要将此程序键入IDLE,应选择File/New File菜单选项。这将打开一个空白(非shell)窗口,你可以在其中键入程序。下面是程序的Python代码:# File: chaos.py# A simple program illustrating chaotic behavior.def main(): print("This program illustrates a chaotic function") x = eval(input("Enter a number between 0 and 1: ")) for i in range(10): x = 3.9 * x * (1 - x) print(x)main()

键入它之后,从菜单中选择File/Save,并保存为chaos.py。扩展名.py表示这是一个Python模块。在保存程序时要小心。有时IDLE默认会在系统范围的Python文件夹中启动。要确保导航到你保存自己文件的文件夹。我建议将所有Python程序放在一个专用的文件夹中,放在你自己的个人文档目录中。

此时,你可能正试图理解刚刚输入的内容。你可以看到,这个特定的例子包含了几行代码,定义了一个新函数main。(程序通常放在一个名为main的函数中。)文件的最后一行是调用此函数的命令。如果你不明白main实际上做了什么,也不要担心,我们将在下一节中讨论它。这里的要点在于,一旦我们将一个程序保存在这样的模块文件中,就可以随时运行它。

我们的程序能以许多不同的方式运行,这取决于你使用的实际操作系统和编程环境。如果你使用的是窗口系统,则可以通过单击(或双击)模块文件的图标来运行Python程序。在命令行情况下,可以键入像python chaos.py这样的命令。使用IDLE时,只需从模块窗口菜单中选择Run/Run Module即可运行程序。按下键是该操作的方便快捷方式。

IDLE运行程序时,控制将切换到shell窗口。下面是看起来的样子:>>> ======================= RESTART =======================>>>This program illustrates a chaotic functionEnter a number between 0 and 1: .250.731250.766441406250.69813501043853750.82189581879023040.57089401919693170.95539874836420990.1661867219544130.54041791206179260.96862893029980420.11850901017563877>>>

第一行是来自IDLE的通知,表明shell已重新启动。IDLE在每次运行程序时都会这样做,这样程序就运行在一个干净的环境中。Python然后从上至下逐行运行该模块。这就像我们在交互式Python提示符下逐行键入它们一样。模块中的def会导致Python创建main函数。这个模块的最后一行导致Python调用main函数,从而运行我们的程序。正在运行的程序要求用户输入一个介于0和1之间的数字(在这个例子中,我键入“.25”),然后打印出10个数字的序列。

如果浏览计算机上的文件,你可能会注意到,Python有时会在存储模块文件的文件夹中创建另一个名为pycache的文件夹。这里是Python存储伴随文件的地方,伴随文件的扩展名为.pyc。在本例中,Python可能会创建另一个名为chaos.pyc的文件。这是Python解释器使用的中间文件。从技术上讲,Python采用混合编译/解释的过程。模块文件中的Python源代码被编译为较原始的指令,称为字节代码。然后解释这个字节代码(.pyc)。如果有.pyc文件可用,则第二次运行模块就会更快。但是,如果要节省磁盘空间,你可以删除字节代码文件。Python会根据需要自动重新创建它们。

在IDLE下运行模块,会将程序加载到shell窗口中。你可以要求Python执行main命令,从而再次运行该程序。只需在shell提示符下键入命令。继续我们的例子,下面是我们重新运行程序时它的样子,以“.26”作为输入:>>> main()This program illustrates a chaotic functionEnter a number between 0 and 1: .260.750360.730547494560.7677066257330.69549933390.8259420407340.5606709657210.9606442322820.1474468759350.4902545493760.974629602149>>>1.7 Python程序内部

chaos程序的输出可能看起来不太令人兴奋,但它说明了物理学家和数学家已知的一个非常有趣的现象。让我们逐行来看这个程序,看看它做了什么。不要担心不能马上理解每个细节,我们将在下一章重新探讨所有这些想法。

程序的前两行以#字符开头:# File: chaos.py# A simple program illustrating chaotic behavior.

这些行称为“注释”。它们是为程序的人类读者编写的,会被Python忽略。Python解释器总是跳过从井号(#)到行末之间的所有文本。

程序的下一行开始定义一个名为main的函数:def main():

严格地说,不需要创建main函数。因为模块的代码行在加载时会被执行,所以我们可以在没有这个定义的情况下编写我们的程序。也就是说,模块可能看起来像下面这样:# File: chaos.py# A simple program illustrating chaotic behavior.print("This program illustrates a chaotic function")x = eval(input("Enter a number between 0 and 1: "))for i in range(10): x = 3.9 * x * (1 - x) print(x)

这个版本更短一些,但惯例是将包含程序的指令放在main函数内部。上面展示了这种方法的一个直接好处:它允许我们通过调用main()来运行程序。我们不必重新启动Python shell就能再次运行它,这在没有main的情况下是不行的。

main内部的第一行是程序真正的开始。print("This program illustrates a chaotic function")

这行导致Python打印一个消息,在程序运行时介绍它自己。

看看程序的下一行:x = eval(input("Enter a number between 0 and 1: "))

这里的x是变量的示例。变量为值提供了一个名称,以便我们在程序的其他位置引用它。

整行是一个语句,从用户那里获得一些输入。这一行内容有点多,我们将在下一章讨论它的细节。现在,你只需要知道它完成了什么。当Python遇到该语句时,它显示引号内的消息“Enter a number between 0 and 1:”并暂停,等待用户在键盘上键入内容,然后按键。随后用户键入的值保存为变量x。在上面显示的第一个例子中,用户输入了“.25”,它成为x的值。

下一个语句是循环的示例。for i in range(10):

循环是一种策略,它告诉Python重复做同样的事情。这个特定的循环说要做某事10次。在循环头下缩进的几行,是要执行10次的语句。它们构成了循环体。x = 3.9 * x * (1 - x)print(x)

循环的效果完全一样,就像我们将循环体写了10次:x = 3.9 * x * (1 - x)print(x)x = 3.9 * x * (1 - x)print(x)x = 3.9 * x * (1 - x)print(x)x = 3.9 * x * (1 - x)print(x)x = 3.9 * x * (1 - x)print(x)x = 3.9 * x * (1 - x)print(x)x = 3.9 * x * (1 - x)print(x)x = 3.9 * x * (1 - x)print(x)x = 3.9 * x * (1 - x)print(x)x = 3.9 * x * (1 - x)print(x)

显然,使用循环为程序员省却了很多麻烦。

但是这些语句究竟做了什么?第一句执行了计算:x = 3.9 * x * (1 - x)

这被称为“赋值”语句。“=”右侧的部分是一个数学表达式。Python使用“*”字符表示乘法。回想一下,x的值是0.25(来自上面的input)。计算的值为3.9(0.25)(1 – 0.25),即0.73125。一旦计算出右侧的值,它就被保存为(或赋值给)出现在“=”左侧的变量,在这个例子中是x。x的新值(0.73125)替换了旧值(0.25)。

循环体中的第二行是我们之前遇到的一种语句类型,即print语句。print(x)

Python执行此语句时,屏幕上将显示x的当前值。所以第一个输出的数是0.73125。

记住,循环要执行10次。打印x的值后,循环的两个语句再次执行。x = 3.9 * x * (1 - x)print(x)

当然,现在x的值为0.73125,所以公式计算新的x值为3.9(0.73125)(1 – 0.73125),它是0.76644140625。

你能看到每次循环时如何用x的当前值来计算一个新值吗?这是示例运行中数字的来源。你可以针对一个不同的输入值(例如0.5)尝试执行程序的步骤,然后用Python运行该程序,看看你模拟计算机的情况。1.8 混沌与计算机

我在前面说过,chaos程序展示了一个有趣的现象。满屏幕的数字哪里有趣?如果你自己尝试这个程序会发现,无论从什么数字开始,结果总是相似的:程序吐出10个似乎随机的数字,在0和1之间。随着程序运行,x的值似乎跳来跳去,好吧,像混沌一样。

由该程序计算的函数具有一般形式k(x)(1–x),k在这个例子中是3.9。这被称为逻辑函数。它模拟某些类型的不稳定电子电路,并且有时也在限制条件下模拟群体变化。重复应用逻辑函数可以产生混沌。虽然我们的程序有一个明确的底层行为,但输出似乎不可预测。

混沌函数有一个有趣的属性,即随着公式被重复应用,初始值的非常小的差异可以导致结果的巨大差异。你可以在chaos程序中看到这一点,只需输入稍微不同的数字。以下是修改后的程序的输出,显示了初始值为0.25和0.26的结果:input 0.25 0.26--------------------------- 0.731250 0.750360 0.766441 0.730547 0.698135 0.767707 0.821896 0.695499 0.570894 0.825942 0.955399 0.560671 0.166187 0.960644 0.540418 0.147447 0.968629 0.490255 0.118509 0.974630

使用非常相似的起始值,输出在几个迭代中保持相似,然后就显著不同了。大约到第五次迭代,两个模型之间就似乎没有任何关系了。

我们的chaos程序的这两个特征,即显然不可预测性和对初始值的极端敏感性,是混沌行为的标志。混沌对计算机科学有重要的影响。事实证明,在现实世界中,我们可能希望用计算机建模和预测的许多现象就是这种混沌行为。你可能听说过所谓的蝴蝶效应。用于模拟和预测天气模式的计算机模型是如此敏感,以至于一只蝴蝶在新泽西拍打翅膀,可能会影响伊利诺州皮奥里亚(Peoria)是否下雨的预测。

很可能即使有完美的计算机建模,我们也永远不能准确地测量已有的天气条件,从而提前几天预测天气。测量就是不够精确,不能让预测在较长时间内准确。

如你所见,这个小程序给计算机用户上了有价值的一课。尽管计算机如此神奇,但它们给出的结果只是与程序所基于的数学模型一样有用。计算机可能由于程序错误而给出不正确的结果,但如果模型错误或初始输入不够精确,即使正确的程序也可能产生错误的结果。1.9 小结

本章介绍了计算机、计算机科学和编程。下面是一些关键概念的小结。● 计算机是一种通用的信息处理机器。它能执行可以充分详细描述

的任何过程。用于解决特定问题的步骤序列的描述称为算法。算

法可以变成软件(程序),确定硬件(物理机)能做什么和做了

什么。创建软件的过程称为编程。● 计算机科学研究什么可以计算。计算机科学家使用设计、分析和

实验技术。计算机科学是更广泛的计算领域的基础,其中包括的

领域如网络、数据库和信息管理系统等。● 计算机系统的基本功能视图包括中央处理单元(CPU)、主存储

器、辅助存储器以及输入和输出设备。CPU是计算机的大脑,执

行简单算术和逻辑运算。CPU操作的信息(数据和程序)存储在

主存储器(RAM)中。更多的永久信息存储在辅助存储设备

上,如磁盘、闪存和光学设备。信息通过输入设备进入计算机,

而输出设备显示结果。● 程序使用形式表示法来编写,这称为编程语言。有许多不同的语

言,但都具有精确的语法(形式)和语义(意义)的属性。计算

机硬件只能理解一种非常低级的语言,称为机器语言。程序通常

使用面向人类的高级语言(如Python)编写。高级语言必须被编

译或解释,以便计算机能够理解它。高级语言比机器语言更容易

移植。● Python是一种解释型语言。了解Python的一个好方法是使用交互

式shell进行实验。标准Python发布版包括一个名为IDLE的程序,

它提供了一个shell以及编辑Python程序的工具。● Python程序是一个命令序列(称为语句),供Python解释器执行。

Python包括了一些语句来完成工作,如打印输出到屏幕、从用户

获取输入、计算数学表达式的值以及多次执行一系列语句(循

环)。● 如果输入中的非常小的变化导致结果的大变化,让它们看起来是

随机的或不可预测的,则该数学模型被称为混沌。许多现实世界

现象的模型表现出混沌行为,这让计算的力量受到一些限制。1.10 练习复习问题判断对错

1.计算机科学是计算机的研究。

2.CPU是计算机的“大脑”。

3.辅助存储器也称为RAM。

4.计算机当前正在处理的所有信息都存储在主存储器中。

5.语言的语法是它的意思,语义是它的形式。

6.函数定义是定义新命令的语句序列。

7.编程环境是指程序员工作的地方。

8.变量用于给一个值赋予一个名称,这样它就可以在其他地方被引用。

9.循环用于跳过程序的一部分。

10.混沌函数不能由计算机计算。多项选择

1.计算机科学的根本问题是    。

a.计算机的计算速度有多快  

b.可以计算什么

c.什么是最有效的编程语言  

d.程序员可以赚多少钱

2.算法类似于    。

a.报纸     

b.捕蝇草     

c.鼓         

d.菜谱

3.一个问题是难解的,如果    。

a.你不能反转其解决方案    

b.涉及拖拉机

c.它有很多解决方案      

d.解决它不实际

4.以下    项不是辅助存储器。

a.RAM   

b.硬盘驱动器   

c.USB闪存驱动器   

d.DVD

5.设计来让人类使用和理解的计算机语言是    。

a.自然语言          

b.高级计算机语言

c.机器语言          

d.提取—执行语言

6.语句是    。

a.机器语言的翻译      

b.完整的计算机命令

c.问题的精确描述      

d.算法的一部分

7.编译器和解释器之间的一个区别是    。

a.编译器是一个程序      

b.使用编译器将高级语言翻译成机器语言

c.在程序翻译之后不再需要编译器

d.编译器处理源代码

8.按照惯例,程序的语句通常放在一个函数中,该函数名为    。

a.import   

b.main     

c.program     

d.IDLE

9.关于注释,以下不正确的是    。

a.它们让程序更有效率

b.它们是为人类读者

c.它们被Python忽略

d.在Python中,它们以井号(#)开头

10.函数定义的括号中列出的项被称为    。

a.括号

b.参数

c.变元

d.b和c项都是正确的讨论

1.比较并对比本章中的以下概念对。

a.硬件与软件

b.算法与程序

c.编程语言与自然语言

d.高级语言与机器语言

e.解释器与编译器

f.语法与语义

2.列出图1.1中计算机的5个基本功能单元,并用你自己的话并解释它们的作用。

3.写一个制作花生酱和果冻三明治(或其他日常活动)的详细算法。你应该假设正在与一个概念上能够完成该任务,但从来没有实际做过的人交谈。例如,你可能告诉一个小孩子怎么做。

4.正如你将在后续章节中学到的,存储在计算机中的许多数字不是精确的值,而是接近的近似值。例如,值0.1可能存储为0.10000000000000000555。通常,这样小的差异不是问题。然而,考虑到你在第1章中学到的混沌行为,你应该意识到在某些情况下需要谨慎。你能想到这可能是一个问题的例子吗?请说明。

5.使用0.15作为输入值,手动追踪第1.6节中的chaos程序。显示结果的输出序列。编程练习

1.启动交互式Python会话,并尝试键入以下每个命令。写下你看到的结果。

a.print("Hello, world!")

b.print("Hello", "world!")

c.print(3)

d.print(3.0)

e.print(2 + 3)

f.print(2.0 + 3.0)

g.print("2" + "3")

h.print("2 + 3 =", 2 + 3)

i.print(2 * 3)

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载