前 言Introduction to Programming in Python: An Interdisciplinary Approach21世纪以前的教育基础是“读、写和算术”,而现在的教育基础则是“读、写和计算”。学习编程是每个科学和工程专业学生教育过程中的重要部分。除了直接的应用外,学习编程是了解计算机科学本质的第一步。计算机科学对现代社会产生了毋庸置疑的影响。本书的目的是在科学环境中为需要编程或想学习编程的人讲授程序设计的基本方法和应用技巧。我们的主要目标是通过提供经验和必要的基本工具使得学生更加有效地进行计算。我们的方法是向学生灌输这样的理念:编写程序是一种自然而然、富有成就感和充满创造性的体验。我们将循序渐进地介绍基本概念,并使用应用数学和科学中的典型应用来阐述这些概念,并为学生提供编写程序以解决相关问题的机会。我们使用Python程序设计语言来编写本书中的所有程序—在本书的标题中,我们在“程序设计”之后提及“Python”以强调本书是关于程序设计的基本概念,而不仅仅是Python本身。这本书讲授了许多解决计算问题的基本技能,这些技能可以应用于许多现代计算环境中。本书自成体系,其目标人群是没有任何编程经验的人。相对于传统的CS1课程而言,本书提供了一种跨学科的方法。我们将重点讲述计算在其他学科(材料科学、基因组学、天体物理学、网络系统等)中的重要地位。跨学科的方法向学生强调一种基本思想,即在当今世界中,数学、科学、工程和计算紧密结合在一起。同时,作为CS1的课本,本书主要面向对数学、科学和工程感兴趣的大学一年级学生。当然,本书也可用于自学,或者作为程序设计与其他领域相结合的课程的补充材料。内容范围本书根据学习编程的四个阶段来组织:基本元素、函数和模块、面向对象的程序设计、算法和数据结构。在进入编程的下一阶段之前,我们将向读者提供他们需要的基本信息,使读者有信心编写每个阶段的程序。本书所讲授方法的基本特征是使用示例程序解决感兴趣的问题,并提供各种练习题,从自学练习题到需要创新解决方案的挑战性难题。基本元素包括变量、赋值语句、内置数据类型、控制流程、数组和输入输出,以及图形和声音。函数和模块为学生揭开了模块化程序设计的面纱。我们使用熟悉的数学函数来介绍Python函数,然后讨论使用函数编程的意义,包括库函数和递归函数。贯穿本书,我们强调一种基本理念,即把一个程序分解为可以独立调试、维护和重用的模块。面向对象的程序设计是我们对数据抽象的介绍。我们强调数据类型的概念,并使用Python的类机制实现数据类型。我们将教会学生如何使用、创建和设计数据类型。模块化、封装和其他现代程序设计理念是面向对象程序设计阶段的中心概念。算法和数据结构把这些现代程序设计理念与组织和处理数据的经典方法结合起来,因为经典方法依旧可以有效地用于现代应用程序。我们介绍了经典的排序和搜索算法,同时也介绍了基本的数据结构及其应用,强调了使用科学方法来理解实现的性能特征。在科学和工程中的应用是本书的一个主要特点。我们通过其对具体应用的影响来强调我们所讨论的每一个程序设计概念。我们的示例来源于应用数学、物理学、生物科学、计算机科学本身,并包括物理系统模拟、数值方法、数据可视化、声音合成、图像处理、金融模拟和信息技术。具体的示例包括第1章用于页面排名的马尔可夫链以及渗透问题、n体模拟、小世界现象的案例研究。这些应用都是正文不可分割的组成部分。它们为学生提供了资料,阐述程序设计概念的重要性,并提供了计算在现代科学和工程中扮演着重要角色的令人信服的证据。我们的主要目标是教授学生学会有效解决任何程序设计问题所需要的具体机制和技能。我们完全使用Python程序,并鼓励读者也使用Python程序。我们关注个人的程序设计,而不是大型的程序设计。本书在大学课程中的使用本书主要面向大学一年级课程,其目标是教授新生在科学应用的背景下进行程序设计。根据本书所讲授的内容,将来主修科学或工程技术的学生都将学会在熟悉的背景下学习程序设计。修完基于本书课程的学生将为在后续科学和工程技术课程中应用他们的技能做好准备,并会意识到本书所讲授的内容对进一步学习计算机科学是非常有益的。特别是将来主修计算机科学的学生将会受益于在科学应用的背景下学习程序设计。与生物学家、工程师和物理学家一样,计算机科学家在科学方法中也需要相同的基本背景,并且要承担科学计算的任务。实际上,跨学科的方法使得高等院校可给将来主修计算机科学或其他科学和工程技术的学生教授同一门课程。我们覆盖了CS1所规定的资料,但是我们对应用的关注给相关概念带来了生命,并激发了学生学习这些概念的兴趣。跨学科的方法向学生展示了许多不同学科中的问题,可帮助他们更明智地选择主修方向。无论采用哪种具体机制,本书的使用最好安排在全部课程的早期。首先,这种安排允许我们利用高中数学和科学中所熟悉的资料。其次,学生在大学课程的早期学习程序设计将帮助他们在继续学习专业课程时有效地使用计算机。像阅读和写作一样,程序设计很显然也是任何科学家和工程师的一项基本技能。掌握本书概念的学生将终生不断发展这种技能,在其各自所选择的领域中,他们能够利用计算来解决或更好地理解问题和项目,并从这一过程中受益。先修条件本书非常适合于科学和工程技术专业的大学一年级学生。也就是说,我们不需要其他的预备知识,本书的先修条件和其他入门级科学和数学课程的要求基本一致。完备的数学知识很重要。我们没有详细阐述相关的数学知识,但我们引用了学生在高中已经学习的数学课程,包括代数学、几何学和三角学。本书目标人群中的大多数学生都自动满足这些要求。事实上,我们充分利用了他们在基础课程中所熟悉的知识来介绍基本的编程概念。科学的求知欲也是一个重要的部分。科学和工程技术专业的学生天生对进行科学探究以帮助解释自然本质的能力非常着迷。我们使用简单的关于自然界的程序示例支持这种偏爱。本书任何特定的知识都没有超过高中课程中的数学、物理、生物和化学的知识范围。程序设计经验不是必需的,但却是有益的。讲授程序设计是我们的主要目标,因此本书没有要求任何先行的程序设计经验。然而,编写一个程序解决一个新问题是一项富有挑战性的智力任务,所以在高中阶段编写了许多程序的学生会从选修基于本书的程序设计入门课程中受益。本书可满足各种不同背景的学生的授课需求,因为本书中的应用无论对于新手还是专家都具有吸引力。使用计算机的经验也不是必需的,况且这根本不是问题。现在的大学生经常使用计算机与亲朋好友交流、听音乐、处理照片或进行许多其他活动。能够以有趣而又重要的方式驾驭自己的计算机需要扣人心弦和长期的训练。总之,几乎所有科学和工程技术领域的学生都可以在他们第一个学期的课表中选修基于本书的课程。目标在科学和工程技术专业的高级课程中,教师希望完成基于本书课程的学生学到什么样的知识呢?我们覆盖了CS1课程,但任何讲授入门级程序设计课程的教师都知道,教授后续课程的教师期望值很高:每个教师都希望学生已经熟悉所需使用的计算环境和方法。物理学教授可能期望某些学生在周末设计一个程序来运行模拟;工程学教授可能期望某些学生使用一个特定的软件包并基于数值方法求解微分方程;计算机科学教授可能期望学生掌握特定编程环境的详细知识。本书真的可以满足这些不同的期望吗?对于不同的学生群体,是否需要不同的入门级课程?自从20世纪后期计算机被广泛使用以来,高等院校就一直被这些类似问题困扰。对于这些问题,我们给出的解答是本书介绍通用的程序设计入门方法,类似于数学、物理学、生物学和化学中普遍接受的入门级课程。本书努力为科学和工程技术专业的学生提供必要的基本准备,同时也清楚地传递这样的信息:理解计算机科学比程序设计更重要。学习过本书的学生,教师可期望他们拥有适应于新的计算环境和在不同应用中有效利用计算机的必要知识和能力。完成基于本书课程的学生,他们期望在后续课程中学习到什么呢?我们的观点是程序设计并不难学,但学会驾驭计算机意义深远。在未来的职业生涯中,掌握了本书知识的学生已为应对计算挑战做好准备。他们了解现代程序设计环境(例如本书介绍的Python)将为未来可能遇见的任何计算问题打开一扇大门,同时他们也获得了学习、评价和使用其他计算工具的信心。对计算机科学感兴趣的学生将准备好进一步追寻这些兴趣,科学和工程技术专业的学生将准备好将计算融合到他们的研究中。本书官网在如下网站上,可以找到关于正文的大量补充信息:http:introcs.cs.princeton.edupython为了方便,我们把这个站点称为本书官网。该网站包含了为使用本书的教师、学生和其他读者准备的资料。我们在这里简要描述一下这些资料,虽然所有的Web用户都知道,最好的方法是通过浏览器纵览它们。除了少部分用于测试的资料,其他资料都是公开可用的。本书官网的一个最重要的意义是让教师和学生可以使用自己的计算机教授或学习这些资料。任何拥有计算机和浏览器的人,均可按照本书官网提供的一些指示开始学习程序设计。这个过程并不比下载一个媒体播放器或一首歌更困难。和任何其他网站一样,我们的网站也一直保持更新。对于任何拥有本书的人而言,本书官网是一个非常重要的资源。特别是补充材料对于我们达到如下目标至关重要,那就是使得计算机科学成为所有科学家和工程师教育不可分割的有机组成部分。对于教师,本书官网包含了与教学相关的信息。这些信息主要按照我们过去十几年开发的教学模式进行组织,我们每周为学生授课两次,并且每周对学生进行两次课外辅导,学生分成小组与任课教师或助教进行讨论。本书官网包括用于这些授课的演示幻灯片,教师可基于这些幻灯片根据需要进行补充和修改。对于助教,本书官网包含了详细的问题集和编程项目,它们均基于本书的习题,但包含更多的详细信息。每个程序设计任务作业旨在基于一个有趣的应用环境教授一个相关的概念,同时为每个学生提出一个引人入胜的挑战。课外作业的进展体现了我们的教学方法。本书官网全面详细地说明了所有的作业,并提供详细的结构化信息帮助学生在规定时间内完成任务,包括有关建议方法的描述,以及在课堂中应该讲述的授课内容纲要。对于学生,本书官网包含可快速访问的本书的大部分资料,包括源代码以及鼓励学生自学的额外资料。本书官网为书本中的许多习题提供了参考解答,包括完整的程序代码和测试数据。还有许多与程序设计作业相关的信息,包括建议的方法、检查清单、常见问题解答以及测试数据。对于一般读者,本书官网是访问与本书内容相关的所有额外信息的资源库。所有的网站内容都提供Web超链接和其他路径,以帮助读者寻找有关讨论主题的更多信息。网站包含了非常多的信息,比任何个人所能想象和接受的信息多得多,因为我们的目标是为本书内容提供足够多的信息,以满足每位读者的需求。致谢这个项目自1992年开始启动,迄今为止,许多人为这个项目的成功做出了贡献,我们在此对他们表示诚挚的感谢。特别感谢Anne Rogers的大力帮助,使本项目得以顺利启动;感谢Dave Hanson、Andrew Appel和Chris van Wyk耐心地解释数据的抽象化;还要感谢Lisa Worthington,她是第一个接受挑战,使用本书给大学一年级学生上课的老师。同时我们还要感谢dev126的努力;感谢过去25年中在普林斯顿大学致力于讲授本书内容的教师、研究生和教学人员;感谢成千上万努力学习本书的大学生们。Robert SedgewickKevin WayneRobert Dondero2015.4