|
网上对cs61a评价 |
|
|
杭电学生写的学习cs61a经验 |
|
|
https://tutor.cs61a.org |
|
|
| 教材&参考资料 |
教材 Composing Programs中文翻译 |
|
|
本课程采用cs61a 2020spring前半学期python内容。推荐学习次序:上课(看lecture),看教材,做lab,做hw,做proj(做之前必须看tutorial pdf或网页文档,lab00 那里有所有的打包下载百度云链接)。 |
|
|
教材 Composing Programs 英文版 不用翻墙就可阅读 |
|
|
参考资料 Nanjing University SICP fa2021 |
|
|
UCB CS61A Structure and Interpretation of Computer Programs |
|
|
python官方教程 |
|
|
精译【UC Berkeley 公开课-CS61A (Spring 2021)】-中英双语字幕 |
|
|
【中文精翻|中文语音】[2023·CS61A |
|
|
| 评分标准&成绩查询 |
评分标准:实验prof成绩25% 平时机考成绩 25%期末笔试成绩50% |
本课程采用cs61a 2020spring前半学期python内容
- 3个项目proj( 实验课),每次满分100分,(项目)实验成绩占比25%。未经过答辩满分80 分,经过答辩和现场代码补全成绩80-100。每迟交一天满分扣2分, 最多扣 40 分。
- 平时考试,机试 3 次,每次满分 100 分,时长1小时,作弊当次计-100 分(占比 25%);(1)test01机考 考试题型具体分值 :简单WWPD题(教材代码改编) 3题 30分(拖拽填空);复杂 WWPD题1题 (同期末考试题库范围,出自2020mid4套卷子,原题小改编)15分(多项填空题); HW01HW02 原题考3题 55分(coderunner编程题)。(2)test02 待更新,依然会有WWPD(3)test03 待更新,依然会有WWPD
- 期末考试,笔试,满分100分,考试成绩占比50%。考试范围平时 HW、LAB题库和https://website.cs61a.org/resources/ cs61a官方对应章节历史试题。(重点发现、审核考试成绩和平时成绩不统一的学生平时代码是否存在抄袭)。考试AB卷 每个题库每卷 3题,总计 6 题。AB卷题目完全不重合。HW、LAB题库数量参考平时 HW、LAB 数量;历史试题题库范围为2020 年全年以及2019fall的midterm1 和 midterm2 (5套卷子30题左右)对应于授课章节的题目(考到面向对象和继承)。题库题目所在试卷以mt.pdf、mt1.pdf或mt2.pdf结尾。
如何避免抄袭/抄袭标准:最低标准为看过答案或他人代码后确保充分理解后,关闭所有参考代码,再开始coding。不要反复多次频繁查看。禁止复制粘贴任何他人代码。
本课程会对学生提交的代码采用https://theory.stanford.edu/~aiken/moss/ 进行抄袭检测。 |
|
评分标准:加分 |
- 根据6次HW,5次LAB或 cs61a历史题库,自愿撰写期末考试试题和机考题库(Moodel coderunner 题),每个合格题目,平时/实验成绩(机考+实验成绩)+2分,平时/实验成绩加到 100 分为止(因为 DeepSeek 的出现,平时成绩根据机试给出)。
-
目前 openEuler 社区里,专门以 Python 为主的实习小组是SIG-python-modules(Python 模块特别兴趣小组https://www.openeuler.openatom.cn/zh/sig/sig-python-modules)。根据社区最新信息,该小组正在进行的实习任务主要有:
🐍 SIG-python-modules 的实习任务
-
Python 软件包维护与升级:维护 openEuler 发行版中的 Python 软件包,包括修复 bug、升级版本、处理依赖关系等。
-
新 Python 软件包引入:将社区用户需要的 Python 包引入 openEuler,确保兼容性和稳定性。
-
Python 软件包测试:使用社区测试框架(如 mugen)编写测试用例,确保软件包质量。
🎯 如何参与
🔖 其他可能涉及 Python 的小组
除了 SIG-python-modules,以下小组的实习任务也可能涉及 Python:
建议直接访问 openEuler 实习官网,查看最新发布的实习任务列表,选择感兴趣的任务并联系导师报名参与。实习积分多少分,平时成绩加分=实习积分*5(只计算贡献代码以python为主的实习积分),平时成绩加到 100 分为止。mindspore实习也可以,自行查看加入方式。
|
|
查看平时成绩登记-WPS文档链接,请用校内统一登录wps账号后查看 |
|
|
| 加分:期末考试出题及moodle coderunner 题库 xml 文件撰写指南,先和我说打算模仿hw或者lab或者历史试卷的哪一道,大概改写思路,我说没问题再动手。每次test后只能出下次test的内容,加分截止为test3当日。 |
广东工业大学试卷及试卷答案模板 |
|
|
xml撰写指南 |
官方手册:https://trampgeek.github.io/moodle-qtype_coderunner/
官方 python xml 模板 https://github.com/trampgeek/moodle-qtype_coderunner/blob/master/samples/python3demoquizquestions.xml
1.题目类型:python3_cosc121。这是一种复杂的 Python3 题型,坎特伯雷大学 COSC121 课程的几乎所有题目都使用了这种题型。学生提交的题目首先要经过pylint 源代码分析器,如果 pylint 出现任何错误,则提交的题目会被拒绝。否则,测试将照常进行。显然,pylint需要安装在沙盒服务器上。这种题型需要使用许多不同的模板参数(请参阅“模板参数”部分了解这些参数的含义),以便将其用于解决各种不同的问题。例如,可以将其配置为要求或禁止特定的语言结构(例如,要求学生将for循环重写为while 循环),或将函数大小限制为给定值,或从学生的代码中剥离主函数,以便单独测试支持函数。有关如何使用此题型或任何其他题型的详细信息,可以通过展开题型编辑页面中的“题型详情”部分 找到。
2.Moodle CodeRunner 题目的 XML 结构示意图
<question type="coderunner"> │ ├─ <name> … </name> # 题目名字 命名规则 腾讯文档 作业号+题号+题目+分值+学号后四位 如 lab0101Fix the Bug (100pts)1234 │ ├─ <questiontext format="html"> # 题目描述 │ └─ <text><![CDATA[ … ]]></text> │ ├─ <generalfeedback format="html"> … </generalfeedback> │ ├─ <defaultgrade> … </defaultgrade> # 分值 ├─ <penalty> … </penalty> ├─ <hidden> … </hidden> │ ├─ <coderunnertype> … </coderunnertype> # 使用的 CodeRunner 题型 ├─ <prototypetype> … </prototypetype> ├─ <allornothing> … </allornothing> ├─ <penaltyregime> … </penaltyregime> ├─ <precheck> … </precheck> ├─ <showsource> … </showsource> │ ├─ <answerboxlines> … </answerboxlines> # 答题框行数 ├─ <answerboxcolumns> … </answerboxcolumns> ├─ <answerpreload> … </answerpreload> ├─ <useace> … </useace> # 是否用 Ace 编辑器 │ ├─ <answer><![CDATA[ … ]]></answer> # 标准答案 │ ├─ <validateonsave> … </validateonsave> │ ├─ <templateparams><![CDATA[{ … }]]></templateparams> │ # JSON 格式参数,如 requiredconstructs / proscribedconstructs │ ├─ <testcases> # 测试用例集合 │ ├─ <testcase … > │ │ ├─ <testcode><text>…</text></testcode> │ │ ├─ <stdin><text>…</text></stdin> │ │ ├─ <expected><text>…</text></expected> │ │ ├─ <extra><text>…</text></extra> │ │ └─ <display><text>SHOW</text></display> │ │ │ └─ <testcase … > … (更多测试) │ └─ </question>
3. 测试用例,除了 cs61a hw lab 提供的测试用例,要求至少多自创 1 个测试用例。
4. 考试前一周合格一题加 2 分,后面到考试前的周六加 1 分,临近的周日开始不加分(老师这时候已经开始自己动手改 xml 准备考试题了)。 |
|
| 01 Introduction & 技能补缺 |
HW00 shell cmd git |
|
|
lab00 环境配置说明(网址要翻墙,或见pdf),只有最后一步4.4判分命令--sumbit改--local不一样 |
|
|
lab00 环境配置说明(网址要翻墙,或见pdf),只有最后一步4.4判分命令--sumbit改--local不一样 |
|
|
lab hw proj tutorials 百度云打包下载 (第一次是lab00) |
|
|
lab hw proj code模板 百度云打包下载 已更新新OK (第一次是lab00.zip) |
|
|
python代码风格要求 |
|
|
python3速查卡cheetsheet |
|
|
01 introduction |
|
|
01 实验室demo |
|
|
教师主页及本科生进实验室说明 |
|
|
| 02 Names, Functions & Control |
可接受任意数量参数的函数;*:别只把它当乘号,还能打包和解包 |
|
|
Lab 01: Variables & Functions, Control tutorial 不能打开的用下方百度云下载pdf |
|
|
Hw 01: Variables & Functions, Control tutorial 不能打开的用下方百度云下载pdf |
|
|
lab hw proj tutorials 百度云打包下载 |
|
|
lab hw proj code模板 百度云打包下载 已更新新OK |
|
|
02-Names-and-Functions |
|
|
03 control |
|
|
lab00 lab01讲解 |
|
|
HW01讲解 |
|
|
| 03 Higher-order Functions & Env Diagrams 1 |
Lab 02: Higher-order Functions |
|
|
04-Environment-Diagrams |
|
|
lab02 |
|
|
高阶函数(嵌套定义函数) pythontutor 环境图 |
|
|
1.6.2求黄金分割率代码中为什么 update 能不断收敛呢? 换成其他方程 还成立么? |
update(x) = 1 + 1/x 能收敛到黄金比例,不是所有方程随便写成 \(x=f(x)\) 迭代就会收敛;不动点迭代有严格收敛条件。
1. 回顾:我们在做不动点迭代
我们的方程:
\(\phi^2=\phi+1 \implies \phi = 1+\frac1\phi\) 定义迭代函数
\(f(x)=1+\frac1x\) 迭代:\(x_{n+1}=f(x_n)\) 求不动点:\(x=f(x)\)
不动点:输入 x,经过 f 变换后输出仍然等于 x。
2. 不动点收敛定理(Banach 不动点 / 导数判据,一维简单版)
设 \(x^*\) 是不动点 \(x^*=f(x^*)\)。 如果在不动点附近满足:
\(\boldsymbol{|f'(x^*)| < 1}\) 那么从足够靠近 \(x^*\) 的初始值出发,迭代 \(x_{n+1}=f(x_n)\) 局部收敛; 如果 \(|f'(x^*)|>1\),局部发散。
直观理解:导数绝对值小于 1,每次迭代误差会被 “压缩”;大于 1,误差被放大,越迭代越远。
套入黄金比例例子
\(f(x)=1+\frac1x\) 求导:
\(f'(x) = -\frac{1}{x^2}\) 不动点 \(x^*=\phi=\frac{1+\sqrt5}{2}\approx1.618\)
\(|f'(\phi)|=\left|-\frac{1}{\phi^2}\right|=\frac{1}{\phi^2}\) 我们知道 \(\phi^2=\phi+1\approx2.618\)
\(\frac{1}{\phi^2}\approx0.382<1\) ✅ 满足 \(|f'(\phi)|<1\) → 局部收敛。 这就是为什么 golden_update 能不断逼近 phi。 负号代表:迭代值会在 phi 上下震荡,慢慢靠近(你前面看到的序列:1 →2→1.5→1.6667→1.6→1.625… 来回跳,振幅越来越小)。
3. 换成别的方程,还成立吗?
不成立!随便改写方程得到的 \(x=f(x)\) 很容易发散。
举同一个二次方程 \(\boldsymbol{x^2-x-1=0}\),我们换一种变形,构造另一个 update: 原方程:\(x^2 = x+1\) 变形方案 2:\(x=x^2-1\) 此时迭代函数 \(f(x)=x^2-1\),不动点同样满足 \(x=x^2-1\),解依然是\(\phi\)。
求导:\(f'(x)=2x\),在不动点\(\phi\approx1.618\)处
\(f'(\phi)=2\times1.618\approx3.236\)
\(|f'(\phi)|>1\) 👉 迭代会发散! 试一下,初始 guess=1: \(x_0=1\) \(x_1=1^2-1=0\) \(x_2=0^2-1=-1\) \(x_3=(-1)^2-1=0\) 陷入循环震荡,永远到不了 1.618。
同一个方程,不同代数变形得到不同迭代函数,有的收敛、有的不收敛。能不能收敛看不动点处导数绝对值。
4. 更多例子对比
- \(f(x)=\cos x\),不动点 \(x=\cos x\)。 \(f'(x)=-\sin x\),不动点附近\(|f'(x)|<1\),迭代收敛。
- \(f(x)=2x+1\),不动点 \(x=2x+1 \Rightarrow x=-1\)。 \(f'(x)=2, |f'|>1\),迭代发散。
5. 两个重要局限
- 局部收敛:只保证起点离根不远时收敛;如果初始 guess 离太远,依然可能发散。黄金比例这个迭代还好,正数起点基本都能收敛。
- 条件 \(|f'(x^*)|<1\) 是充分条件不是必要条件;少数情况导数 = 1 也可能收敛,但非常特殊。
6. 回到代码的结构
improve(update, close, guess=1)
improve 本身是通用迭代模板,它不管 update 会不会收敛! improve 只是机械循环:不断执行update直到close返回 True。
- 如果 update 收敛:正常拿到解;
- 如果 update 发散:死循环,永远不满足 close,程序卡住。
模板是中立工具;收敛性完全由你传入的 update 函数决定。
7. 补充:和牛顿法对比(拓展)
不动点迭代收敛速度一般比较慢;牛顿法是一种构造特殊 update 的不动点,保证更快收敛。
小结
golden_update 收敛根源:迭代函数 \(f(x)=1+1/x\) 在不动点\(\phi\)处导数绝对值\(<1\),误差逐轮压缩。
- 同一个代数方程,可以写成多种 \(x=f(x)\) 形式;只有满足导数判据的那个 update 才能收敛。
improve只是高阶函数循环框架,没有内置收敛保证,给它一个发散的 update 就会死循环。
|
|
可以接收其他函数作为参数或可以把函数当作返回值,两种高阶函数的区别和联系 |
1. 100000 项级数相加
summation( 1, pi_term) = 2.6666666667
summation( 10, pi_term) = 3.0916238067
summation( 100, pi_term) = 3.1365926848
summation( 1000, pi_term) = 3.1410926536
summation( 10000, pi_term) = 3.1415426536
summation(100000, pi_term) = 3.1415876536
真实 π = 3.1415926536
这就是 summation 的威力——你传多少项它就算多少项,10 万项也只是循环多转几圈。视频里字幕说 "Let's sum a million terms" 就是这个意思。
2. make_adder 和 pi_term 的关系
它们不是互相调用的关系,而是同一种角色(term)的不同实现:
summation 是一个"消费函数",它吃进去任何 term(k) -> number 的函数
pi_term(k) -> 算π的第k项 (手写好的 term)
identity(k) -> 返回k本身 (手写好的 term)
cube(k) -> 返回k³ (手写好的 term)
make_adder(3)(k) -> 返回k+3 (用工厂现造的 term)
它们都长一个样子:输入一个 k,输出一个数。所以都能传给 summation。
刚才验证了最后一行:
summation(10, make_adder(3)) # = 85
# 等于 (1+3)+(2+3)+...+(10+3) = 4+5+...+13 = 85
那 make_adder 到底比 pi_term 多了什么?
pi_term 是写死的——常数 8、4k-3、4k-1 都是固定的。如果你想算另一个类似的级数,就得手写一个新函数。
make_adder 是可配置的——你给不同的 n,它造出不同的函数:
add3 = make_adder(3) # 造出 k+3
add5 = make_adder(5) # 造出 k+5
add100 = make_adder(100) # 造出 k+100
summation(1000, add3) # 算 1000 项,每项 k+3
summation(1000, add5) # 算 1000 项,每项 k+5
summation(1000, add100) # 算 1000 项,每项 k+100
pi_term 是"一个函数干一件事",make_adder 是"一个函数干一类事"——这就是为什么讲完 summation 要接着讲 make_adder:summation 需要吃 term,而 make_adder 是批量生产 term 的工厂。 |
|
| 04 Higher-order Functions & Env Diagrams 2 |
Hw 02: Higher-order Functions |
|
|
04-Environment-Diagrams |
|
|
hw02讲解 |
|
|
匿名函数 lamda |
|
|
装饰器:不修改代码,就能改变函数功能的强大特性 |
|
|
| 040506 周 Proj 01: The Game of Hog |
Proj 01: The Game of Hog 提交 deadline 为实验课后一周 同一星期几的 24 点 后面每晚一天扣 2 分 最多扣40分。 |
|
|
proj 提交说明 |
https://leedong64.cn2.quickconnect.cn/homework/
用户名:qq 群公布的 密码:qq 群公布的
作业提交,不要压缩。
0.找到课程名称对应目录,本课程为 年份(如2026)+python
1.找到对应的目录,例如proj1等。进入该目录。再进入 1 班或 2 班目录。
2. 新建自己的目录,例如3120001234张三;或更改本地要上传到文件夹名为3120001234张三

3. 将所有需要上传的文件或文件夹拖进刚刚新建的自己的目录下,或将本地3120001234张三拖进当次作业目录下(如lab00)
目录下包括
1.ok评分截图(如下图的例子通过几个测试就相当于评分,另外截图要截到系统时间),按题号命名(新加入目录的文件)。

2.代码(要所有文件,包含当次如 proj1 整个模板目录 下所有文件)。 |
|
| 07 Recursion (Examples) |
Lab 03: Recursion and Tree Recursion |
|
|
Hw 03: Recursion and Tree Recursion |
|
|
lecture 06 |
|
|
lecture 07 |
|
|
| 08 Data Abstractions & Sequences& Containers |
lecture 08-Containers |
|
|
09-Data-Abstractions |
|
|
| 09 Trees |
Lab 04: Data Abstraction, Lists, and Trees |
|
|
Hw 04: Data Abstraction, Lists, and Trees |
|
|
10-Trees |
|
|
Trees |
|
|
| 09 Mutability |
11 mutable values |
|
|
Mutability-cn |
|
|
Q&A |
|
|
| 080910 周 Proj 02: Autocorrected Typing Software |
proj02: Autocorrected Typing Software |
|
|
| 11 Iterators & Lazy Evaluation |
Lab 05: Nonlocal, Iterators, and Generators |
|
|
Hw 05: Nonlocal, Iterators, and Generators |
|
|
13-Iterators |
|
|
13-Lazy-Evaluation |
|
|
Iterators-cn |
|
|
Generators-cn |
|
|
补充讲义4.2 隐式序列 |
|
|
| 111213 周 Proj 03: Ants vs. Some Bees |
Proj 03: Ants vs. Some Bees |
|
|
| 12 Object Oriented Programming |
14 OOP |
|
|
Objects |
|
|
Attributes-cn |
|
|
Q&A |
|
|
| 13 Inheritance |
Hw 06: OOP and Inheritance |
|
|
Lecture20Inheritance-cn |
|
|
Lecture21Representation-cn |
|
|
15-Inheritance |
|
|
专用方法/魔法方法 |
|
|
16-Sepcial-Methods |
|
|
| 13周 复习 HOF |
题库部分试题讲解 |
|
|
试卷题库(cs61a网站为准,这里可能不全) |
|
|
Exam Questions on Higher-Order Functions |
|
|
| 13周 复习 递归 |
题库部分试题讲解 |
|
|
试卷题库(cs61a网站为准,这里可能不全) |
|
|
Exam Questions on Recursion & Tree Recursion |
|
|
| 13周 复习 环境图 |
题库部分试题讲解 |
|
|
试卷题库(cs61a网站为准,这里可能不全) |
|
|
Exam Questions on Environment Diagrams |
|
|
| 补充资料 |
面向对象编程,一定要知道的类变量、类方法(装饰器 @classmethod)、静态方法@staticmethod |
|
|
生成器:处理大量数据时,节省内存和时间 |
|