节 名称 描述
网页 网上对cs61a评价

    

网页地址 杭电学生写的学习cs61a经验
网页地址 https://tutor.cs61a.org
教材&参考资料 网页地址 教材 Composing Programs中文翻译

https://composingprograms.netlify.app/

教材pdf下载 通过网盘分享的文件:讲义
链接: https://pan.baidu.com/s/1CEm_Xgy3qy7rdM5RRqRkgQ?pwd=hd31 提取码: hd31 
--来自百度网盘超级会员v7的分享

网页地址 本课程采用cs61a 2020spring前半学期python内容。推荐学习次序:上课(看lecture),看教材,做lab,做hw,做proj(做之前必须看tutorial pdf或网页文档,lab00 那里有所有的打包下载百度云链接)。

https://www.bilibili.com/video/BV1s3411G7yM 这个链接是所有不同年份cs61a中最全的,60+小时,除了lecture外,涵盖了lab和hw辅导等,大家可以按需学习,也可以一睹名校师生的整个教学学习过程。

https://web.archive.org/web/20210104105406/https://cs61a.org/

网页地址 教材 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内容

  1. 3个项目proj( 实验课),每次满分100分,(项目)实验成绩占比25%。未经过答辩满分80 分,经过答辩和现场代码补全成绩80-100。每迟交一天满分扣2分, 最多扣 40 分。
  2.  平时考试,机试 3 次,每次满分 100 分,时长1小时,作弊当次计-100 分(占比 25%);(1)test01机考 考试题型具体分值 :简单WWPD题(教材代码改编) 3题 30分(拖拽填空);复杂 WWPD题1题 (同期末考试题库范围,出自2020mid4套卷子,原题小改编)15分(多项填空题); HW01HW02 原题考3题 55分(coderunner编程题)。(2)test02 待更新,依然会有WWPD(3)test03 待更新,依然会有WWPD
  3. 期末考试,笔试,满分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/ 进行抄袭检测。

网页 评分标准:加分
  1. 根据6次HW,5次LAB或 cs61a历史题库,自愿撰写期末考试试题和机考题库(Moodel coderunner 题),每个合格题目,平时/实验成绩(机考+实验成绩)+2分,平时/实验成绩加到 100 分为止(因为 DeepSeek 的出现,平时成绩根据机试给出)。
  2. 目前 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)编写测试用例,确保软件包质量。

    🎯 如何参与

    • 官网:访问 openEuler 开源实习官网 查看最新的实习任务和报名方式。
    • 任务认领:在 src-openeuler 组织仓库 搜索带有 intern-python-modules 或 intern 标签的任务,选择感兴趣的任务进行认领。
    • 技能要求:熟悉 Python 编程,了解 Linux 基本操作和 Git 使用。

    🔖 其他可能涉及 Python 的小组

    除了 SIG-python-modules,以下小组的实习任务也可能涉及 Python:
    • SIG-BigData:大数据组件开发,部分任务使用 Python 进行脚本编写或组件集成。
    • SIG-Dev-Utils:开发工具、SDK 和库,部分工具可能使用 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
网页 教师主页及本科生进实验室说明

教师个人主页及研究简介

https://teacher.gdut.edu.cn/lidong/zh_CN/index.htm

大一升二暑期前标准完成下列课程作业0,其后标准为完成作业0、1、3、4.

https://courses.gdut.edu.cn/course/view.php?id=1602

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 环境图

高阶函数环境图

视频 环境 16分30秒截图 如何画环境图

网页 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. 更多例子对比

  1. \(f(x)=\cos x\),不动点 \(x=\cos x\)。 \(f'(x)=-\sin x\),不动点附近\(|f'(x)|<1\),迭代收敛。
  2. \(f(x)=2x+1\),不动点 \(x=2x+1 \Rightarrow x=-1\)。 \(f'(x)=2, |f'|>1\),迭代发散。

5. 两个重要局限

  1. 局部收敛:只保证起点离根不远时收敛;如果初始 guess 离太远,依然可能发散。黄金比例这个迭代还好,正数起点基本都能收敛。
  2. 条件 \(|f'(x^*)|<1\) 是充分条件不是必要条件;少数情况导数 = 1 也可能收敛,但非常特殊。

6. 回到代码的结构

improve(update, close, guess=1)

improve 本身是通用迭代模板,它不管 update 会不会收敛! improve 只是机械循环:不断执行update直到close返回 True。

  • 如果 update 收敛:正常拿到解;
  • 如果 update 发散:死循环,永远不满足 close,程序卡住。

模板是中立工具;收敛性完全由你传入的 update 函数决定。

7. 补充:和牛顿法对比(拓展)

不动点迭代收敛速度一般比较慢;牛顿法是一种构造特殊 update 的不动点,保证更快收敛。

小结

  1. golden_update 收敛根源:迭代函数 \(f(x)=1+1/x\) 在不动点\(\phi\)处导数绝对值\(<1\),误差逐轮压缩。
  2. 同一个代数方程,可以写成多种 \(x=f(x)\) 形式;只有满足导数判据的那个 update 才能收敛。
  3. 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

Fall 2020 Midterm 1: Q4 

  • Solutions 秦晴 
  •    
       
  •  

Summer 2020 Midterm 1: Q1 

Summer 2020 Midterm 1: Q2 

Spring 2020 Midterm 1: Q1 

Spring 2020 Midterm 1: Q2 

  • Solutions利羿夫
  •  
     

Spring 2020 Midterm 2: Q2 

  • Solutions 雷芊蕙
  •    
       
13周 复习 递归 网页 题库部分试题讲解
文件夹 试卷题库(cs61a网站为准,这里可能不全)
网页 Exam Questions on Recursion & Tree Recursion

Summer 2020 Practice Midterm: Q3 

  • Solutions魏晓琪
  •  
     

Summer 2020 Practice Midterm: Q4 

  • Solutions陈柳萤
  •  
     

Spring 2020 Midterm 2: Q2 

13周 复习 环境图 网页 题库部分试题讲解
文件夹 试卷题库(cs61a网站为准,这里可能不全)
网页 Exam Questions on Environment Diagrams
补充资料 网页 面向对象编程,一定要知道的类变量、类方法(装饰器 @classmethod)、静态方法@staticmethod

网页地址 生成器:处理大量数据时,节省内存和时间