来源:1.1 Introductionhtml
译者:飞龙python
协议:CC BY-NC-SA 4.0git
计算机科学是一个极其宽泛的学科。全球的分布式系统、人工智能、机器人、图形、安全、科学计算,计算机体系结构和许多新兴的二级领域,每一年都会因为新技术和新发现而扩展。计算机科学的快速发展普遍影响了人类生活。商业、通讯、科学、艺术、休闲和政治都被计算机领域完全改造。程序员
计算机科学的巨大生产力可能只是由于它构建在一系列优雅且强大的基础概念上。全部计算都以表达信息、指定处理它所需的逻辑、以及设计管理逻辑复杂性的抽象做为开始。对这些基础的掌握须要咱们精确理解计算机如何解释程序以及执行计算过程。github
这些基础概念在伯克利长期教授,使用由Harold Abelson、Gerald Jay Sussman和Julie Sussman创做的经典教科书《计算机科学的构造与解释》(SICP)。这个讲义大量借鉴了这本书,原做者慷慨地使它可用于改编和复用。编程
咱们的智力之旅一旦出发就不能回头了,咱们也永远都不该该对此有所期待。安全
咱们将要学习计算过程的概念。计算过程是计算机中的抽象事物。在演化中,过程操纵着叫作数据的其它事物。过程的演化由叫作程序的一系列规则主导。人们创造程序来主导过程。实际上,咱们使用咱们的咒语来凭空创造出计算机的灵魂。app
咱们用于创造过程的程序就像巫师的魔法。它们由一些古怪且深奥的编程语言中的符号表达式所组成,这些语言指定了咱们想让过程执行的任务。编程语言
在一台工做正确的计算机上,计算过程准确且严谨地执行程序。因此,就像巫师的学徒那样,程序员新手必须学会理解和预测他们的魔法产生的结果。编辑器
--Abelson & Sussman, SICP (1993)
语言并非你学到的东西,而是你参与的东西。
为了定义计算过程,咱们须要一种编程语言,最好是一种许多人和大量计算机都能懂的语言。这门课中,咱们将会使用Python语言。
Python是一种普遍使用的编程语言,而且在许多职业中都有它的爱好者:Web程序员、游戏工程师、科学家、学者,甚至新编程语言的设计师。当你学习Python时,你就加入到了一个数百万人的开发者社群。开发者社群是一个极其重要的组织:成员能够互相帮助来解决问题,分享他们的代码和经验,以及一块儿开发软件和工具。投入的成员常常因为他们的贡献而出名,而且收到普遍的尊重。也许有一天你会被提名为Python开发者精英。
Python语言自身就是一个大型志愿者社群的产物,而且为其贡献者的多元化而自豪。这种语言在20世纪80年代末由Guido van Rossum设计并首次实现。他的Python3教程的第一章解释了为何Python在当今众多语言之中如此流行。
Python适用于做为教学语言,由于纵观它的历史,Python的开发者强调了Python代码对人类的解释性,并在Python之禅中美观、简约和可读的原则下进一步增强。Python尤为适用于课堂,由于它宽泛的特性支持大量的不一样编程风格,咱们将要探索它们。在Python中编程没有单一的解法,可是有一些习俗在开发者社群之间流传,它们可使现有程序的阅读、理解,以及扩展变得容易。因此,Python的灵活性和易学性的组合可让学生们探索许多编程范式,以后将它们新学到的知识用于数千个正在开发的项目中。
这些讲义经过使用抽象设计的技巧和严谨的计算模型,来快速介绍Python的特性。此外,这些讲义提供了Python编程的实践简介,包含一些高级语言特性和展现示例。经过这门课,学习Python将会变成天然而然的事情。
然而,Python是一门生态丰富的语言,带有大量特性和用法。咱们讲到基本的计算机科学概念时,会刻意慢慢地介绍他们。对于有经验的学生,他们打算一口气学完语言的全部细节,咱们推荐他们阅读Mark Pilgrim的书Dive Into Python 3,它在网上能够免费阅读。这本书的主题跟这门课极其不一样,可是这本书包含了许多关于使用Python的宝贵的实用信息。事先告知:不像这些讲义,Dive Into Python 3须要一些编程经验。
开始在Python中编程的最佳方法就是直接和解释器交互。这一章会描述如何安装Python3,使用解释器开始交互式会话,以及开始编程。
就像全部伟大的软件同样,Python具备许多版本。这门课会使用Python3最新的稳定版本(本书编写时是3.2)。许多计算机都已经安装了Python的旧版本,可是它们可能不知足这门课。你应该能够在这门课上使用任何能安装Python3的计算机。不要担忧,Python是免费的。
Dive Into Python 3拥有一个为全部主流平台准备的详细的安装指南。这个指南屡次提到了Python3.1,可是你最好安装3.2(虽然它们的差别在这门课中很是微小)。EECS学院的全部教学机都已经安装了Python3.2。
在Python交互式会话中,你能够在提示符>>>
以后键入一些Python代码。Python解释器读取并计算你输入的东西,并执行你的各类命令。
有几种开始交互式会话的途径,而且具备不一样的特性。把它们尝试一遍来找出你最喜欢的方式。它们所有都在背后使用了相同的解释器(CPython)。
最简单且最广泛的方式就是运行Python3应用。在终端提示符后(Mac/Unix/Linux)键入python3
,或者在Windows上打开Python3应用。(译者注:Windows上设置完Python的环境变量以后,就能够在cmd
或PowerShell中执行相同操做了。)
有一个更加用户友好的应用叫作Idle3(idle3
),可用于学习这门语言。Idie会高亮你的代码(叫作语法高亮),弹出使用提示,而且标记一些错误的来源。Idle老是由Python自带,因此你已经安装它了。
Emacs编辑器能够在它的某个缓冲区中运行交互式会话。虽然它学习起来有些挑战,Emacs是个强大且多功能的编辑器,适用于任何语言。请阅读61A的Emacs教程来开始。许多程序员投入大量时间来学习Emacs,以后他们就再也不切换编辑器了。
在全部状况中,若是你看见了Python提示符>>>
,你就成功开启了交互式会话。这些讲义使用提示符来展现示例,同时带有一些输入。
>>> 2 + 2 4
控制:每一个会话都保留了你的历史输入。为了访问这些历史,须要按下<Control>-P
(上一个)和<Control>-N
(下一个)。<Control>-D
会退出会话,这会清除全部历史。
想像会把不知名的事物用一种形式呈现出来,诗人的笔再使它们具备如实的形象,空虚的无物也会有了居处和名字。
--威廉·莎士比亚,《仲夏夜之梦》
为了介绍Python,咱们会从一个使用多个语言特性的例子开始。下一节中,咱们会从零开始,一步一步构建整个语言。你能够将这章视为即将到来的特性的预览。
Python拥有常见编程功能的内建支持,例如文本操做、显示图形以及互联网通讯。导入语句
>>> from urllib.request import urlopen
为访问互联网上的数据加载功能。特别是,它提供了叫作urlopen
的函数,能够访问到统一资源定位器(URL)处的内容,它是互联网上的某个位置。
语句和表达式:Python代码包含语句和表达式。普遍地说,计算机程序包含的语句
计算某个值
或执行某个操做
语句一般用于描述操做。当Python解释器执行语句时,它执行相应操做。另外一方面,表达式一般描述产生值的运算。当Python计算表达式时,就会计算出它的值。这一章介绍了几种表达式和语句。
赋值语句
>>> shakespeare = urlopen('http://inst.eecs.berkeley.edu/~cs61a/fa11/shakespeare.txt')
将名称shakespeare
和后面的表达式的值关联起来。这个表达式在URL上调用urlopen
函数,URL包含了莎士比亚的37个剧本的完整文本,在单个文本文件中。
函数:函数封装了操做数据的逻辑。Web地址是一块数据,莎士比亚的剧本文本是另外一块数据。前者产生后者的过程可能有些复杂,可是咱们能够只经过一个表达式来调用它们,由于复杂性都塞进函数里了。函数是这一章的主要话题。
另外一个赋值语句
>>> words = set(shakespeare.read().decode().split())
将名称words
关联到出如今莎士比亚剧本中的全部去重词汇的集合,总计33,721个。这个命令链调用了read
、decode
和split
,每一个都操做衔接的计算实体:从URL读取的数据、解码为文本的数据、以及分割为单词的文本。全部这些单词都放在set
中。
对象:集合是一种对象,它支持取交和测试成员的操做。对象整合了数据和操做数据的逻辑,并以一种隐藏其复杂性的方式。对象是第二章的主要话题。
表达式
>>> {w for w in words if len(w) >= 5 and w[::-1] in words} {'madam', 'stink', 'leets', 'rever', 'drawer', 'stops', 'sessa', 'repaid', 'speed', 'redder', 'devil', 'minim', 'spots', 'asses', 'refer', 'lived', 'keels', 'diaper', 'sleek', 'steel', 'leper', 'level', 'deeps', 'repel', 'reward', 'knits'}
是一个复合表达式,计算出正序或倒序出现的“莎士比亚词汇”集合。神秘的记号w[::-1]
遍历单词中的每一个字符,然而-1
代表倒序遍历(::
表示第一个和最后一个单词都使用默认值)。当你在交互式会话中输入表达式时,Python会在随后打印出它的值,就像上面那样。
解释器:计算复合表达式须要可预测的过程来精确执行解释器的代码。执行这个过程,并计算复合表达式和语句的程序就叫解释器。解释器的设计与实现是第三章的主要话题。
与其它计算机程序相比,编程语言的解释器一般比较独特。Python在乎图上并无按照莎士比亚或者回文来设计,可是它极大的灵活性让咱们用极少的代码处理大量文本。
最后,咱们会发现,全部这些核心概念都是紧密相关的:函数是对象,对象是函数,解释器是两者的实例。然而,对这些概念,以及它们在代码组织中的做用的清晰理解,是掌握编程艺术的关键。
Python正在等待你的命令。你应当探索这门语言,即便你可能不知道完整的词汇和结构。可是,要为错误作好准备。虽然计算机极其迅速和灵活,它们也十分古板。在斯坦福的导论课中,计算机的本性描述为
计算机的基本等式是:
计算机 = 强大 + 笨拙
计算机很是强大,可以迅速搜索大量数据。计算机每秒能够执行数十亿次操做,其中每一个操做都很是简单。
计算机也很是笨拙和脆弱。它们所作的操做十分古板、简单和机械化。计算机缺乏任何相似真实洞察力的事情...它并不像电影中的HAL 9000。若是不出意外,你不该被计算机吓到,就像它拥有某种大脑同样。它在背后很是机械化。
程序是一我的使用他的真实洞察力来构建出的一些实用的东西,它由这些简单的小操做所组成。
—Francisco Cai & Nick Parlante, 斯坦福 CS101
在你实验Python解释器的时候,你会立刻意识到计算机的古板:即便最小的拼写和格式修改都会致使非预期的输出和错误。
学习解释错误和诊断非预期错误的缘由叫作调试(debugging)。它的一些指导原则是:
逐步测试:每一个写好的程序都由小型的组件模块组成,这些组件能够独立测试。尽快测试你写好的任何东西来及早捕获错误,而且从你的组件中得到自信。
隔离错误:复杂程序的输出、表达式、或语句中的错误,一般能够归于特定的组件模块。当尝试诊断问题时,在你可以尝试修正错误以前,必定要将它跟踪到最小的代码片断。
检查假设:解释器将你的指令执行为文字 -- 很少也很多。当一些代码不匹配程序员所相信的(或所假设的)行为,它们的输出就会是非预期的。了解你的假设,以后专一于验证你的假设是否整理来调试。
询问他人:你并非一我的!若是你不理解某个错误信息,能够询问朋友、导师或者搜索引擎。若是你隔离了一个错误,可是不知道如何改正,可让其它人来看一看。在小组问题解决中,会分享一大堆有价值的编程知识。
逐步测试、模块化设计、明确假设和团队做业是贯穿这门课的主题。希望它们也可以一直伴随你的计算机科学生涯。