Tianyi's Blog Tianyi's Blog
首页
  • 计算机网络
  • 操作系统
  • 计算机科学
  • Nginx
  • Vue框架
  • 环境配置
  • Java
  • JVM
  • Spring框架
  • Redis
  • MySQL
  • RabbitMQ
  • Kafka
  • Mirror Sites
  • Dev Tools
  • Docker
  • Jenkins
  • Scripts
  • Windows
  • 科学上网
  • 旅行
  • 网站日记
  • 软件
  • 电子产品
  • 杂野
  • 分类
  • 友情链接
GitHub (opens new window)

Tianyi

一直向前,永不停止
首页
  • 计算机网络
  • 操作系统
  • 计算机科学
  • Nginx
  • Vue框架
  • 环境配置
  • Java
  • JVM
  • Spring框架
  • Redis
  • MySQL
  • RabbitMQ
  • Kafka
  • Mirror Sites
  • Dev Tools
  • Docker
  • Jenkins
  • Scripts
  • Windows
  • 科学上网
  • 旅行
  • 网站日记
  • 软件
  • 电子产品
  • 杂野
  • 分类
  • 友情链接
GitHub (opens new window)
  • 镜像站

  • 环境

  • Docker

  • 工具

  • Linux

  • 新知

    • MIT-Missing-Semester
    • MIT 6.031 SoftwareConstruction
    • CS61A-Structure and Interpretation of Computer Programs
      • 前言
        • 资料
      • 语言基础
        • 差异
        • 其他
        • 柯里化
        • lambda
      • 函数式编程
    • MIT Web Development Crash Course
    • Scheme函数式编程
    • Stanford CS142-Web Applications
  • Jenkins

  • Consul_服务注册发现

  • SHELL

  • 项目

  • 运维
  • 新知
tianyi
2024-01-08
目录

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
1
2
3
4
5
6

了解此函数如何导入库文件

from math import pi


1
2
3

逻辑运算符也有所不同,不是||或者&&

>>> True and False
False
>>> True or False
True
>>> not False
True
1
2
3
4
5
6

# 其他

# 柯里化

固定一个值,等于生成了N个不同的匿名函数

var foo = function(a) {
  return function(b) {
    return a * a + b * b;
  }
}
1
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))"
1
2

# 函数式编程

跳转至函数式编程

完善页面 (opens new window)
MIT 6.031 SoftwareConstruction
MIT Web Development Crash Course

← MIT 6.031 SoftwareConstruction MIT Web Development Crash Course→

最近更新
01
JDK
02-23
02
BadTasteCode && 优化
09-11
03
Gradle 实践操作指南及最佳实践
09-11
更多文章>
Theme by Vdoing | Copyright © 2021-2025 Tandy | 粤ICP备2023113440号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式