第10章-综合练习:猜数字与计算器


第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 会把 + 当成加法运算,报语法错误。

升级改造(进阶):把两个程序玩出花

程序写完能跑,只算第一步。改造才是编程能力的体现——加一个限制、加一个功能,程序就更像"产品"。三个进阶方向:

  1. 猜数字限次:最多猜 7 次,猜不中游戏结束(count >= 7break,并公布答案)
  2. 计算器连续运算:算完一个,问"是否继续",按 y 再来一次,按 n 退出(用 while True 把整个程序包起来)
  3. 猜数字范围提示:每次猜完提示"还剩几次机会"
# 升级一:限 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。写完后两两互相"当用户"测试,看程序的边界情况。

  1. 练习一(计算器基础版):输入两个数和运算符(+ - * /),输出结果。要求:处理除以 0、处理不认识的运算符。 提示:参考上面的计算器代码。先自己默写,写完对照——特别注意 elif 的个数和除 0 分支。

  2. 练习二(猜数字基础版):程序随机生成 1~100 的数,用户反复猜,提示大了 / 小了,猜对输出猜的次数并结束。 提示:检查三件事:① while True 里有 break;② count += 1 位置正确;③ 输入转成了 int。

  3. 练习三(进阶:计算器连续运算):把计算器升级成:算完一个结果后,问"继续吗?(y/n)",输 y 重新开始,输 n 退出。 提示:把整个计算逻辑包进 while True,循环体最后用 input 收"继续吗",again != "y" 就 break。

  4. 练习四(进阶:猜数字限 7 次):给猜数字加"最多猜 7 次",7 次没猜中输出正确答案并结束。 提示:重点想清楚:为什么"次数用完"的判断要放在收猜测之前

  5. 练习五(高阶:猜数字范围提示):每次猜完,提示"你还可以猜 X 次";并加上"猜 1~50 或 51~100 区间引导"(比如猜 40 时说"再往大点猜")。自由发挥,做成你喜欢的样子。 提示:剩余次数 = 7 - count。区间引导用 if 判断即可。改完记得多测几遍边界(猜 1、猜 100、连猜 7 次)。

卡住了?让 AI 搭把手

场景:让 AI 先写一版,你读懂再改造(周五标准流程)
提示词:我是 Python 零基础学生,今天学完了变量、input/printif、循环。
请帮我写一个猜数字游戏:程序随机生成 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()
输入输出 + 温度转换 inputfloat() 转换、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