Elemer

MIT 6.0001 Note

What is computation?

计算就像做菜 。你有原材料(数据),按照菜谱(算法)一步步操作,最后得到一盘菜(结果)。计算机就是个超级听话的厨师,你说什么它做什么,但它很”笨”——你得把每一步都说清楚,”加盐”不行,得说”加3克盐”。

Branching and Iteration

分支(if/else)= 人生的岔路口

走到路口,看天气:下雨→带伞,不下雨→不带伞。程序也一样,遇到条件就分岔。

python

if 下雨:
    带伞()
else:
    戴墨镜()

迭代(循环)= 刷碗

碗池里有10个碗,你得重复”拿起→洗→放下”这个动作10次。for循环就是”我知道要刷几个”,while循环是”刷到没碗为止”。

String Manipulation, Guess and Check, Approximations, Bisection

字符串 = 珠子串

“Hello”就是5颗珠子穿成的手链。你可以:

  • 拿第3颗珠子(s[2]
  • 剪断重新串(切片)
  • 把两条手链接起来(拼接)

猜测检查 = 猜价格游戏

“这个包多少钱?” 你从1元开始猜,一个个试,直到猜对。傻但管用。

二分法 = 撕字典找单词

要找”Python”这个词,你打开字典中间,看到”M”,知道P在后半部分,再撕开后半部分的中间… 每次排除一半,超快!

Decomposition, Abstractions, Functions

分解 = 吃大象

怎么吃掉一头大象?一口一口吃。大问题拆成小问题,大任务拆成小任务。

抽象 = 开车

你开车不需要知道引擎怎么运转,只要知道”踩油门→车快”就行。函数也一样,你调用print()不需要知道它怎么在屏幕上显示文字。

函数 = 榨汁机

def 榨汁(水果):
    # 里面发生了魔法
    return 果汁
  
苹果汁 = 榨汁(苹果)  # 放苹果进去,出来苹果汁

Tuples, Lists, Aliasing, Mutability, Cloning

元组 = 密封罐头

(1, 2, 3) 一旦封装就不能改,想吃里面的桃子?可以看,但不能换成李子。

列表 = 购物车

[牛奶, 面包, 鸡蛋] 随时可以加东西、删东西、换东西。

别名 = 绰号

我的购物车 = [苹果]
你的购物车 = 我的购物车  # 我们推的是同一辆车!
你的购物车.append(香蕉)  # 我的车里也多了香蕉

克隆 = 复印

你的购物车 = 我的购物车.copy()  # 复印一份清单,各买各的

Recursion, Dictionaries

递归 = 俄罗斯套娃

打开一个娃娃,里面还有一个娃娃,再打开,又有一个… 直到最小的那个(基础情况)。

def 打开套娃(娃娃):
    if 娃娃.是最小的:
        return "找到了!"
    else:
        return 打开套娃(娃娃.里面的娃娃)  # 自己调用自己

字典 = 真·字典

电话簿 = {
    "张三": "123-4567",
    "李四": "890-1234"
}

Testing, Debugging, Exceptions, Assertions

测试 = 出厂检验

造了一辆车,得试试刹车灵不灵、方向盘转不转。

调试 = 找蟑螂

代码里有bug(虫子),你得拿着手电筒(print语句)一行行找,或者用杀虫剂(调试器)。

异常 = 安全气囊

try:
    开车()
except 撞车:
    弹出安全气囊()  # 出错了有补救措施

断言 = 质检卡尺

assert 这个零件长度 == 10cm —— 不对就立刻喊停生产线。

Object Oriented Programming

类 = 模具

想造一堆相同的月饼?做个模具(类),然后往里倒面糊:

class 月饼模具:
    def __init__(self, 馅料):
        self.馅料 = 馅料
  
    def 烤制(self):
        print(f"烤出了{self.馅料}月饼")

豆沙月饼 = 月饼模具("豆沙")  # 造一个月饼
蛋黄月饼 = 月饼模具("蛋黄")  # 再造一个

对象 = 流水线产品

每个月饼(对象)都有自己的馅料(属性),都能被烤(方法)。

Python Classes and Inheritance

继承 = 家族遗传

class 动物:
    def 呼吸(self):
        print("吸气呼气")

class 狗(动物):  # 狗继承了动物
    def 叫(self):
        print("汪汪!")

我的狗 = 狗()
我的狗.呼吸()  # 继承来的能力
我的狗.叫()    # 自己的特殊能力

爸爸会呼吸,儿子天生也会;爸爸不会飞,但儿子可以学跳伞(添加新方法)。

Understanding Program Efficiency

不同算法 = 不同交通工具

  • 走路去北京:O(n²) - 慢得离谱
  • 开车去:O(n log n) - 还行
  • 坐高铁:O(n) - 快
  • 瞬移:O(1) - 一步到位

时间复杂度 = 速度等级

10个数排序 vs 100万个数排序,O(n²)算法会累死,O(n log n)依然飞快。

Searching and Sorting

线性搜索 = 一本本翻书找

图书馆1000本书,你从第一本开始翻,找《红楼梦》可能要翻500本。

二分搜索 = 利用书架编号

书是按字母排好的,直接去H区,一下缩小范围!(前提:必须排好序)

冒泡排序 = 泡泡上浮

最大的数像泡泡一样,一轮轮”咕噜咕噜”浮到最上面。

快速排序 = 站队游戏

选一个人当基准,比他高的站右边,矮的站左边,然后两边各自再这样分… 递归套娃!


Wrapping Up

  • 建房子 :数据是砖,函数是工具,类是图纸,算法是工序
  • 写小说 :变量是角色,条件是剧情分支,循环是重复的情节,递归是故事中的故事
  • 管理公司 :对象是员工,继承是部门架构,调试是解决问题,效率是优化流程

记住:计算机很傻但很快,你得当个耐心的幼儿园老师,把每一步都讲清楚 🎓

有哪个比喻没听懂,或者想深入了解哪个部分吗?