【Python零基础教程】001 编程到底是什么 从做饭理解算法

【Python零基础教程】001 编程到底是什么 从做饭理解算法

001 | 编程到底是什么?——从做饭理解算法

难度:⭐ |预计阅读:8 分钟 |前置:无(专栏开篇) |下一篇:[002 为什么 Python 是新手第一语言?]


1. 这篇文章解决什么问题?

"编程"这个词被过度神化了。电影里黑客手指翻飞、屏幕上绿字滚动,给人一种错觉——编程是天才的专属技能。

它不是。

编程的本质是用一套精确的指令,让计算机帮你解决问题。这篇用"做饭"这条人人都懂的线索,帮你建立算法思维——这是编程世界唯一的硬通货。读完这篇,你不需要会写任何代码,但你会理解"程序员到底在干什么"。


2. 从做饭理解算法的本质

2.1 番茄炒蛋的两种写法

假设你要教一个完全不会做饭的机器人做番茄炒蛋。你会怎么说?

普通人写菜谱

准备两个番茄、三个鸡蛋。先把鸡蛋打散,番茄切块。锅里倒油,先炒鸡蛋,盛出来。再炒番茄,最后把鸡蛋倒回去一起炒。加盐,出锅。

这对机器人来说是一场灾难——"打散"是什么动作?打到什么程度?"切块"是切多大?"先炒鸡蛋"炒几秒?火开多大?机器人会在第一个步骤就卡住。

程序员需要这样写

# 这不是真正的代码,是"算法"——精确到每一步的指令序列步骤1:准备食材-取番茄2个(每个约150克)-取鸡蛋3个(每个约55克)-取食用油15毫升-取食用盐2克 步骤2:处理鸡蛋-3个鸡蛋打入碗中-用筷子沿顺时针方向搅拌60-判断条件:蛋液颜色均匀、无明显的蛋清块 → 停止搅拌 步骤3:处理番茄-2个番茄分别切成约3厘米的块状(共约16块) 步骤4:炒鸡蛋-将锅放置于灶上,开中火(约600瓦)-倒入10毫升食用油-等待30秒,判断:油面出现细微波纹 → 油温合适-倒入蛋液,用锅铲快速翻动-等待约40秒,判断:蛋液全部凝固成块,呈金黄色 → 盛出备用 步骤5:炒番茄-倒入剩余5毫升食用油-倒入番茄块-翻炒约90秒,判断:番茄皮开始脱落、汤汁变红 → 番茄熟了 步骤6:混合调味-将鸡蛋倒回锅中,与番茄混合-加入2克盐-翻动10次,使得盐均匀分布 步骤7:出锅-关火-将成品装入盘中

这就是"算法"——一组精确的、有限的、无歧义的操作步骤。把这个菜谱交给机器人,它不需要任何"烹饪天赋",只需要忠实地执行每一步。

2.2 编程 = 算法 + 数据

编程

算法 操作步骤

数据 操作对象

顺序执行

条件判断

循环重复

输入 番茄+鸡蛋+油+盐

输出 一盘番茄炒蛋

图 2-1:编程的两大核心要素。红色 = 编程本体,蓝色 = 算法(怎么操作),橙色 = 数据(操作什么)。任何程序都离不开这两个要素——算法定义步骤,数据提供原材料。

用做饭的类比来翻译编程术语:

做饭编程说明
菜谱程序完整的指令集合
每一步操作语句单条指令
食材数据 / 变量被操作的对象
“如果蛋液不均匀就继续搅拌”条件判断(if)根据状态决定下一步
“翻炒 10 次”循环(for)重复执行某个操作
判断蛋液是否均匀布尔表达式结果是"是"或"否"的判断

3. 算法的五大特征

计算机科学中对"算法"有严格定义——它必须具备以下五个特征:

算法

有穷性 步骤有限 不能是死循环

确定性 每步含义唯一 没有歧义

可行性 每步都能执行 不是空中楼阁

输入 有零个或多个输入

输出 至少有一个输出

图 3-1:算法的五大特征。红色 = 算法根节点,蓝色 = 五个必备特征。缺一条就不是合格的算法。

用做饭的例子对照:

特征是否满足?说明
有穷性7 个步骤,做完就结束,不会永远做下去
确定性"切 3 厘米的块"比"切块"确定,"搅拌 60 圈"比"打散"确定
可行性每一步都是普通人能执行的操作
有输入番茄、鸡蛋、油、盐
有输出一盘番茄炒蛋

现在回头看普通菜谱为什么不满足"算法"的定义——它缺了"确定性"。"切块"是切多大?"炒一会儿"是多久?模糊的指令对计算机无效。


4. 从做饭到编程:三条核心思维

4.1 分解思维:大问题拆成小步骤

你不会一口气做完一盘菜——你把它拆成了备料→处理→烹饪→装盘。

编程一模一样。写一个"计算全班同学平均分"的程序,要先拆成:

1. 获取全班成绩数据 2. 把所有成绩加起来 3. 数一下有多少个成绩 4. 用总成绩 ÷ 人数 5. 输出结果

每一次拆分都让问题变得更简单。拆到最后,每一步都小到可以用一行代码表达。

4.2 抽象思维:忽略无关细节

做饭时你不需要知道鸡蛋的分子结构、铁锅的金属晶体排列、火焰的等离子体物理。你只需要知道"中火加热 30 秒 → 油温合适"。

编程也一样。你不需要知道 Python 解释器怎么把代码翻译成机器指令、CPU 怎么调度寄存器——你只需要知道print("hello")会在屏幕上输出 “hello”。抽象 = 屏蔽底层复杂度,只暴露必要的接口。

4.3 容错思维:考虑所有意外情况

菜谱里通常不会写"如果鸡蛋掉地上怎么办"。但程序中必须考虑

  • 用户输入了负数怎么办?分数 = -5
  • 数据为空怎么办?全班没有一个人参加考试
  • 类型错了怎么办?用户输入了 "abc" 而不是数字

正常菜谱和机器人菜谱的区别,就是普通程序和生产级程序的区别——后者会为所有意外情况准备预案。


5. 一个完整的"算法执行"示例

我们来手算一道加法——不是用算术直觉,而是严格模拟计算机的逐条执行

问题:计算 25 + 37

计算机的算法(比人类笨,但比人类快一亿倍):

步骤 1:取第一个数 25,存入 A 号抽屉 → A = 25 步骤 2:取第二个数 37,存入 B 号抽屉 → B = 37 步骤 3:取出 A 的值(25) 步骤 4:取出 B 的值(37) 步骤 5:计算 A + B = 25 + 37 = 62 步骤 6:将结果 62 存入 C 号抽屉 → C = 62 步骤 7:输出 C 号抽屉的内容(62)

A=25

B=37

取出 A=25

取出 B=37

计算 25+37=62

C=62

输出 62

图 5-1:25+37 在计算机中的执行步骤。橙色 = 存储数据(变量赋值),蓝色 = 取出数据,绿色 = 计算操作,紫色 = 最终输出。

关键认知:人类算 25+37 是瞬间的"直觉",计算机算 25+37 需要 7 步机械操作。但这一套机械操作可以复制到任何数字上——你给 1982736+4289107,它同样 7 步搞定,速度是每秒十亿次。计算机不聪明,但极其忠诚、极其快。你的工作是给它写菜谱。


6. 总结与自测

三个核心认知

  1. 编程不是写代码,编程是写"菜谱"。代码只是菜谱的文字形式。真正的能力是"把问题拆成精确的无歧义步骤"——这个能力与编程语言无关。
  2. 算法 = 精确步骤的序列。必须具备有穷性、确定性、可行性、输入、输出五个特征。模糊的指令对计算机无效。
  3. 计算机的特长是"笨但快"——一秒钟能执行十亿次"取出、比较、计算、存回"这种简单操作。你的价值在于让它笨而有序地工作。

自测题

Q1:以下哪条指令是计算机能执行的"算法"?

  • A. “把菜炒熟”
  • B. “大火炒 90 秒,直至番茄皮开始脱落”
  • C. “加热至口感适中”

Q2:算法五大特征中,"有穷性"指的是什么?

  • A. 算法最终必须停下来,不能是无限循环
  • B. 算法的每一步都必须能执行
  • C. 算法可以没有输入但必须有输出

(答案见文末)


下一篇预告:[002 为什么 Python 是新手第一语言?]——全球有 600 多种编程语言,为什么 Python 统治了初学者市场?它的设计哲学是什么?


自测答案:Q1 → B(有时间、有温度、有判断标准——精确且无歧义) | Q2 → A(有穷性 = 步骤有限,不能永远运行下去)


本文是《Python 全栈精通:从算法基石到工程实战》专栏第 001 篇。
参考来源:Donald Knuth “The Art of Computer Programming”, MIT 6.0001 Introduction to CS and Programming
版权声明:CC 4.0 BY-SA