CS61A-Structure and Interpretation of Computer Programs
# 前言
csdiy - 编程入门-python (opens new window)
CS61A: Structure and Interpretation of Computer Programs(SICP)
这不仅仅是一门编程语言课,而是会深入到程序构造与运行的原理。最后你将在第 4 个 Project 中用 Python 实现一个 Scheme 的解释器。此外,抽象将是这门课的一大主题,你将学习到函数式编程、数据抽象、面向对象等等知识来让你的代码更易读,更模块化。当然,学习编程语言也是这门课的一大内容,你将会掌握 Python、Scheme 和 SQL 这三种编程语言,在它们的学习和比较中,相信你会拥有快速掌握一门新的编程语言的能力。
课程简介
topic | CS61 系列是伯克利 CS 专业的入门课(编程语言:Python, Scheme, SQL) |
---|---|
CS61A | 强调抽象,让学生掌握用程序来解决实际问题,而不关注底层的硬件细节。 |
CS61B | 注重算法与数据结构以及大规模程序的构建,学生会用 Java 语言结合算法与数据结构的知识来构建千行代码级别的大型项目(一个简易的谷歌地图,一个二维版的 Minecraft)。 |
CS61C | 关注计算机体系结构,让学生理解高级语言(例如 C)是如何一步步转换为机器可以理解的 01 串并在 CPU 执行的,学生将会学习 RISC-V 架构并自己用 Logisim 实现一个 CPU。 |
# 资料
- 中文教材:https://composingprograms.netlify.app/ (opens new window)
- 【【计算机程序的构造和解释】精译【UC Berkeley 公开课-CS61A (Spring 2021)】-中英双语字幕】链接 (opens new window)
Tips
这门课主要围绕 Python 的一些基础语法来开展的,在后面涉及了一些函数式编程的东西。这门课核心还是以 homework 为主吧
# 语言基础
# 差异
- 在编程中,我们只会处理两种元素:函数和数据(数据是我们想要操作的东西,而函数是操作这些数据的规则的描述。)
- 编程语言就像是定义了一种积木的规范,大家都基于这种规范进行游戏/计算。大家都是基于类似的最小单位去完成一项作品,编写的程序就是我们对最小单元的计算过程。
- Python 代码风格指南 (opens new window),对函数的约束
- 抽象函数的各个方面:思考抽象函数的三个核心属性通常对掌握其使用很有帮助。函数的域 domain 是它可以接受的参数集合;范围 range 是它可以返回的值的集合;意图 intent 是计算输入和输出之间的关系(以及它可能产生的任何副作用),也即方法的描述/注释。
- 代码的具体实现就被函数抽象掉了,我们只需要关注输入输出以及“函数黑盒”的描述即可。类似自控原理里面的输入输出
- 从根本上说,好函数共有的品质就是:它们都强化了“函数就是抽象”的理念。
- 好函数具备良好的封装性。抽象出来就是一个完美黑盒
- 为函数编写文档doc是必不可少的
- 参数默认值
- 函数其实是一种抽象方法,它描述了与特定参数值无关的的复合操作。
- 一般来说,Python style 更喜欢使用明确的
def
语句而不是 lambda 表达式,但在需要简单函数作为参数或返回值的情况下可以使用它们。
Python 语言的交换很好用
>>> x, y = 3, 4.5
>>> y, x = x, y
>>> x
4.5
>>> y
3
2
3
4
5
6
了解此函数如何导入库文件
from math import pi
2
3
逻辑运算符也有所不同,不是||
或者&&
>>> True and False
False
>>> True or False
True
>>> not False
True
2
3
4
5
6
# 其他
# 柯里化
固定一个值,等于生成了N个不同的匿名函数
var foo = function(a) {
return function(b) {
return a * a + b * b;
}
}
2
3
4
5
# lambda
术语 lambda 是历史上的偶然事件,它源于书面数学符号与早期排版系统的不兼容性。
使用 lambda 来引入过程/函数似乎有些反常。
这个符号可以追溯到 Alonzo Church,他在 1930 年代以“帽子”符号开始,他将平方函数写为“ŷ . y × y”。
但沮丧的印刷者将帽子移到了参数的左侧,并将其更改为大写 lambda:“Λ y . y × y”;
从那时起,大写 lambda 被更改为小写,现在我们在数学书籍和
(lambda (y) (* y y))
Lisp 中看到“λ y . y × y”。— 彼得·诺维格 (norvig.com/lispy2.html)
一般来说,Python style 更喜欢使用明确的 def
语句而不是 lambda 表达式,但在需要简单函数作为参数或返回值的情况下可以使用它们。
lambda x : f(g(x))
"A function that takes x and returns f(g(x))"
2