第10章 综合练习:猜数字与计算器
前四天你攒了四块"零件":变量(存数据)、input/print(收吐数据)、if(做判断)、循环(重复干活)。今天是把零件组装成完整机器的日子。猜数字是"机器猜谜",计算器是"机器算账",两个都是真实软件的原型。
今天还有个新帮手:AI 编程助手。今天的练法跟之前不太一样——你可以先让 AI 写一遍,你读懂、改造,再独立写一遍。这不是偷懒,这就是职场里真实的开发方式。跑通这两个程序,你就不再是"只会抄代码的人",而是"能指挥 AI、能看懂逻辑的程序员"。
先把本周的知识串成一条线
程序说白了就是一条流水线:
input 收数据(输入)
↓
变量存起来(存数据)
↓
if / 运算符 处理(判断、计算)
↓
for / while 重复上面步骤(循环)
↓
print 输出结果(输出)
今天两个项目用到的"零件"分别是:
| 零件 | 猜数字用在哪 | 计算器用在哪 |
|---|---|---|
| 变量 | 存答案 answer、存次数 count |
存两个数 num1 num2、运算符 op |
| input / 类型转换 | int(input(...)) 收猜测 |
float(input(...)) 收数字(可能带小数) |
| if / elif / else | 大了 / 小了 / 对了 | + - * / 四种运算分支 |
| 循环 | while True 猜不对一直猜 |
(进阶)while True 算完继续算 |
| 运算符 | 比较 > < |
算术 + - * /、比较 == |
| 新知识 | import random 随机数 |
除 0 判断 |
一个最小的"输入-处理-输出"程序长这样:
# 完整流程示范:一个"输入-处理-输出"的最小程序
# 1. 收数据
name = input("你的名字:")
# 2. 存数据 + 处理
age = int(input("你的年龄:"))
# 3. 输出
print(f"你好 {name},你 {age} 岁,明年 {age + 1} 岁")
写大程序有三条经验:
- 先写框架:先搭"收 → 存 → 处理 → 输出"的空架子,一步步填。别一上来就想一步到位。
- 每个 input 先想类型:要算数的用
int()/float(),纯文字的不用转。转换放在 input 后面紧挨着。 - 程序 = 数据 + 流程:本周所有知识点都在为这两个项目服务,卡住了就回来对着零件清单查缺补漏。
import random:让程序"掷骰子"
猜数字需要程序随机想一个数。Python 帮你备好了一个"随机数仓库"叫 random 模块(模块 = 现成的工具包),用之前要先导入:
import random # 导入工具包
answer = random.randint(1, 100) # 从工具包里拿"随机整数"
random.randint(开始, 结束) 返回开始~结束之间的随机整数(两边都包含)。每运行一次程序,生成的数都不同——这就是"掷骰子"。
import random
print(random.randint(1, 100)) # 每次运行结果都不同,比如 37
print(random.randint(1, 100)) # 比如 82
print(random.randint(1, 6)) # 模拟掷骰子 1~6
# 注意:两次调用是两个独立随机数,不一定一样
三点:
import忘写会报 NameError:没导入就random.randint(...),报NameError: name 'random' is not defined。- 大小写和括号:
random.randint(1, 100),randint全小写、有(),参数用逗号隔开,两边都包含(可能出 1 也可能出 100)。 import random放文件顶部:按惯例放第一行,以后学到的import都这样。
猜数字:while True + break 经典套路
猜数字的逻辑:程序想一个数,用户反复猜,直到猜对。这天然是"次数不知道,条件式循环"——用 while True 无限循环 + break 猜对退出。这是编程里最经典的套路之一,务必背下来:
while True: # 一直循环
收用户猜测
比较:大了?小了?对了?
对了 → break 退出
再加一个 count 计数器统计猜了几次,每轮循环 count += 1(这是 count = count + 1 的简写,Python 特色写法)。
import random
answer = random.randint(1, 100) # 程序随机想的答案(1~100)
count = 0 # 计数器:猜了几次
print("我想好了一个 1~100 的数字,你来猜!")
while True:
guess = int(input("猜一个数字:"))
count += 1 # 每猜一次 +1
if guess > answer:
print("大了,再试")
elif guess < answer:
print("小了,再试")
else:
print(f"恭喜!你猜了 {count} 次猜中了!")
break # 猜对,退出循环
三个注意点:
while True必须有 break 路径:如果break忘写或写错缩进,这就是死循环,按Ctrl + C自救。count += 1必须放在每轮开始:放在循环最前面,无论大了小了都算一次。放错位置次数会不对。int(input(...))收猜测:输入转 int 再比较,不然"50" > answer字符串和整数比大小会报TypeError。
计算器:if 多分支的实战
计算器:输入两个数和一个运算符,输出结果。核心是 if / elif 按运算符分流:
if op == "+": 做加法
elif op == "-": 做减法
elif op == "*": 做乘法
elif op == "/": 做除法(先查除数是不是 0!)
else: 运算符不认识
两个细节是"加分项":① 数字用 float() 转,因为除法结果有小数;② 除 0 必须特殊处理——num2 == 0 时给用户友好提示,而不是让程序报错崩溃。
# 基本版计算器
num1 = float(input("第一个数:"))
num2 = float(input("第二个数:"))
op = input("运算符(+ - * /):")
if op == "+":
print(f"结果:{num1 + num2}")
elif op == "-":
print(f"结果:{num1 - num2}")
elif op == "*":
print(f"结果:{num1 * num2}")
elif op == "/":
if num2 == 0: # 嵌套 if:先查除数
print("不能除以 0!")
else:
print(f"结果:{num1 / num2}")
else:
print("运算符不认识!")
三个注意点:
op == "+"的==别写成=:比较相等用双等号,单等号是赋值,会语法报错。- 除 0 检查不能少:
num1 / num2遇到num2 == 0会报ZeroDivisionError直接崩溃。提前用 if 拦住,程序才"懂事"。 - 运算符要用引号:用户输入的是字符串,所以
op == "+"里+必须加引号。漏引号,Python 会把+当成加法运算,报语法错误。
升级改造(进阶):把两个程序玩出花
程序写完能跑,只算第一步。改造才是编程能力的体现——加一个限制、加一个功能,程序就更像"产品"。三个进阶方向:
- 猜数字限次:最多猜 7 次,猜不中游戏结束(
count >= 7时break,并公布答案) - 计算器连续运算:算完一个,问"是否继续",按 y 再来一次,按 n 退出(用
while True把整个程序包起来) - 猜数字范围提示:每次猜完提示"还剩几次机会"
# 升级一:限 7 次机会的猜数字
import random
answer = random.randint(1, 100)
count = 0
print("我有 7 次机会的猜数字游戏!")
while True:
if count >= 7: # 次数用完
print(f"次数用完啦!答案是 {answer}")
break
guess = int(input("猜一个 1~100 的数字:"))
count += 1
if guess > answer:
print("大了")
elif guess < answer:
print("小了")
else:
print(f"恭喜!你用了 {count} 次")
break
# 升级二:能连续算的计算器(把基本版包进 while True)
while True:
num1 = float(input("第一个数:"))
num2 = float(input("第二个数:"))
op = input("运算符(+ - * /):")
if op == "+":
print(f"结果:{num1 + num2}")
elif op == "-":
print(f"结果:{num1 - num2}")
elif op == "*":
print(f"结果:{num1 * num2}")
elif op == "/":
if num2 == 0:
print("不能除以 0!")
else:
print(f"结果:{num1 / num2}")
else:
print("运算符不认识!")
again = input("继续吗?(y/n):")
if again != "y": # 输入不是 y 就退出
print("再见!")
break
三个注意点:
- 限次的判断顺序:
count >= 7的判断要放在"收猜测"之前,这样第 7 次猜完,下一次循环才触发退出——逻辑刚好对。 again != "y"控制退出:用户输 n 或其他都退出,只有输 y 才继续。这是"非 y 即退"的常见写法,简单粗暴不出错。- 改造顺序建议:先跑通基本版 → 加一个小功能 → 再跑通 → 再继续加。别一次改一堆,改坏了不知道哪行出的问题。
随堂练习
规则:先独立写,卡住 5 分钟再问 AI。写完后两两互相"当用户"测试,看程序的边界情况。
-
练习一(计算器基础版):输入两个数和运算符(+ - * /),输出结果。要求:处理除以 0、处理不认识的运算符。 提示:参考上面的计算器代码。先自己默写,写完对照——特别注意
elif的个数和除 0 分支。 -
练习二(猜数字基础版):程序随机生成 1~100 的数,用户反复猜,提示大了 / 小了,猜对输出猜的次数并结束。 提示:检查三件事:①
while True里有 break;②count += 1位置正确;③ 输入转成了 int。 -
练习三(进阶:计算器连续运算):把计算器升级成:算完一个结果后,问"继续吗?(y/n)",输 y 重新开始,输 n 退出。 提示:把整个计算逻辑包进
while True,循环体最后用input收"继续吗",again != "y"就 break。 -
练习四(进阶:猜数字限 7 次):给猜数字加"最多猜 7 次",7 次没猜中输出正确答案并结束。 提示:重点想清楚:为什么"次数用完"的判断要放在收猜测之前?
-
★ 练习五(高阶:猜数字范围提示):每次猜完,提示"你还可以猜 X 次";并加上"猜 1~50 或 51~100 区间引导"(比如猜 40 时说"再往大点猜")。自由发挥,做成你喜欢的样子。 提示:剩余次数 =
7 - count。区间引导用 if 判断即可。改完记得多测几遍边界(猜 1、猜 100、连猜 7 次)。
卡住了?让 AI 搭把手
场景:让 AI 先写一版,你读懂再改造(周五标准流程)
提示词:我是 Python 零基础学生,今天学完了变量、input/print、if、循环。
请帮我写一个猜数字游戏:程序随机生成 1~100 的数,用户猜,
提示大了还是小了,猜对输出用了多少次。要求:
1. 用 while True 和 break 实现;
2. 每行代码加中文注释,解释它在干什么;
3. 代码要能直接运行。
场景:报错不会查,把报错甩给 AI
提示词:我是 Python 零基础学生。我运行下面的代码报了错:[粘贴报错信息]。
代码是:[粘贴代码]。请用大白话告诉我这个报错是什么意思、
是哪一行的问题、应该怎么改。不要改动代码风格,只在必要处修改。
场景:想让 AI 解释别人的代码(比如升级版)
提示词:我是 Python 零基础学生。下面这段代码我不理解
"count >= 7 的判断为什么要放在 input 前面":[粘贴代码]。
请用大白话+画流程的方式解释这个 while 循环的执行顺序,
先做什么、再做什么、什么时候退出。
常见报错速查
| 报错信息 | 什么意思 | 怎么办 |
|---|---|---|
NameError: name 'random' is not defined |
用了 random 但没导入 | 文件最顶部写 import random |
TypeError: '>' not supported between instances of 'str' and 'int' |
input 返回的字符串没转 int 就比大小 | int(input(...)) 之后再比较 |
ZeroDivisionError: division by zero |
除法除数为 0 | 除 0 前用 if num2 == 0: 检查并提示 |
SyntaxError: invalid syntax(运算符那行) |
op == "+" 漏了引号,+ 被当成运算 |
运算符比较必须加引号:op == "+" |
| 猜数字卡住不动 | while True 里没有能走到 break 的分支 |
检查"猜对"分支有没有 break,次数用完分支有没有 break |
ValueError: could not convert string to float |
输入了字母/符号,float() 转不了 |
确认输入的是数字;输入 0 退出游戏时也要先转 float 成功才行 |
收个尾:本周到此,周六见
第 2 周的内容到今天结束。这一周,你从"会写几行代码"进步到"能做出两个完整小程序":猜数字(while True + break + 计数器)和计算器(if / elif 分流 + 除 0 处理)。面对 AI 的正确姿势也建立起来了:先自己写 → 卡住给 AI 描述需求和报错 → 读懂 AI 的代码再改 → 独立重写一遍。
明天(周六)是周测——上机操作题,直接打开 VSCode 写代码,共 4 题,覆盖本周全部核心语法。考的是"会不会写",不是"会不会背",所以今晚别只看,把手上的程序都亲手再跑一遍。
本周测评(周六周测说明)
周六上午 9:00 教室上机周测,约 40 分钟,独立完成。
- 形式:上机操作题(不是笔试、不背书)。直接打开 VSCode 写代码,共 4 题,覆盖本周全部核心语法:
| 题号 | 考点 | 提示 |
|---|---|---|
| ① | 定义变量并打印类型 | 4 种数据类型 + type() |
| ② | 输入输出 + 温度转换 | input、float() 转换、f-string、公式 华氏 = 摄氏 * 9 / 5 + 32 |
| ③ | if 判断 | 奇偶判断或成绩等级,注意缩进和 elif 顺序 |
| ④ | for / while 循环各一题 | range 打印、带计数器的 while,注意别写死循环 |
- 考核要点:操作为主、理论为辅。会写代码 > 会背概念。代码能运行、输出正确即得分;语法小错酌情扣分。完成 60% 即通过。
- 未通过怎么办:周日下午到教室补测,重点补错题对应的知识点(比如 if 缩进错了,就专练 if)。补测通过视为本周通过。
- 考前自查清单(对着本周内容过一遍):
- [ ] 能默写 4 种类型定义 +
type()输出格式 - [ ] 能默写"输入 → 转换 → 计算 → f-string 输出"温度转换全流程
- [ ] 能默写 if / elif / else 成绩等级(注意顺序和缩进)
- [ ] 能默写
for i in range(...)打印 1~100,while计数器版本 - [ ] 知道 break / continue 区别,卡死循环知道按
Ctrl + C