1.1 开始

1.1.0 写在前面

本文是我学习UCB CS61A的时候,由于我英文水平不好,翻译下来供我后边回看,其他想学cs61A的也可以有中文对照版,仅此而已。如果你在看的过程中,发现哪里有问题,欢迎提出来,我看到会修改的。
英文原文链接:UCB CS61A

计算机科学是一门非常广泛的学科。全球分布式系统、人工智能、机器人技术、图形学、安全、科学计算、计算机体系结构和数十个新兴子领域每年都会随着新技术和发现的出现而扩展。计算机科学的快速发展影响着人们生活的方方面面。商业、通信、科学、艺术、休闲和政治都已被重塑为计算领域。
计算机科学的高生产力之所以成为可能,是因为该学科建立在一套优雅而强大的基本思想之上。所有计算都从表示信息、指定处理信息的逻辑以及设计管理该逻辑复杂性的抽象开始。掌握这些基础知识将需要我们准确了解计算机如何解释计算机程序和执行计算过程。
长期以来,Harold Abelson 和 Gerald Jay Sussman 与 Julie Sussman 共同编写的经典教科书《计算机程序的结构和解释》(Structure and Interpretation of Computer Programs,SICP) 一直教授这些基本思想。本文大量借鉴了该教科书,原作者已根据知识共享许可授权改编和重复使用。

1.1.1 python编程

A language isn't something you learn so much as something you join.
—Arika Okrent

为了定义计算过程,我们需要一种程序设计语言;最好是大多数人和计算机都可以理解的。在本文中,我们会主要使用Python语言。
Python 是一种广泛使用的编程语言,它吸引了来自许多职业的爱好者:Web 程序员、游戏工程师、科学家、学者,甚至是新编程语言的设计者。当你学习Python,你加入了一个由百万开发者组成的社群。开发者客户群是非常重要的机构:成员会帮助他人解决问题,分享他们的工程和经验以及集体开发软件和工具。敬业的成员通常会因为他们的贡献而获得名人和广泛的尊重。
Python 语言本身是一个大型志愿者社区的产物,该社区以其贡献者的多样性而自豪。该语言由 Guido van Rossum 在 1980 年代后期构思并首次实现。他的 Python 3 教程的第一章解释了为什么 Python 在当今可用的众多语言中如此受欢迎。Python 特别适合本文,因为它广泛的功能集支持各种不同的编程风格,我们将对此进行探讨。虽然没有单一的 Python 编程方法,但开发人员社区共享了一组约定,这些约定有助于阅读、理解和扩展现有程序。Python 结合了极大的灵活性和可访问性,使学生能够探索许多编程范式,然后将他们新获得的知识应用于数千个正在进行的项目。
这些说明通过引入 Python 的功能以及抽象技术和严格的计算模型来保持 SICP 的精神。此外,这些说明还提供了 Python 编程的实用介绍,包括一些高级语言功能和说明性示例。随着您阅读文本的进度,自然而然地会提高您对 Python 的熟练程度。
开始使用 Python 编程的最佳方式是直接与解释器交互。本节介绍如何安装 Python 3、启动与解释器的交互式会话以及开始编程。

1.1.2 安装python3

和所有伟大的软件一样,Python有很多个版本。本文将会使用最新的稳定版Python3。很多电脑在先前已经装了更旧的Python版本,例如Python2.7,但是这些并不符合本文的描述。你可以使用任意电脑,但是确保你安装了Python3。(不必担心,Python是免费的)你可以从Python官网下载Python3版本。按照安装程序的说明完成安装。
有关进一步的指导,请尝试这些由 Julia Oh 创建的有关 Python 3 的 Windows 安装Mac 安装的视频教程。

1.1.3 互动会话

在交互式 Python 会话中,在提示符 >>> 后键入一些 Python 代码。Python 解释器 读取并执行您键入的内容,执行您的各种命令。
要启动交互式会话,请运行 Python 3 应用程序。在终端提示符 (Mac/Unix/Linux) 下键入 python3 或在 Windows 中打开 Python 3 应用程序。
如果您看到 Python 提示符 >>>,则表示您已成功启动交互式会话。这些注释描述了使用提示的示例交互,然后是一些输入。

>>> 2 + 2
4

交互式命令。每个会话都会保留您键入的内容的历史记录。要访问该历史记录,请按 <Control>-P(上一个)和 <Control>-N(下一个)。<Control>-D 退出会话,这将丢弃此历史记录。在某些系统上,向上和向下箭头还会循环显示历史记录。

1.1.4 第一个例子

想象力把事物的形态
呈现在人面前,而诗人的笔
则赋予它们一定的形状,
给虚无缥缈以居所与名称。
——威廉·莎士比亚, 《仲夏夜之梦》

为了给 Python 一个适当的介绍,我们将从一个使用多种语言功能的示例开始。在下一节中,我们将从头开始,一点一点地构建语言。将本节视为即将推出的功能的预览。
Python 内置了对各种常见编程活动的支持,例如作文本、显示图形以及通过 Internet 进行通信。下面这行python代码是一个 import 语句,用于加载访问 Internet 上数据的功能。特别是,它提供了一个名为 urlopen 的函数,该函数可以访问统一资源定位器 (URL) 上的内容,该 URL 是 Internet 上某个位置。

>>>from urllib.request import urlopen

语句和表达式:Python代码包含语句和表达式。从广义上讲,计算机程序包括:

  1. 计算一些值
  2. 执行一些指令

语句通常描述指令。当Python解释器执行一条语句的时候,计算机程序会执行对应的指令。另一方面,表达式通常表示计算。当Pythony计算一个表达式时,计算机程序会计算表达式的值。本章介绍几种类型的语句和表达式。

>>> shakespeare = urlopen('http://composingprograms.com/shakespeare.txt')

赋值语句把名字shakespeare与等号后面的表达式关联起来。该表达式将 urlopen 函数应用于包含威廉·莎士比亚 37 部戏剧的完整文本的 URL,所有这些内容都位于单个文本文档中。

函数:函数封装操作数据的逻辑。urlopen就是一个函数。网址是一段数据,而莎士比亚戏剧的文本是另一段数据。前者导致后者的过程可能很复杂,但我们可以仅用一个简单的表达式来应用这个过程,因为这种复杂性隐藏在一个函数中。函数是本章的主要主题。

>>> words = set(shakespeare.read().decode().split())

另一个赋值语句将名字words与莎士比亚的戏剧中出现的所有唯一单词的集合关联起来,总共有33,721个单词。readdecodesplit的命令链每个都作用于一个中间计算实体:我们从打开的 URL 中read数据,然后将数据decode为文本,最后将文本split为单词。所有这些单词都放在一个set中。
对象:set是一个对象,一个支持集合运算的对象,如计算交集和成员关系。一个对象以无缝的方式将数据和操作这些数据的逻辑结合在一起,从而管理两者的复杂性。对象是第二章的主要内容。

>>> {w for w in words if len(w) == 6 and w[::-1] in words}
{'redder', 'drawer', 'reward', 'diaper', 'repaid'}

最后,这个表达式是一个复合表达式,它返回所有莎士比亚戏剧单词中,反向拼写也出现在里面的单词。晦涩的符号 w[::-1] 枚举了单词中的每个字母,但 -1 指示反向移动。当您在交互式会话中输入表达式时,Python 会在下一行打印其值。

解释器:计算复合表达式需要一个精确的过程,以可预测的方式解释代码。实现此类过程(评估复合表达式)的程序称为解释器。解释器的设计和实现是第 3 章的主要主题。
与其他计算机程序相比,编程语言的解释器在其通用性上是独一无二的。Python 在设计时并没有考虑到莎士比亚。但是,它的巨大灵活性使我们能够仅使用少量语句和表达式处理大量文本。
最后,我们会发现所有这些核心概念都密切相关:函数是对象,对象是函数,解释器是两者的实例。但是,清楚地了解这些概念中的每一个及其在组织代码中的作用对于掌握编程艺术至关重要。

1.1.5 Errors

Python正等待你的命令。我们鼓励您尝试使用该语言,即使您可能还不了解其完整的词汇和结构。但是,请为错误做好准备。虽然计算机非常快速和灵活,但它们也非常僵化。在斯坦福大学的入门课程中,计算机的性质被描述为:

计算机的基本方程式是:
计算机 = 强大的 + 愚蠢的
计算机非常强大,可以非常快速地查看大量数据。计算机每秒可以执行数十亿次简单的操作。
计算机同样也非常愚蠢和脆弱。它只能执行一些非常僵化、简单且机械化的操作。计算机缺少像真正的洞察力之类的东西,它与电影中的HAL 9000完全不同。如果不出意外,你不应该被计算机吓倒,就好像它是某种大脑一样。这一切的背后都是非常机械的。
编程是一个人运用他们的真实洞察力来构建一些有用的东西,这些东西是由计算机能够执行的微小而简单的操作构成的。
—Francisco Cai 和 Nick Parlante,斯坦福大学 CS101

当您尝试使用 Python 解释器时,计算机的僵化将立即变得明显:即使是最小的拼写和格式更改也会导致意外的输出和错误。学习解释错误和诊断意外错误的原因称为调试。调试的一些指导原则是:

  1. 增量测试:每个编写良好的程序都由小型模块化组件组成,这些组件可以单独测试。尽快尝试您编写的所有内容,以便及早发现问题并增强对组件的信心。
  2. 隔离错误:语句输出中的错误通常可归因于特定的模块化组件。尝试诊断问题时,请先将错误跟踪到最小的代码片段,然后再尝试更正它。
  3. 检查您的假设:解释器确实会一字不假地执行您的指令——不多也不少。当某些代码的行为与程序员所认为(或假设)的行为不匹配时,它们的输出便会出乎意料。了解您的假设,然后将调试工作集中在验证这些假设是否真实有效上。
  4. 咨询他人:您并不孤单!如果您不理解错误消息,请询问朋友、讲师或搜索引擎。如果您已隔离了一个错误,但无法弄清楚如何更正它,请让其他人查看。在小组解决问题的过程中,会分享许多宝贵的编程知识。

增量测试、模块化设计、精确假设和团队合作是贯穿本文的主题。希望它们也能在您的计算机科学职业生涯中持续存在。

posted on 2025-04-16 18:19  学渣中的学霸  阅读(6)  评论(0)    收藏  举报