【MVCD 2】

CS 41 完整课程内容整理

课程一:数据结构与面向对象编程(4月11日)

一、课程基本信息

  • 日期:2023年4月11日
  • 主题:数据结构与面向对象编程
  • 重要通知
    • Assignment 0周四截止
    • 今天是组队最后一天,需在Canvas注册小组
    • 周四在各自section教室见面(Arpit-Econ 206, Chase-380-381T, Will-Encina West 208)
    • Assignment 1(小组作业)周四发布

二、学习目标

学完本课后,学生将能够:

  1. 区分不同数据结构(lists、tuples、sets、dictionaries)及其属性和方法
  2. 根据具体任务选择合适的内置数据结构
  3. 设计和实现自定义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):可存储不同类型元素

不可变性的优势

  • 存储效率更高

  • 可哈希,能作为字典的键

  • 注意:元组存储的是不可变引用,但引用的对象本身可能可变

    python 复制代码
    tup = (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介绍

产品特点

  • 小型口袋大小的计算机
  • 专为学生学习编程和电子学设计

主要功能

  1. LED显示屏

    • 5x5 LED矩阵
    • 可显示文本、图像和动画
  2. 按钮

    • 两个可编程按钮
    • 可用作程序输入
  3. 加速度计

    • 检测运动和方向变化的传感器
  4. 指南针

    • 检测磁场方向的传感器
  5. 温度传感器

    • 测量环境温度
  6. 引脚(Pins)

    • 一组引脚可连接外部传感器、执行器和其他组件
GPIO引脚

定义

  • GPIO = General Purpose Input/Output(通用输入/输出)
  • 微控制器或计算机上的数字引脚
  • 可用于输入和输出操作

功能

  • 这些引脚可以利用输出和输入电压
  • 可以用代码处理
  • 帮助我们构建电路
  • 可与更传统的电路接口

五、实践演示

代码演示(Code Demo)

使用micro:bit进行实际编程演示

特殊导体实验

神秘的"幽灵"导体

  • 猜猜是什么?

⚠️ 警告

  • 这是危险的!
  • 仅在超低电流和电压下安全

人体导电原理

为什么人体能导电?

  1. 水是导体,因为它含有带电粒子或离子,可以在水中移动并传导电流
  2. 人体约60%是水!

实验主题:人体连接(Human Connection!!)


课程总结

核心要点

数据结构选择原则

根据数据的可变性、有序性、唯一性和访问模式需求选择:

  • 需要顺序和修改 → List
  • 需要不可变和哈希 → Tuple
  • 需要去重和快速查找 → Set
  • 需要键值映射 → Dictionary

面向对象编程

  • 类是对象的蓝图
  • 实例是类的具体实现
  • 使用魔术方法自定义对象行为

电子学基础

  • 电压、电流、电阻是电路的三大要素
  • 微控制器连接软件与硬件
  • 通过编程控制物理世界

课程进度

  • Assignment 0 → Assignment 1(小组作业)→ Assignment 2(电子学)
  • 从纯软件逐步过渡到软硬件结合
相关推荐
郝学胜-神的一滴1 天前
机器学习特征提取:TF-IDF模型详解与实践指南
开发语言·人工智能·python·程序人生·机器学习·tf-idf·sklearn
vibag1 天前
实现ReACT智能体
python·语言模型·langchain·大模型·langgraph
Kratzdisteln1 天前
【MVCD 6】
python
子夜江寒1 天前
OpenCV图像处理部分基础操作
图像处理·python·opencv
阿豪只会阿巴1 天前
【多喝热水系列】从零开始的ROS2之旅——Day5
c++·笔记·python·ubuntu·ros2
叫我:松哥1 天前
基于Spark智能推荐算法的农业作物推荐系统,推荐算法使用Spark ML风格推荐引擎
大数据·python·机器学习·spark-ml·spark·flask·推荐算法
2501_941875281 天前
从日志语义到可观测性的互联网工程表达升级与多语言实践分享随笔
java·前端·python
叫我:松哥1 天前
基于 Flask 的音乐推荐与可视化分析系统,包含用户、创作者、管理员三种角色,集成 ECharts 进行数据可视化,采用混合推荐算法
开发语言·python·信息可视化·flask·echarts·pandas·推荐算法
此剑之势丶愈斩愈烈1 天前
mybatis-plus乐观锁
开发语言·python·mybatis