CS 41 完整课程内容整理
课程一:数据结构与面向对象编程(4月11日)
一、课程基本信息
- 日期:2023年4月11日
- 主题:数据结构与面向对象编程
- 重要通知 :
- Assignment 0周四截止
- 今天是组队最后一天,需在Canvas注册小组
- 周四在各自section教室见面(Arpit-Econ 206, Chase-380-381T, Will-Encina West 208)
- Assignment 1(小组作业)周四发布
二、学习目标
学完本课后,学生将能够:
- 区分不同数据结构(lists、tuples、sets、dictionaries)及其属性和方法
- 根据具体任务选择合适的内置数据结构
- 设计和实现自定义Python对象(类)来增强Python功能
三、内置数据结构
核心特性对比表
| 数据结构 | 可变性 | 有序性 | 可迭代 | 查找复杂度 | 定界符 |
|---|---|---|---|---|---|
| List | ✔ | ✔ | 遍历元素 | O(n) | [] |
| Tuple | ✘ | ✔ | 遍历元素 | O(n) | () |
| Set | ✔ | ✘ | 遍历元素 | O(1) | {} |
| Dictionary | ✔ | ✘ | 遍历键 | O(1)键 | {} |
1. Lists(列表)
特点:
- 可变(mutable):创建后可修改
- 有序(ordered):有第0、1、2...个元素
- 异构(heterogeneous):可存储不同类型元素
常用方法:
.count(elem)- 计数元素出现次数.index(elem)- 返回首次出现的索引.append(elem)- 末尾添加元素 O(1).extend(iterable)- 扩展列表.insert(idx, elem)- 在指定位置插入.sort(key=None, reverse=False)- 原地排序elem in lst- 检查元素是否存在del lst[i]- 删除第i个元素.pop(i=-1)- 返回并删除元素.remove(elem)- 删除首个匹配元素 O(n)
2. Tuples(元组)
特点:
- 不可变(immutable):创建后不可修改(因此可哈希)
- 有序(ordered):有索引顺序
- 异构(heterogeneous):可存储不同类型元素
不可变性的优势:
-
存储效率更高
-
可哈希,能作为字典的键
-
注意:元组存储的是不可变引用,但引用的对象本身可能可变
pythontup = (1, 2, [3, 4]) tup[2].append(5) tup # => (1, 2, [3, 4, 5]) # 有效但不建议
3. Sets(集合)
特点:
- 可变(mutable):可添加/删除元素
- 无序(unordered):无索引概念
- 异构(heterogeneous):可存储不同类型
- 唯一性(unique):自动去重,元素必须可哈希
数学运算:
s & t- 交集s | t- 并集s < t- 真子集检查s <= t- 子集检查s ^ t- 对称差s - t- 差集
操作复杂度:
.add()- O(1).remove()- O(1)- 成员检查 - O(1)
4. Dictionaries(字典)
特点:
- 可变(mutable):可修改键值对
- 关联性(associative):通过键访问值,非位置索引
- 异构(heterogeneous):键值可为不同类型
- 键唯一(unique keys):每个键只能出现一次,键必须可哈希
常用方法:
val = d[key]- 访问值.copy()- 浅拷贝.get(key, default)- 安全获取值.keys()- 返回所有键.values()- 返回所有值.items()- 返回键值对元组.clear()- 清空字典.pop(key, default)- 删除并返回值
四、集合操作常用模式
基础操作
python
# 获取元素数量
len(collection)
# 遍历元素
for elem in collection:
...
# 从可迭代对象创建新数据结构
list("abcabc") # => ['a', 'b', 'c', 'a', 'b', 'c']
set("abcabc") # => {'a', 'b', 'c'}
# 枚举集合
enumerate(['a', 'b', 41]) # => <(0, 'a'), (1, 'b'), (2, 41)>
for i, elem in enumerate(['a', 'b', 41]):
...
高级操作
python
# 排序
sorted("cbda") # => ['a', 'b', 'c', 'd']
sorted("cbda", reverse=True) # => ['d', 'c', 'b', 'a']
# 配对组合
zip(['arpit', 'chase', 'will'], ['B+', 'A', 'A-'])
# => <('arpit', 'B+'), ('chase', 'A'), ('will', 'A-')>
for a, b in zip(collection1, collection2):
...
# 范围生成
range(a, b, c) # 从a(含)到b(不含),步长为c
range(3, 10, 2) # => <3, 5, 7, 9>
五、列表推导式(Comprehensions)
实例:奇数平方问题
问题:返回100以下所有奇数平方数
传统循环方法:
python
for i in range(loop_max):
if (i ** 2) % 2 != 0:
output.append(i ** 2)
推导式方法:
python
return [
i ** 2
for i in range(int(num ** (1/2)))
if (i ** 2) % 2 != 0
]
推导式语法结构
列表推导式:
python
[fn(x) for x in iterable if cond(x)]
[]- 方括号定义列表fn(x)- 应用的函数for x in iterable- 遍历可迭代对象if cond(x)- 可选的条件过滤
字典推导式:
python
{f(k): g(v) for k, v in iterable if cond(k, v)}
{}+:- 花括号+冒号定义字典
核心模式:遍历集合 → 检查条件 → 对元素应用操作
课程二:类与面向对象(接上节)
一、实际问题引入
Stanford学生课程管理系统设计
需要管理的实体:
学生(Student)属性:
- 姓名(字符串)
- SUNet ID(字符串)
- 已修课程集合
- 课程成绩
- 当前修读课程集合
课程(Course)属性:
- 课程ID(字符串)- 跨学期标识
- 院系(字符串)
- 课程号(字符串)
- 学期(字符串)
- 先修课程集合
- 当前注册学生集合
功能需求:
- 实现学生选课函数
- 检查先修课程要求
思考:应该用什么数据结构解决这个问题?
二、类的概念(Classes)
高层理解:房屋建造类比
类 = 蓝图(Blueprint)
python
class House:
utilities = {
'electricity': 'A&E #8675309',
'water': 'Palo Alto Mutual #6054756961'
}
def __init__(self):
self.locked = True
实例 = 实际房屋(Instance)
python
red = House()
blue = House()
green = House()
类的组成部分
1. 类属性(Class Attributes)
- 在所有实例间共享
python
House.utilities['electricity'] # => 'A&E #8675309'
red.utilities['electricity'] # => 'A&E #8675309'
green.utilities['electricity'] # => 'A&E #8675309'
2. 实例属性(Instance Attributes)
- 每个实例独有
python
red.locked # => True
blue.locked # => True
red.locked = False
blue.locked # => True # 不受red影响
注意:Python中所有属性都是公开的(public)
三、self参数详解
python
class House:
def __init__(self):
self.locked = True
self的含义:
- 方法的第一个参数是对象自身的引用
- 可以命名为任何名字,但传统上用
self - 适用于所有方法,不仅是
__init__
调用机制:
python
House.__init__ # => <function __init__(self)>
red = House()
red.__init__ # => <bound method House.__init__>
# 等价关系
instance.method(some_args) ~ function(instance, some_args)
四、自定义实例化
构造函数参数
python
class Student:
def __init__(self, name, sunet):
self.name = name.title()
# 验证SUNet
if not set(sunet) <= set('0123456789'):
raise ValueError(f"Invalid SUNet: {sunet}.")
self.sunet = sunet
使用示例:
python
parth = Student('parth sarin', 'noneya') # ValueError
tara = Student('tara jones', '5625165')
tara.name # => 'Tara Jones'
__init__可以像普通函数一样接受参数- 可以在构造时进行数据验证和处理
五、魔术方法(Magic Methods)
Python内置操作与魔术方法的对应
python
str(x) # => x.__str__()
x == y # => x.__eq__(y)
x < y # => x.__lt__(y)
x + y # => x.__add__(y)
next(x) # => x.__next__()
len(x) # => x.__len__()
hash(x) # => x.__hash__()
el in x # => x.__contains__(el)
特点:
- 以双下划线开头和结尾
- Python自动调用这些方法实现运算符和内置函数
- 可以自定义这些方法来控制对象行为
六、实战演示
演示项目:构建Axess系统
filter_pixels.py- 像素过滤odd_squares.py- 奇数平方axess.py- 学生课程管理系统
课程三:电子学入门(4月18日)
一、课程概述
电子学定义 :
处理电子(电)的行为和控制以及电子电路、设备和系统的设计与应用的物理学和工程学分支。
为什么CS 41要学电子学?
- 我们可以构建实体物品!(We can build physical stuff!!)
相关作业:
- Assignment 2 - augment.py
- 主题:在哪里制作电路?
二、电子学基础
电路的三大核心属性
1. 电流(Current)
- 电路中电子的流动
- 单位:安培(amperes/amps)
- 类比:电流像水流过管道,正如水需要管道流动,电流需要导线流动
2. 电压(Voltage)
- 电路中两点间的电势差
- 单位:伏特(volts)
- 作用:决定电流的流动
- 类比:电压是"推力",使电流通过电路流动。就像水在压力下流过管道,电流在电压作用下流过导线
3. 电阻(Resistance)
- 物体阻碍电流流动的特性
- 类比:像减速交通的路障。就像管道中狭窄或粗糙的部分使水流困难,电路中较高的电阻使电流更难流动
欧姆定律(Ohm's Law)
三个因素的关系:电压、电流、电阻
这些概念是电气工程的基础
三、电路基础概念
接地(Ground)
- 电路中的参考点或"零电压"点
- 作为电流返回电源的路径,完成电路回路
四、微控制器(Microcontroller)
定义 :
包含微处理器、内存和输入/输出外设的集成电路,能够执行指令并控制外部设备或系统。
Micro:bit V2介绍
产品特点:
- 小型口袋大小的计算机
- 专为学生学习编程和电子学设计
主要功能:
-
LED显示屏
- 5x5 LED矩阵
- 可显示文本、图像和动画
-
按钮
- 两个可编程按钮
- 可用作程序输入
-
加速度计
- 检测运动和方向变化的传感器
-
指南针
- 检测磁场方向的传感器
-
温度传感器
- 测量环境温度
-
引脚(Pins)
- 一组引脚可连接外部传感器、执行器和其他组件
GPIO引脚
定义:
- GPIO = General Purpose Input/Output(通用输入/输出)
- 微控制器或计算机上的数字引脚
- 可用于输入和输出操作
功能:
- 这些引脚可以利用输出和输入电压
- 可以用代码处理
- 帮助我们构建电路
- 可与更传统的电路接口
五、实践演示
代码演示(Code Demo)
使用micro:bit进行实际编程演示
特殊导体实验
神秘的"幽灵"导体
- 猜猜是什么?
⚠️ 警告:
- 这是危险的!
- 仅在超低电流和电压下安全
人体导电原理:
为什么人体能导电?
- 水是导体,因为它含有带电粒子或离子,可以在水中移动并传导电流
- 人体约60%是水!
实验主题:人体连接(Human Connection!!)
课程总结
核心要点
数据结构选择原则 :
根据数据的可变性、有序性、唯一性和访问模式需求选择:
- 需要顺序和修改 → List
- 需要不可变和哈希 → Tuple
- 需要去重和快速查找 → Set
- 需要键值映射 → Dictionary
面向对象编程:
- 类是对象的蓝图
- 实例是类的具体实现
- 使用魔术方法自定义对象行为
电子学基础:
- 电压、电流、电阻是电路的三大要素
- 微控制器连接软件与硬件
- 通过编程控制物理世界
课程进度
- Assignment 0 → Assignment 1(小组作业)→ Assignment 2(电子学)
- 从纯软件逐步过渡到软硬件结合