[CS61A] Lecture 1&2&3. Introduction&Functions&Control

前言

CS61A是加州大学伯克利分校一门计算机专业课程,用于指导大一新生入门计算机科学这一门学科,这门课程以《计算机程序的构造与解释》(Structure and Interpretation of Computer Programs,SICP)这一计算机领域经典书籍为教纲,由浅入深详细地介绍了计算机程序的本质,并系统性地说明该如何编写一个健壮且易于维护的程序。不过,SCIP一书以Lisp的方言Scheme作为教学编程语言,由于Scheme过于小众化,CS61A以现今更为更为流行的Python作为教学编程语言,部分教纲略有变更。

CS61A包含了近四十节课,课程内容涵盖了编程语言的方方面面,每节课包含了lecture、discussion、lab、office hours、tutoring、textbook几部分,此外还包含了多个用来练手的homework和project。虽然CS61A是大一新生的计算机入门课程,已在计算机领域工作多年的职员依然可以学习这门课程,并从中学习到相当可观的知识。实际上,最初的SICP公开课的面相对象本就是惠普公司的员工。接下来,我将不定时总结观看CS61A网课视频中所获取的知识,并写在随笔中,以此温故而知新。

Lecture

Lecture 1. Introduction

CS61A的第一节课主要是做了些基本的介绍:

  • 三名课程讲师:Richard Roggenkemper、Laryn Qi、Cooper Bedin
  • 计算机科学的基本概念:计算什么问题?如何解决问题?现实中的应用?
  • CS61A介绍:一门用来控制编程复杂度(掌握抽象与编程范式)的课程

Lecture 2. Functions

CS61A第二节课的主题是函数(Functions),本节课首先从数学中的表达式(函数、平方、根号、加号、除号。。。)作为切入点,介绍了编程语言的基本概念:表达式,说明了表达式的结构、执行、复杂表达式的执行顺序等等。

其次介绍了赋值语句,赋值语句的本质是绑定,将一个值用一个符号绑定起来,随后便可以使用该符号表示对应的值。

接着介绍了函数,函数用来定义一段过程,其包含了一个或多个表达式,在定义一个函数后,便可以通过表达式执行它。

最后,讲师介绍了作用域的概念,每一个变量都拥有它的作用域,要么在全局作用域中,要么在函数或其他自定义的作用域中。解释器在搜索变量所绑定的值时,首先会搜索当前作用域,若搜索不到则会在上层作用域中搜索,直至全局作用域。

Q&A:作用域是什么?

Lecture 3. Control

CS61A第三节课的主题是流程控制(Control),大体包括如下内容:

  • print和None:介绍了在Python中print函数以及None的用法。
  • 纯函数与非纯函数:纯函数指除不对其他作用域作任何更改的函数,不为纯函数的函数则为非纯函数。这里的更改指外部变量的更改以及外部环境的变化等,例如:在函数中修改了一个外部变量a的值、print打印字符串等。
  • 函数的生命周期:函数定义和执行的过程。
  • 流程控制:if、elif、else、while
  • 课堂练习:输入一个正整数,找出该数因式分解得出的最长序列。例如:输入12,输出2、2、3;输入858,输出2、3、11、13。

Q&A:纯函数的理解?

Homework

CS61A的第一份作业:https://cs61a.org/hw/hw01/ ,Variables and Functions, Control,其中包含了四道题目。

Q1: A Plus Abs B

题目:输入两个自然数a和b,要求输出a与b的绝对值的和,即a+abs(b),注意不能使用内置库。

代码:

from operator import add, sub

def a_plus_abs_b(a, b):
"""Return a+abs(b), but without calling abs. >>> a_plus_abs_b(2, 3)
5
>>> a_plus_abs_b(2, -3)
5
>>> a_plus_abs_b(-1, 4)
3
>>> a_plus_abs_b(-1, -4)
3
"""
if b < 0:
f = sub
else:
f = add
return f(a, b)

Q2: Two of Three

题目:输入三个正数i、j、k,输出其中较小的两个数的平方和,注意函数体只允许一行代码。

代码:

def two_of_three(i, j, k):
"""Return m*m + n*n, where m and n are the two smallest members of the
positive numbers i, j, and k. >>> two_of_three(1, 2, 3)
5
>>> two_of_three(5, 3, 1)
10
>>> two_of_three(10, 2, 8)
68
>>> two_of_three(5, 5, 5)
50
"""
return i*i+j*j+k*k-max(i, j, k)*max(i, j, k)

Q3: Largest Factor

题目:输入一个正整数n,要求输出比n小且能被n整除的最大的数。

代码:

def largest_factor(n):
"""Return the largest factor of n that is smaller than n. >>> largest_factor(15) # factors are 1, 3, 5
5
>>> largest_factor(80) # factors are 1, 2, 4, 5, 8, 10, 16, 20, 40
40
>>> largest_factor(13) # factor is 1 since 13 is prime
1
"""
"*** YOUR CODE HERE ***"
res = n//2
while n % res != 0:
res -= 1
return res

Q4: Hailstone

题目:输入一个正整数n,给定如下计算过程:如果n是偶数,那么将n除以2;如果n是奇数,那么将n乘3并加1;如此往复直至n为1。现要求每次执行该计算过程时都将n的值打印在屏幕上,且返回计算的次数。

代码:

def hailstone(n):
"""Print the hailstone sequence starting at n and return its
length. >>> a = hailstone(10)
10
5
16
8
4
2
1
>>> a
7
>>> b = hailstone(1)
1
>>> b
1
"""
"*** YOUR CODE HERE ***"
print(n)
if n == 1:
return 1
return 1+hailstone(n//2 if n % 2 == 0 else n*3+1)

参考资料

2020年秋CS61A网课视频:https://www.bilibili.com/video/BV1s3411G7yM

SICP公开课:https://www.bilibili.com/video/BV1Xx41117tr

CS61A官网:https://cs61a.org/

CS61A指导资料(来自于伯克利的一名学生):https://cs61a.vanshaj.dev/

[CS61A] Lecture 1&2&3. Introduction&Functions&Control的更多相关文章

  1. [CS61A] Lecture 5&6&7. Environments & Design & Functions Examples & Homework 2: Higher Order Functions

    [CS61A] Lecture 5&6&7. Environments & Design & Functions Examples & Homework 2: ...

  2. [CS61A] Lecture 4. Higher-Order Functions & Project 1: The Game of Hog

    [CS61A] Lecture 4. Higher-Order Functions & Project 1: The Game of Hog Lecture Lecture 4. Higher ...

  3. INTRODUCTION TO BIOINFORMATICS

    INTRODUCTION TO BIOINFORMATICS      这套教程源自Youtube,算得上比较完整的生物信息学领域的视频教程,授课内容完整清晰,专题化的讲座形式,细节讲解比国内的京师大 ...

  4. Copy Control settings

    Copy Control settings     Skip to end of metadata   Created by Rajesh Banka, last modified by Jyoti ...

  5. ImageBox Control with Zoom/Pan Capability

    Download source files - 10.8 Kb Download demo project - 6.81 Kb Introduction This control extends th ...

  6. 深入理解typescript的Functions

    Functions Introduction # Functions are the fundamental building block of any application in JavaScri ...

  7. 南京大学 静态软件分析(static program analyzes)-- introduction 学习笔记

    一.Programming Languages体系 静态程序分析是编程语言中应用层面下的一个细分领域,它是一个非常重要的核心内容. 在理论部分,考虑的是如何设计一个语言的语法和语义,如何设计语言的类型 ...

  8. (转)Awesome Courses

    Awesome Courses  Introduction There is a lot of hidden treasure lying within university pages scatte ...

  9. [C2P3] Andrew Ng - Machine Learning

    ##Advice for Applying Machine Learning Applying machine learning in practice is not always straightf ...

随机推荐

  1. 尝试理解Linux容器进程与宿主机共享内核到底是什么意思?

    背景 近期接触容器技术时,经常看到各类比较容器与虚拟机区别的文章中会提到:容器是共享宿主机的内核,而虚拟机则是拥有自己独立的内核,所以不可能在Linux上用容器运行windows,但是用虚拟机则可以. ...

  2. liunx系统docker部署.net core3.1

    此篇文章演示基本的基于docker部署.netcore服务,liunx系统腾讯云ubuntu,.net core版本3.1. 1.安装docker apt install docker.io 2.拉取 ...

  3. 如何从零开始参与 Apache 顶级开源项目?| 墙裂推荐

    ​ 写在开头 从 2021 开始,有一个很有意思的说法经常在各大技术媒体或开源论坛中出现,「开源正在吞噬一切」.不论是否言过其实,从一个行业从业者的切身感知来看,开源确实从少数极客的小众文化成为主流的 ...

  4. jmeter性能测试之正则提取响应头或者响应体

    准备工作做好,先发送请求 然后察看结果树中的响应消息 比如我们要提取这个cookie,先调试一下,看能不能提取到 看蓝色的线条,我们提取到了,然后我们把这句话写入到后置处理器中的正则表达式提取里 再次 ...

  5. NLP新手入门指南|北大-TANGENT

    开源的学习资源:<NLP 新手入门指南>,项目作者为北京大学 TANGENT 实验室成员. 该指南主要提供了 NLP 学习入门引导.常见任务的开发实现.各大技术教程与文献的相关推荐等内容, ...

  6. 在Portainer上管理其他docker主机(这只是其中一种方式),另一种方式看这个文档:使用Portainer管理其他主机的docker应用有两种方式

    其他主机开启远程连接docker端口 需要设置一下2375端口的监听.通过修改docker配置文件方式进行监听. 修改配置文件修改监听端口 使用Centos7安装的docker,所以下面的配置是适用于 ...

  7. python 代码执行顺序

    Python代码在执行过程中,遵循下面的基本原则: 普通语句,直接执行: 碰到函数,将函数体载入内存,并不直接执行 碰到类,执行类内部的普通语句,但是类的方法只载入,不执行 碰到if.for等控制语句 ...

  8. SQL Server如何精准匹配字符中的字符,绝对匹配。

    举例: 我现在是需要查询这字段里包含1的数据 我如果直接charindex,那么11,12也会被包含. 解决(1): SELECT * FROM ( SELECT '1,2,12,111' AS st ...

  9. Mysql编程中遇到的小错误

    我在mysql中创建的数据库表语句为如下 create table grade (id int not null, name varchar(255), desc varchar(255), prim ...

  10. GO编译时不避免引入外部动态库的解决方法

    简介 最近碰到一个问题,有一个流量采集的组件中使用到了github.com/google/gopacket 这个库,这个库使用一切正常,但是唯独有一个缺点,编译后的二进制文件依赖于libpcap.so ...