🏠 返回导航
🌿 淇澳来客
📷 人算不完
🧩 算法是什么
🗣️ 自然语言描述
🗺️ 流程图描述
📝 伪代码描述
💻 计算机语言
🔗 从图到程序
⌨️ 填空通关
🧪 上岗考核
🔍 错在哪
🌅 算法边界

🧠 知识导图

第 1 幕 · 情境导入
1算法
定义
五个特征
2算法描述方法
自然语言描述
流程图描述
伪代码描述
3三种基本结构
顺序 · 选择 · 循环
4计算机程序设计语言
机器语言
汇编语言
高级语言

点一项,跳到讲它的那一页

用技术,守护候鸟

——淇澳岛候鸟鉴定的算法设计

第 1 幕 · 情境导入

🌿 十月的淇澳岛,来客了

每年 10 月到次年 4 月,这片红树林是候鸟南下路上的第一个大驿站——而在成千上万只鸟里,有一种少到一只都不能认错

先认识这片地方

广东珠海淇澳—担杆岛省级自然保护区就在珠海高新区淇澳岛的西北部。它入选"广东十佳观鸟胜地",也正好卡在"东亚—澳大利西亚"这条全球候鸟迁徙通道上。

🌳 近 500 公顷
红树林面积,国内人工种植连片面积最大的一片
🐦 172 种
《淇澳鸟类图鉴》收录的岛上野鸟(历年记录已超 200 种)
📅 10 月—次年 4 月
候鸟季,高峰期单日数万只鸻鹬yù、鸭类、鸥类停歇

🌱 1998 年这里只剩 32 公顷原生红树林,互花米草几乎占满了滩涂。清草、种树、守了二十多年,才长回今天的规模。

候鸟季点名:都是谁来了?

退潮时,红树林浅滩上密密麻麻全是觅食的鸟。下面这六种,是保护区记录里最常出现的面孔——点一下,看图鉴卡片:

白鹭
点击揭晓
白鹭
黑嘴黑腿黄脚趾
体长 55–65 cm
中白鹭
点击揭晓
中白鹭
全白,比白鹭大一号
体长 65–72 cm
大白鹭
点击揭晓
大白鹭
最高的白鹭,脖子细长
体长 85–100 cm
苍鹭
点击揭晓
苍鹭
灰身子、白脑袋
体长 90–100 cm
反嘴鹬
点击揭晓
反嘴鹬
嘴往上翘、黑白相间
体长 42–46 cm
青脚鹬
点击揭晓
青脚鹬
小型鹬类,腿青绿
体长 30–35 cm

除此之外还常见:池鹭、泽鹬、黑翅长脚鹬、红脚鹬、红嘴鸥,以及成百上千只排成一条"黑线"的野鸭(琵嘴鸭、凤头潜鸭、赤颈鸭、罗纹鸭)。赶上迁徙高峰,一片滩涂上能同时落下几千只。

有些鸟,多到你懒得数;有些鸟,少到一只都不能错。

黑脸琵鹭:少到一只都不能错

🚩 国家一级保护野生动物 🔴 IUCN 红色名录 · 濒危(EN) 🌏 全球 7081 只(2025 同步普查) 📍 淇澳同框 5 只
0 2500 5000 7500 1988 年:全球 288 只288 2003 年:全球 1069 只1069 2008 年:全球 2065 只2065 2015 年:全球 3272 只3272 2025 年:全球 7081 只7081 1988 2003 2008 2015 2025
数据:全球黑脸琵鹭同步普查(每年 1 月,全球同日数一遍)

黑脸琵鹭目前正处在"数量创新高、但远没到安全"的状态——它是全球濒危物种保护里少见的成功案例,但恢复高度依赖人为持续守护。

鉴定出黑脸琵鹭并且准确监测数量就非常重要。

它长什么样

黑脸琵鹭
黑脸琵鹭 Platalea minor 摄影:Arlango Lee(CC BY-NC,iNaturalist)

名字就是它的长相:脸是黑的,嘴像琵琶。

  • 嘴:又长又扁,前端胀开像一把汤匙,黑色
  • 脸:前额、眼周到嘴基是裸露的黑皮肤
  • 身子:通体雪白,黑嘴、黑腿
  • 体型:体长约 74 厘米,比大白鹭小一号
俯视 侧视
喙形:扁匙状(琵琶形) 别的鸟是一根尖锥子;它长而直、上下扁平,越往前越宽,先端胀成一把琵琶——"琵"字就是从这儿来的。

觅食时它把汤匙嘴伸进浅水,左右扫动"捞"鱼虾——这个动作是它在滩涂上最好认的招牌。

换成机器看的方式,再说它一遍:
体长 74 cm 喙长 17 cm 喙形 2 扁匙状 羽色 1 全白

⚠️ 别被"黑脸"骗了:那不是羽毛,是裸露的皮肤——按羽色算,它仍然是全白。后面讲"羽色编码"时还会碰到。

所以,真正的问题是这个

几百只候鸟降落滩涂,
怎么知道都是些什么鸟?有黑脸琵鹭吗? 不是"照片里有没有鸟",而是"这一群鸟里,哪几只才是我要找的那一种"

人眼能做到,但要一只一只看、一只一只比对。一天看几十只可以,几千只就不行了。

而这个时候,监测站的相机其实一直在拍。

第 2 幕 · 任务

📷 相机拍下来了,然后呢?

数据已经堆在硬盘里,缺的是"鉴定"这一步

监测站其实一直在干活

保护区在滩涂边架了高清相机和红外相机,涨潮落潮都在拍。鸟一落下来,照片就进了硬盘。

👁 24 小时
相机不休息,人做不到
📸 上千张 / 天
一个点位的有效照片量级
❓ 不知道是谁
相机能拍、能测,却说不出物种名

卡点就在这儿:拍照自动化了,测量也开始自动化了,唯独"看一眼,说出它是什么鸟"这一步,还得靠人。

💡 有些地方已经在做"鸟脸识别"了,但那是第六章的机器学习。今天我们要做的,是这件事里能被算出来的那一半。

一条记录,就是一行数字

相机配上测量模块后,一只鸟落下来,会自动生成这样一条记录:

编号体长喙长喙形羽色物种=?
B00174.017.021空着
B00258.08.011空着
B00344.07.533空着

前四列是机器测出来的数,最后一列是我们要填的答案。程序要干的活,就是把这四列数字变成第五列。

喙形 1 尖直 2 扁匙状 3 细长上翘 羽色 1 全白 2 灰/苍灰 3 黑白相间

机器读不懂"汤匙""雪白",它只认 2 和 1。所以这些形状和颜色,必须先被编成号码——这一步叫编码。

这笔账,人算不动

按最保守的估计:这 1 500 条记录,一条平均只花 1 分钟(举镜、比对、写名字),派 2 个人:

1500条记录
×
60秒/条
÷
2个人
=
12.5小时/人

不吃不喝、不休息、一次都不看错,也要干到半夜。而这只是今天的量——明天早上,硬盘里又躺着一模一样多的一批。

人会累、会看走眼、会下班;相机不会。所以这一列空着,不是人不努力,是这份活本身不该由人来做。

要让机器替我们把那一列填上——这就是接下来要做的事。

📋 任务书:候鸟鉴定助手 v1.0

输入:4 个测出来的特征
输出:物种名称 本轮先覆盖 7 种常见鸟,其中黑脸琵鹭lù必须一只不漏
🔍 设计算法
把"怎么鉴定鸟"变成特征和步骤
⌨️ 写出程序
把流程图翻译成 Python
🧪 测试改进
用准确率检验并优化
第 3 幕 · 知识建构

🧩 算法:把"会做"变成"说清楚"

计算机不会猜,它只会照着你说的做

课本怎么定义"算法"

📖 课本原文 · 粤教版必修一《数据与计算》3.2.1 算法
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗地说,算法就是用计算机求解某一问题的方法,是能被机械地执行的动作或指令的有穷集合。

概念有四个要点:

① 有限步骤内步骤数是有限的,走完就停,不会一直找下去
② 定义明确的规则每条都得说死——"像白鹭lù"不算,"体长≥50 且全白"才算
③ 能被机械地执行不用人再做判断,换谁、换哪天,执行出来都一样
④ 动作或指令的有穷集合一共就这几步,不多不少,可以一条条列出来

那么,什么是算法?看两个例子

🍜 泡一碗面
烧水 → 放面 → 等 3 分钟 → 放调料 → 搅拌 → 吃。
顺序错了,味道就错了。
🚶 从教室走到食堂
出教室 → 下楼梯 → 直走 → 遇路口左转 → 到。
每步都要说清楚往哪走。

这两件事你早就会做。但要交给一个什么都不会的人(或者一台计算机)去做,就得把每一步都写死:算法,就是把"会做"翻译成"说清楚"。泡面那六步、走路那五步,都是算法。

算法有五条特征,一条都不能少

判断一段话是不是算法,就看下面五条——必须同时满足,少一条计算机就做不了:

① 有输入
得给它原料:我们的 4 个特征
② 有输出
得给结果:物种名称
③ 有穷性
执行有限步一定会停,不能"一直找下去"
④ 确定性
同一组数据,每次结果必须一样
⑤ 可行性
每一步都得真的做得到

🎯 对照我们的项目:输入是 4 个特征,输出是物种名,最多问 5 个问题就出结果(有穷),规则写死了不会有第二种答案(确定),每一步都能量、能比(可行)。

体检一下:这四段话,算算法吗?

每段话下面点一下你的判断,看看对不对:

① "把照片里的鸟认出来。"
❌ 不算。没有步骤——它只说了"要什么",没说"怎么做"。这是目标,不是算法。
② "看到像白鹭,就判它是白鹭。"
❌ 不算。缺确定性——"像"是多少?像到什么程度算像?计算机没法执行一个"感觉"。
③ "①读取体长和羽色;②若体长≥85 且羽色为灰,则判为苍鹭;③输出结果。"
✅ 算。有输入、有输出、步骤有限、条件明确、每步都能执行。这就是我们要写的那种句子。
④ "翻开图鉴一直比对,直到认出来为止。"
❌ 不算。缺有穷性——"直到认出来"没有说什么时候停。万一认不出来,就一直翻下去了。
第 4 幕 · 抽象与描述

🗣️ 自然语言描述:把鉴定过程说成话

手上只有 4 个数字和一张表,怎么定它是谁?

两张表,对照着看:机器给什么,判据是什么

鉴定这件事,说到底就是在这两张表之间来回比——左边是相机自动记下来的一行行数字,右边是"这些数字长成什么样才算哪种鸟"的标准答案。

① 相机采集的数据一只鸟落下来 = 一行数字
编号体长喙长喙形羽色物种=?
B00174.017.021空着
B00258.08.011空着
B00344.07.533空着
喙形 1 尖直 2 扁匙状 3 细长上翘 羽色 1 全白 2 灰/苍灰 3 黑白相间

前四列是机器测出来的数,最后一列空着——那正是程序要填的答案。

② 鸟类的判断依据七种鸟各自的"数字长相"
物种体长 cm喙长 cm喙形羽色关键特征
白鹭55–657–911黑嘴黑腿黄脚趾
中白鹭65–728–1011跟白鹭几乎一样,大一号
大白鹭85–10010–1211个大,黄嘴黑腿,S 形脖
苍鹭90–10011–1312灰身白脖,一撮黑冠羽
黑脸琵鹭70–7816–1821汤匙嘴,黑脸;国家一级
反嘴鹬42–467–833嘴往上翘,黑白相间
青脚鹬30–355–612上灰下白,青绿腿

📌 喙长这一列这次用不上:它和体长几乎同步变化,帮不上忙——特征不是越多越好,够用就行。

机器读不懂"汤匙""雪白",它只认 2 和 1。所以这些形状和颜色,必须先被编成号码——这一步叫编码。

那问题来了:拿 B001 那一行(74 / 17 / 2 / 1),你怎么定它是谁?

把这条路写成 8 句话

一步只做一件事,一句一句排下去:

输入一条记录的 4 个特征(体长 L、喙长 B、喙形 S、羽色 C) ➜ 输出物种名称
👆 点一下,一句一句来 · 0 / 8
第一步读取这条记录的 L、B、S、C。
第二步判断 S 是否等于 2(扁匙状)。如果是,判为黑脸琵鹭lù,转到第 8 步。
第三步否则,判断 L ≥ 85 且 C = 2。如果是,判为苍鹭,转到第 8 步。
第四步否则,判断 L ≥ 85 且 C = 1。如果是,判为大白鹭,转到第 8 步。
第五步否则,判断 L ≥ 50 且 C = 1。如果是,判为白鹭,转到第 8 步。
第六步否则,判断 S 是否等于 3(细长上翘)。如果是,判为反嘴鹬yù,转到第 8 步。
第七步否则,判为青脚鹬。
第八步输出物种名称,结束。对下一条记录,回到第 1 步。

✍️ 三条硬规矩:一步只做一件事;每步开头是动词;不许出现"大概""可能""感觉"。

📌 这 8 句话,就是「自然语言描述的候鸟鉴定算法」 没有代码、没有图,就是用平时说话的方式,把"怎么鉴定一只鸟"一步一步写清楚。这是三种描述方法里最基础的一种——后面画的流程图、写的伪代码,做的都是这 8 句话。

自然语言描述:好在哪,差在哪

这 8 句话,同学一看就懂,照着走也能得出答案。可对着上面那张表仔细看,问题就露出来了。

✅ 优点
🗣️ 谁都读得懂
不用学语法,圈外人也明白
✏️ 写改都快
改一处,只需改一句
📝 适合当草稿
先想清做什么,再想怎么写
💬 方便讨论
指着那一句就能说
⚠️ 缺点
🧩 结构不直观
看不出分支和循环
🚧 边界含糊
机器不懂“否则”指哪一行
🐦 写长了会漏
几十步以后,容易漏一种鸟
🖥️ 机器不能跑
还得再翻译成程序

一句话:自然语言适合“想”和“说”,不适合“执行”——它是最好的草稿纸,却不能直接当施工图。

第 5 幕 · 流程图(实践)

🗺️ 流程图描述:把算法画成一张图

菱形出两条线,箭头指出下一步该往哪走

流程图的六个标准符号

这是全世界通用的"算法文字",六个图形各管一件事:

圆角矩形开始 / 结束
平行四边形输入 / 输出
矩形处理 / 计算
菱形判断(是 / 否)
箭头流程线(走向)
小圆圈连接点(线断了两头接上)

最后那个小圆圈叫连接点:流程图一页画不下、或者有根线要跨很远,就在断开的两头各画一个同样的圆圈,写上同一个标记(比如都写 A),表示"这两处其实是同一条线"。它不是一个操作,只是个接线记号。

一个小道理:判断框长成菱形——一个入口、两个出口(是 / 否),别的框都是一个入口一个出口。

连线挑战:图形对功能

图形在左,功能在右——配对了,中间会连出一条同色的线。

🎉 6 对全部配对成功!以后看流程图就像看地图了

三种基本控制结构:算法只有三块积木

图形是零件,零件怎么装?全世界只有三种装法——再复杂的算法,掰开看都是这三块拼起来的。

1顺序结构
读入 4 个数字 按阈值逐条比 得出鸟名

从上到下,一步接一步,走完就停。

生活版:泡面的步骤。

2选择结构
扁匙喙? 是 否 黑脸琵鹭 继续往下

一个条件,两条路:是走这边,否走那边,走完再并回同一条线。

生活版:出门前看天带不带伞。

3循环结构
读完回头 还有记录? 有 没有 读下一条记录 结束

做完一遍别急着走,回头再问一次条件:没够就再来一遍,够了才往下。

生活版:刷步数,没到一万步就继续走。

📖 课本结论:任何复杂的算法,都可以由这三种基本结构组合而成——不管它管着多少行代码,拆开看也就这三样。等一下要画的鉴定图,就是把"选择"套进"循环"里。

同一套步骤,画成图

左边就是刚才那 8 句话,一句一句点开,右边对应的那一块就亮起来——点完,整张图也就齐了:

👈 点一句,右边亮一块
1读取这条记录的 L、B、S、C。
2判断 S 是否等于 2(扁匙状)。是 → 黑脸琵鹭,转到第 8 步。
3否则,判断 L ≥ 85 且 C = 2。是 → 苍鹭,转到第 8 步。
4否则,判断 L ≥ 85 且 C = 1。是 → 大白鹭,转到第 8 步。
5否则,判断 L ≥ 50 且 C = 1。是 → 白鹭,转到第 8 步。
6否则,判断 S 是否等于 3(细长上翘)。是 → 反嘴鹬,转到第 8 步。
7否则,判为青脚鹬。
8输出物种名称,结束。对下一条记录,回到第 1 步。
0 / 8
开始 读入一条记录 体长 L · 喙长 B · 喙形 S · 羽色 C 喙形 = 扁匙状? 是 物种 = 黑脸琵鹭 否 体长 ≥ 85 且 羽色 = 灰? 是 物种 = 苍鹭 否 体长 ≥ 85 且 羽色 = 白? 是 物种 = 大白鹭 否 体长 ≥ 50 且 羽色 = 白? 是 物种 = 白鹭 否 喙形 = 细长上翘? 是 物种 = 反嘴鹬 否 物种 = 青脚鹬 输出:物种名称 还有下一条 记录吗? 否 结束 是 回到这里,取下一条记录

🟢 左边那条绿色虚线,就是「循环」的回边——20 条记录,这张图要跑 20 遍。右边那条竖线则是「汇合」:五个「是」不管走哪条,最后都要回到同一个「输出」。

🎯 三个关键:① 每个菱形都出两条线;② 五个「是」不管走哪条,最后都汇到同一个"输出";③ 那条绿色虚线是循环,没有它,程序只会认一只鸟。

现在轮到你们

打开 《淇澳岛候鸟鉴定算法流程图画布》,把我们设计的淇澳岛候鸟鉴定算法画成流程图,画完导出、提交。

三条底线:菱形一定出两条线 · 阈值旁边写依据 · 图上有开始也有结束。

第 6 幕 · 伪代码描述

📝 伪代码描述:半中半英的"算法草稿"

图是给人看的,程序是给机器跑的——中间还差一层过渡

伪代码,是"用程序的结构说人话"

📝 一句话说清
伪代码借用程序语言的结构(判断、循环、输入输出、赋值),内容却用人和机器都看得懂的话来写,不绑定任何一种编程语言。
① 架子是程序的IF…THEN…ELSE、WHILE…END WHILE,一眼就是程序的骨架
② 内容是自己的话变量名、物种名、阈值数字直接写,不用迁就语法
③ 缩进就是层级谁在谁里面,不看箭头,看缩进

本项目,写成伪代码就是这个样子

还是那 8 句话、还是上一页那张图。伪代码没有统一格式,同一条算法,可以写成两种样子:

A写法一贴着程序的结构
BEGIN
  WHILE 还有未鉴定的记录
    READ L, B, S, C
    IF S = 2 THEN
        物种 ← "黑脸琵鹭"
    ELSE IF L ≥ 85 AND C = 2 THEN
        物种 ← "苍鹭"
    ELSE IF L ≥ 85 AND C = 1 THEN
        物种 ← "大白鹭"
    ELSE IF L ≥ 50 AND C = 1 THEN
        物种 ← "白鹭"
    ELSE IF S = 3 THEN
        物种 ← "反嘴鹬"
    ELSE
        物种 ← "青脚鹬"
    END IF
    PRINT 物种
  END WHILE
END
B写法二贴着日常说话
读入一条待鉴定的记录
取出体长 L、喙长 B、喙形 S、羽色 C

如果 喙形是扁匙状(S = 2)
    这只鸟是黑脸琵鹭
否则如果 体长不小于 85 且 羽色是灰(C = 2)
    这只鸟是苍鹭
否则如果 体长不小于 85 且 羽色是白(C = 1)
    这只鸟是大白鹭
否则如果 体长不小于 50 且 羽色是白(C = 1)
    这只鸟是白鹭
否则如果 喙形细长上翘(S = 3)
    这只鸟是反嘴鹬
否则
    这只鸟是青脚鹬

输出 这只鸟的名字
还有记录吗?有就回到“读入”再来一遍

👀 两栏一一对应,只是穿的衣服不同:五个菱形 → 五次“如果”判断;绿色回边 → 循环(左边 WHILE … END WHILE,右边就一句“回到‘读入’再来一遍”);矩形 → 记下物种名。

两种写法里都不再用“转到第 8 步”这种方式指路。左边用 IF / END IF 划边界、用 WHILE … END WHILE 圈循环;右边连循环都只写一句“回到读入再来一遍”,边界全交给“如果……否则……”和缩进。骨架可以自己定,只要每一步都没有歧义。

伪代码:好在哪里

🧱 结构清楚
缩进一看,谁在谁里面
✏️ 写改都快
不用画图,随手补两行
🎯 离程序最近
换成 Python 几乎一比一
🔓 不绑语言
换门语言,草稿照样能用

一句话:伪代码是写代码前的最后一张草稿——比自然语言严谨,比流程图省事。

三种描述方法,收个尾

同一条候鸟鉴定算法,三种写法都走了一遍。放在一起看,各自的位置就清楚了:

🗣️ 自然语言🗺️ 流程图📝 伪代码
长什么样一步一步的话框 + 箭头半中半英的"代码草稿"
最擅长说清思路、随时改分支和循环一眼看全结构最接近程序
最短板结构不直观、边界含糊画和改都费时间没有统一标准,机器不能跑
什么时候用想方案、讨论时讲清整体流程、查漏时动笔写代码之前

连起来就是一条线:自然语言 → 流程图 → 伪代码 → 程序。每往后一步,机器能读懂的多一点,人一眼看全的少一点。所以三种写法不是三选一,是同一件事的三个阶段。

第 7 幕 · 计算机语言

💻 算法,怎么变成程序?

图是画给人看的,程序是写给机器执行的

计算机只会说 0 和 1

CPU 里全是开关,它只认"通 / 断"两种状态,写出来就是 1 和 0。那我们是怎么办到"用人话指挥计算机"的?答案是一层一层的翻译。编程语言就这样分成了三代——越往下越像机器,越往上越像人:

① 机器语言第一代
是什么:直接用 0/1 写指令,如 10110000。
长什么样:一行就是一串二进制。CPU 不用翻译就能执行,跑得最快。
谁在用:几乎没人手写了。不同 CPU 的 0/1 规则还不一样,换个型号程序就得重写。
② 汇编语言第二代
是什么:给每条 0/1 指令起个短名字,如 MOV、ADD。
长什么样:还是"一条命令一行",但人终于能读了;再由汇编程序译回 0/1。
谁在用:单片机、家电固件、操作系统最底层那几百行。日常软件早不用它了。
③ 高级语言第三代
是什么:接近英语和数学,如 Python、C++、Java。
长什么样:一句顶汇编几十句,还替你管内存;翻译的活儿交给编译或解释程序。
谁在用:几乎所有软件、网站、人工智能。我们这节课用的就是它。

同一件事,三代人怎么写

让电脑在屏幕上打出一行"黑脸琵鹭",三种语言的写法差多少(机器语言只截了一段示意):

# ① 机器语言:一串 0 和 1,人眼基本读不懂
10111000 00000001 00000000 10111011 00000010 00000000 ...

# ② 汇编语言:给指令起了名字,但还是"一条一行"
MOV  AH, 09H
LEA  DX, MSG
INT  21H

# ③ 高级语言(Python):一句话说完
print("黑脸琵鹭")

三代语言干的活完全一样,区别只在"谁来翻译、翻译多少"。越往上,同一件事写的字越少、越不容易出错——这就是今天几乎没人用 0/1 写程序的原因。

那谁来翻译?两种方式

方式打个比方特点
编译
C、C++
把整本书一次翻完,装订成册再交给你先整体翻成 0/1,生成 .exe,以后直接跑,快;改一个字要重新翻整本。
解释
Python
同声传译,你说一句他翻一句边读边翻边执行,改完存盘按 F5 立刻见效,适合边写边试;但每次运行都要重翻一遍。

我们用的 Python 就是解释型的高级语言:句子几乎像英语,新手能很快上手;"库"又特别多,人工智能领域大量用它。你敲的每一行,IDLE 都会替你翻译成 0/1 交给 CPU。

记住这一句就够了

程序 = 算法 + 数据 算法是"怎么想",数据是"对谁做",程序是"写下来的那一份"

所以你上节课画的流程图,不是白画的——它就是程序的"施工图"。这节课你做的事,叫翻译。

第 8 幕 · 从图到程序

🔗 一张图,一段代码

点左边一块图形,右边就长出对应的那几行代码

先把它们摆在一起看

左边是你画的流程图,右边是从这张图翻译出来的程序。同一件事,两种写法。现在右边被盖住了——点左边一个图形,就去揭开它对应的那几行代码。像搭积木一样,一块一块把程序搭出来。

🗺️ 流程图 ◇ 向右 = 是 ↓ 向下 = 否
while 回边 是 是 是 是 是 否 否 否 否 否 否 是 ① 开始 ② 读入一条记录 体长 · 喙长 · 喙形 · 羽色 ③ 喙形=扁匙状? ④ 体长≥85 且羽色=灰? ⑤ 体长≥85 且羽色=白? ⑥ 体长≥50 且羽色=白? ⑦ 喙形=细长上翘? ⑧ 都不是 → 青脚鹬 ⑨ 输出:物种名称 ⑩ 还有下一条? ⑪ 结束 ▸ 黑脸琵鹭 ▸ 苍鹭 ▸ 大白鹭 ▸ 白鹭 ▸ 反嘴鹬
💻 程序 (点左边的图形,代码一行一行长出来)
# ① 先打个招呼print("淇澳岛候鸟鉴定助手 v1.0")print("喙形:1尖直 2扁匙 3上翘")print("羽色:1全白 2灰 3黑白") while True:            # 回边的开关    body  = float(input("体长(cm):"))    beak  = float(input("喙长(cm):"))    shape = int(input("喙形(1/2/3):"))    color = int(input("羽色(1/2/3):"))     if shape == 2:        name = "黑脸琵鹭"    elif body >= 85 and color == 2:        name = "苍鹭"    elif body >= 85 and color == 1:        name = "大白鹭"    elif body >= 50 and color == 1:        name = "白鹭"    elif shape == 3:        name = "反嘴鹬"    else:        name = "青脚鹬"     print("判为:", name)     again = input("再测一条?(y/n):")    if again != "y":        break print("测试结束")
👆 右边现在是空的。从 ① 开始,一块一块点下去,它对应的那几行代码就会跳出来——你会亲眼看到"这张图是怎么一行一行变成程序"的。
已揭示 0 / 12 块 讲完了想回看全貌,点"全部展开"

读程序前,先记住三个规矩

规矩为什么
缩进用 4 个空格Python 里缩进不是排版,是语法。缩进就是告诉电脑"这一段归上面那个 if / while 管"。Tab 和空格混用会直接报错。
= 是"给",== 是"问"name = "白鹭" 是给;name == "白鹭" 是问。写错不报错,但逻辑全变。
标点必须是英文中文的 ( : " , 一定报错。写代码时把输入法切到英文。
# 缩进对了
if shape == 2:
    name = "黑脸琵鹭"        # ← 有缩进:归 if 管
print(name)                # ← 没缩进:不归 if 管
第 9 幕 · 实践

⌨️ 填空:让程序开口说话

填完 5 个空,让它跑通、存好

程序骨架:四块里只有一块要你动

整段程序分四块:第 1 块打招呼、第 2 块读数据、第 4 块输出结果,都不用动;只有第 3 块的五处空要你填。

# ===== 1. 打招呼 + 说清编码(不用改)=====
print("淇澳岛候鸟鉴定助手 v1.0")
print("喙形:1尖直 2扁匙 3上翘")
print("羽色:1全白 2灰 3黑白")

while True:
    # ===== 2. 读入一条记录(不用改)=====
    body  = float(input("体长(cm):"))
    beak  = float(input("喙长(cm):"))
    shape = int(input("喙形(1/2/3):"))
    color = int(input("羽色(1/2/3):"))

    # ===== 3. 逐级判断(五个空,你来填)=====
    if shape == ① ?:                     # 扁匙状
        name = "黑脸琵鹭"
    elif body >= ② ? and color == ③ ?:   # 大型 + 灰
        name = "苍鹭"
    elif body >= 85 and color == 1:
        name = "大白鹭"
    elif body >= ④ ? and color == 1:   # 中型 + 白
        name = "白鹭"
    elif shape == ⑤ ?:                   # 细长上翘
        name = "反嘴鹬"
    else:
        name = "青脚鹬"

    # ===== 4. 输出 + 问要不要再测(不用改)=====
    print("判为:", name)
    again = input("再测一条?(y/n):")
    if again != "y":
        break

✍️ 每填一个空就按一次 F5,看结果有没有变。程序会说话,它会把自己的判断喊出来。

五个空,逐个攻破

先自己做,卡住了再点下面的选项验证——也可以直接点上面代码里的 ① ? 跳下来。

① 喙形是"扁匙状"时,编码是几?
✅ 2(尖直=1,扁匙=2,上翘=3)。先判这一条,黑脸琵鹭lù就永远不会被认错。
② 大型涉禽的体长门槛是多少?
✅ 85。中白鹭最长 72cm,大白鹭最短 85cm,中间是空的——阈值就取在这条缝里。
③ "灰 / 苍灰"的羽色编码是几?
✅ 2(全白=1,灰=2,黑白相间=3)。
④ 中型涉禽的体长门槛是多少?
✅ 50。反嘴鹬yù最长 46cm,白鹭最短 55cm,又是取在缝里。
⑤ "细长上翘"的喙形编码是几?
✅ 3。反嘴鹬的嘴是唯一明显往上翘的。

填错了会怎样?它不会停,而是“自信地”给你一个错答案

假如 ① 那个空你填成了 0(正确是 2)。程序不报错、照样跑,只是——黑脸琵鹭再也认不出来了:

你输入的数据应该判为① 填错后判为
A11 74 / 17 / 2 / 1黑脸琵鹭白鹭
A12 76 / 18 / 2 / 1黑脸琵鹭白鹭
A13 72 / 16.5 / 2 / 1黑脸琵鹭白鹭

为什么?因为 shape == 0 这个条件永远不成立,程序就一路往下走,最后被"体长≥50 且全白 → 白鹭"收走了——一只国家一级保护动物,被记成了普通白鹭。

所以填完空别急着关程序:填一个空 → 敲一组数据 → 看结果 → 不对就回头改那个空 → 再跑一遍。这个循环,就是编程最真实的样子,没有一个程序是一次写对的。

实践:完成淇澳岛候鸟鉴定程序

把 5 个空填完、跑通、保存好,这个程序就算完成了。文件名和格式按下面三条来:

  • 文件名写学号 + 姓名,例如 1101张三——不要用"新建 1"这种名字,交上来老师找不到人。
  • 后缀必须是 .py。这是 Python 程序文件的标志,保存时"保存类型"选 Python Files (*.py),别存成 .py.txt。
  • 下课前举手让老师确认一次,下节课你的程序要"上岗考核"——拿 20 条真实记录测它,看能对几条。
第 10 幕 · 测试

🧪 上岗考核:20 条真实记录

保护区专家已经人工鉴定过,看你的程序能对几条

这一回,你是"数据录入员"

上节课你的程序只在你手上过了几条。这一次,它要吃 20 条真实记录——数据得你一条一条喂给它——就像保护区的工作人员,把野外记录本上的数字敲进电脑。

  • 打开你保存的 .py,按 F5,它会问你 4 个数。
  • 照《测试记录表》从上往下一条一条输,一条一条记结果。
  • 输完一条,敲 y 回车,接着输下一条。
  • 判错的,在表上把编号圈出来。
  • 最后算:准确率 = 判对条数 ÷ 总条数 × 100%

💡 这 20 条记录,专家已经一条一条人工鉴定过了。也就是说,你的程序正在被"考试"。

输入数据时,只有三件事要注意

程序跑起来会一个问题一个问题地停下来等你——敲完一个数、按回车,它才问下一个。而它只认数字,所以敲的时候注意三点:

① 只敲数字
体长、喙长直接敲 58 或 58.5,不要带 cm、不要带单位
② 编码只敲 1/2/3
喙形、羽色填的是编码数字,不是"扁匙"这两个字
③ 切英文输入法
看着一样的 58(全角数字)电脑不认,会直接报错

💡 报错了不要慌:按 F5 重新运行,从头再来一遍就行。这次敲对就好。

怎么把一行数据"喂"进去

表上的一行,就是程序要的 4 个数字。顺序不能换:体长 → 喙长 → 喙形 → 羽色。

📋 表上的一行
A0595.012.012
编号体长喙长喙形羽色
⌨️ Shell 窗口里你会这样敲
  体长(cm)   :95
  喙长(cm)   :12
  喙形(1/2/3):1
  羽色(1/2/3):2

>>> 判为: 苍鹭

再测一条?(y/n):y

👀 注意:编号 A05 不用输入——编号只是给人看的,程序只看那 4 个特征。

20 条有点多?分工做

方案 A:组内分工
4 人一组,每人负责 5 条(A01–A05 / A06–A10 / …),各自算自己那 5 条的准确率,最后汇总成 20 条。
方案 B:每人全测
时间够就一个人从头测到尾。20 条 × 4 个数字,大约 5–8 分钟——这就是"人工录入"的真实速度。

📌 顺便想一想:这才 20 条。真实监测一年几万条记录,如果全靠人手输入、人眼看图,会怎样?

测试数据(20 条)

这 20 条是保护区专家已经人工鉴定过的记录。照表从上往下,一条一条输进程序:

编号体长喙长喙形羽色备注
A0158.08.011
A0262.08.511
A0355.07.511
A0460.08.011
A0595.012.012
A0692.011.512
A0798.012.512
A0890.011.011
A0988.010.511
A1096.012.011
A1174.017.021喙长特别长
A1276.018.021
A1372.016.521
A1444.07.533
A1545.08.033
A1643.07.033
A1732.05.512
A1834.06.012
A1968.09.011⬅ 注意它
A2070.09.511⬅ 注意它

算算你的准确率

把你判对的条数填进去(0–20):

条 / 共 20 条
90.0%
识别准确率

别忘了纸质的《测试记录表》

表上有四行"错因分析",勾一个、写一句:

□ 特征不够
少看了某个关键特征
□ 阈值不当
分界线划错了
□ 顺序错了
某条规则被前面的挡住了
□ 不在名单里
这个物种本来就没收录

这张表,就是下一幕"查错"的证据。

第 11 幕 · 评价与优化

🔍 90% 之后:错的那两条

从"结果错了",倒推到"哪一步错了"

公布答案

编号体长喙长喙形羽色你的程序判为专家鉴定
A1968.09.011白鹭lù中白鹭
A2070.09.511白鹭中白鹭

其余 18 条全对。18 ÷ 20 = 90%——不错,但这两条错得很有价值。

为什么?我们一步一步倒推:

① 看特征:68cm、9cm、尖嘴、全身白
它确实长得像白鹭——只是比白鹭大一点、壮一点。这一步,连人眼也容易放过。
结论:特征本身没量错
② 看规则:它满足了"体长 ≥ 50 且 羽色 = 白"
前三条规则(扁匙嘴、大型+灰、大型+白)都不符合,它就掉进了第四条——而那条的结论是"白鹭"。
结论:它被"体长≥50"这条规则收走了
③ 看问题:这条规则把两种鸟装进了同一个口袋
体长 55–72cm、全身白、尖嘴的鹭,其实有两种:白鹭和中白鹭。我们的规则只说了"≥50 就算白鹭",等于把口袋缝死了。
改法不是"再猜一次",而是——把口袋拆开。
结论:不是程序写错了,是算法的"分辨率"不够

改法:把口袋拆开

在"白鹭"那条规则之前,插一条新的:

elif body >= 65 and color == 1:      # 全白,且 ≥65cm
    name = "中白鹭"

依据还是那张表:白鹭 55–65,中白鹭 65–72——阈值 65 就取在两段区间的交界处。

⚠️ 位置很要命,试一下:

💡 为什么放后面就不行?因为 elif 的规矩是:前面有一条成立,后面就不看了。A19 早被"白鹭"那条收走了,永远轮不到"中白鹭"。

用数据说话

版本改了什么判对准确率
v1.0五条规则18 / 2090%
v1.1加一条"≥65 且全白 → 中白鹭"20 / 20100%

算法不是一次写对的,是一轮一轮改对的。

第 12 幕 · 边界与总结

🌅 100% 就够了吗?

你的程序认得 7 种鸟,淇澳岛有 200 多种

三个问题,想清楚再收工

① 换成另外 20 条记录,还会是 100% 吗?
不一定。这 20 条是我们挑的"典型个体";而真实的鸟有亚成鸟、有换羽、有量错的时候。在训练它的数据上考 100 分,不代表它真的会认鸟。
👆 点一下看答案
② 飞来一只不在名单里的鸟,程序会说什么?
它一定会说"青脚鹬yù"——因为 else 那一条兜住了所有情况。这是最危险的地方:它会自信地给出一个错误答案。真实系统必须留一个出口:"不确定,请人工复核"。
👆 点一下看答案
③ 把黑脸琵鹭lù认成白鹭,和把白鹭认成黑脸琵鹭,代价一样吗?
不一样。前者会让台账上少一只国家一级,保护决策的依据就失真了;后者只是多记了一笔。所以在真实的监测里,宁可"报可疑",也不能"漏"。这就是信息社会责任。
👆 点一下看答案

我们做的,和真正的 AI,差在哪

我们的规则判定机器学习 / 深度学习
规则谁定人——我们一条条写出来的机器——从大量图片里自己"学"出来
需要什么几个阈值、一张特征表几万张标注好的图片、大量算力
优点看得懂、改得动、不用联网准、能直接处理照片、能认几百种
缺点只认几种、要靠人工量特征黑箱、要数据、错了不好改

所以,我们这节课做的不是 AI,而是 AI 之前的那一步:把人的经验,写成机器能执行的规则。

🔭 到了第六章,我们会看到:机器是怎么自己从数据里"学"出这些规则的。

小测:5 题,检验一下

1. 下列哪一项,不是算法的基本特征?
2. "看到像白鹭,就判它是白鹭。"这句话最主要缺哪个特征?
3. 流程图里,菱形表示( )。
4. 程序里的 if / elif / else,对应流程图的( )。
5. 20 条记录判对 18 条,准确率是( )。
5 / 5

一次答对得越多,说明这节课的"概念"越扎实

候鸟不会为人类停下,
但我们可以让机器替我们守着。

今天你完成的不只是一个程序,而是一条完整的链路:

发现需求 → 抽象特征 → 设计算法 → 写成程序 → 测试优化

这条路,和你以后遇到任何"用电脑解决真实问题"的路,是同一条。

📌 下课前提交三样东西:算法设计单 + .py 程序 + 测试记录表