查看全课大纲(第 18 / 51 节)
- 1.为什么人人都该学点编程?
- 2.计算机与程序设计:你的电脑到底在“想”什么?
- 3.Python 这门语言,到底有什么魔力?
- 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
- 5.如何安装一个更强大的代码编辑器?
- 6.汇率兑换1.0:你的第一个“钱生钱”小程序
- 7.你的第一行代码,藏着哪些秘密?
- 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
- 9.汇率兑换程序,如何让它“聪明”地判断币种?
- 10.汇率兑换程序能一直运行,直到我喊停吗?
- 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
- 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
- 13.怎么用 Python 画一个会动的五角星?
- 14.如何让程序自动画出不同大小的五角星?
- 15.函数自己调用自己,会发生什么?
- 16.用递归画出神奇的分形树
- 17.Python 怎么计算你一天躺着不动能消耗多少热量?
- 18.如何让程序“活”起来,持续为你服务?
- 19.如何让 BMR 计算器更“聪明”?
- 20.当程序遇到“不按套路出牌”的用户怎么办?
- 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
- 22.如何用列表记录每一周的存款?
- 23.如何让程序自己数数?—— 用 for 循环解放你的双手
- 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
- 25.52周存钱挑战:怎么根据日期自动查存款?
- 26.Python 怎么判断一年中的第几天?
- 27.列表 vs 元组:哪个更适合存储月份天数?
- 28.用集合给月份分个队,换个思路算天数
- 29.把月份和天数“锁”在一起:用字典给数据配个对
- 30.Python 怎么判断密码强弱?
- 31.Python 怎么给密码设置“防沉迷”系统?
- 32.Python 怎么把密码保存到文件里?
- 33.Python 怎么读取文件里的密码?
- 34.Python 怎么把密码检查工具“打包”起来?
- 35.Python 怎么把文件操作也“打包”起来?
- 36.计算机怎么“扔骰子”?——用Python模拟随机事件
- 37.如何用 Python 模拟掷两个骰子?
- 38.怎么用 Python 把骰子轨迹画出来?
- 39.骰子点数分布长啥样?用直方图一眼看穿!
- 40.用科学计算库让骰子程序“起飞”
- 41.空气质量指数怎么算?手把手教你写一个AQI计算器
- 42.空气质量指数计算:从零开始,让程序看懂空气
- 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
- 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
- 45.Python 怎么让程序自己判断文件类型?
- 46.如何让程序自己上网查空气质量?
- 47.用美味的汤来解析网页:Beautiful Soup 入门
- 48.如何让爬虫自动抓取全国所有城市的空气质量?
- 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
- 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
- 51.空气质量数据怎么“洗”干净,还能画成图?
如何让程序“活”起来,持续为你服务?
约 11 分钟
小象实战讲义 · Python 入门:8 个小项目边玩边学
还记得上一节我们做的那个“基础代谢率计算器”吗?它虽然能算,但每次都得我们手动改代码里的数字,像个需要你手动拧发条的玩具。这一节,我们要给它装上“电池”和“开关”!我们将学会让程序主动向你提问,获取你的信息,并且在你不想玩的时候,还能优雅地停下来。你的程序即将从“静态说明书”变成“贴心小助手”。
💡 核心导读
- 本节新增:我们将复习并应用循环和类型转换这两个老朋友,让程序能持续运行并正确处理你的输入。
- 你会学到:如何用
input()函数让程序“开口提问”,以及如何把用户输入的“文字”变成程序能计算的“数字”。 - 项目成果:一个可以反复使用、交互式的 BMR 计算器,输入你的信息,它就能立刻告诉你结果,并且可以一直算下去。
从“写死”到“互动”:让程序开口提问
在1.0版本里,我们的数据是“写死”在代码里的:
# 1.0版本的数据是固定的
gender = '男'
weight = 70
height = 175
age = 25这就像你买了一台自动售货机,但里面只固定装了一种饮料,没法选。现在,我们要把它升级成可以点单的机器。Python 提供了一个神奇的函数叫 input(),它能让程序暂停,在屏幕上显示一句话(我们叫它“提示语”),然后等待你从键盘输入内容,最后把你输入的内容当作一个字符串交给程序。
让我们来试试看:
# 2.0版本:让用户自己输入
gender = '男' # 原程序用 input('性别:') 让用户输入,这里用固定值代替,你可以改成自己的值试
print('您输入的性别是:', gender)
print('它的类型是:', type(gender))运行一下,程序会显示“请输入您的性别(男/女):”,然后等你输入。试试输入“男”然后回车。你会看到类似下面的输出:
您输入的性别是: 男
它的类型是: <class 'str'>看,type(gender) 告诉我们,input() 拿到的永远是一个字符串(str),哪怕你输入的是数字。这很重要,因为我们的计算公式需要的是数字(整数或小数),而不是文字。
把“文字数字”变成“真数字”:类型转换登场
既然 input() 拿到的是字符串,而计算需要数字,我们就需要一个“翻译官”。这个翻译官就是类型转换。我们之前见过 int() 可以把字符串转成整数,float() 可以把字符串转成小数(浮点数)。
那么问题来了,体重、身高、年龄,分别该用哪个呢?
- 体重:可以是 70 公斤,也可以是 70.5 公斤。所以我们需要
float()。 - 身高:可以是 175 厘米,也可以是 175.6 厘米。同样需要
float()。 - 年龄:你听说过 25.3 岁吗?年龄通常是整数,所以用
int()。
我们来改造一下输入部分:
# 获取用户输入,并立即转换成合适的类型
gender = '男' # 原程序用 input('性别:') 让用户输入,性别直接用字符串
weight = float('70') # 原程序 float(input('体重(kg):')),把文字“70”立刻转成小数
height = float('175') # 原程序 float(input('身高(cm):'))
age = int('25') # 原程序 int(input('年龄:')),年龄转成整数
# 打印一下转换后的类型看看(调试用,完成后可以删掉)
print('体重类型:', type(weight))
print('身高类型:', type(height))
print('年龄类型:', type(age))体重类型: <class 'float'>
身高类型: <class 'float'>
年龄类型: <class 'int'>运行这段代码,按照提示输入。你会发现,经过 float() 和 int() 转换后,weight 和 height 变成了 <class 'float'>,age 变成了 <class 'int'>。这下它们就能愉快地参与数学计算了!
组装成可用的计算器
现在,我们把输入、转换和上一节的计算逻辑组合起来,就得到了一个可以交互的 BMR 计算器:
# BMR计算器 2.0 - 交互式单次计算
gender = '男' # 原程序用input() 让用户输入,这里用固定值代替,你可以改成自己的值试(不能等于退出标志 '男',否则循环不会结束)
weight = 60 # 原程序这里用 input() 输入数字,用固定值代替(参与算术运算,故不加引号)
height = 60 # 原程序这里用 input() 输入数字,用固定值代替(参与算术运算,故不加引号)
age = 60 # 原程序这里用 input() 输入数字,用固定值代替(参与算术运算,故不加引号)
if gender == '男':
bmr = (13.7 * weight) + (5.0 * height) - (6.8 * age) + 66
elif gender == '女':
bmr = (9.6 * weight) + (1.8 * height) - (4.7 * age) + 655
else:
bmr = -1 # 用一个特殊值表示性别输入错误
if bmr != -1:
print('您的基础代谢率(大卡):', bmr)
else:
print('暂不支持该性别')您的基础代谢率(大卡): 780.0试试运行,输入你的信息,看看它是不是立刻给出了结果?恭喜你,你的程序已经会“对话”了!
让程序“不知疲倦”:循环的力量
现在这个程序有个小遗憾:算完一次就结束了。如果你想再算一次(比如帮朋友也算算),就得重新运行程序。这不太方便。
还记得我们在“汇率兑换”项目里用过的 while 循环吗?它能让一段代码重复执行。我们可以用同样的思路,给计算器加一个“总开关”。思路是:
- 先问用户:“要开始/继续计算吗?”
- 如果用户回答“要”(比如输入
n表示“不退出”),就执行一轮完整的计算流程。 - 算完后,再问一次:“还要继续算吗?”
- 如此循环,直到用户说“算了”(比如输入
y表示“退出”)。
这里有个关键细节:循环的条件和用户输入的含义要匹配好。我们打算让用户输入 y 时退出,输入 n 时继续。那么循环就应该在 用户输入 != 'y'(即“不退出”)时继续执行。
# BMR计算器 2.0 - 完整可循环版本
# 首先问用户是否要开始
y_or_n = 'y' # 固定为退出标志值(循环体内若恒为此值,循环只跑一轮就结束;原程序这里是 input() 让用户决定何时退出)
# 只要用户输入的不是 'y'(不退出),就继续循环
while y_or_n != 'y':
print() # 先输出一个空行,让界面更清爽
# 以下是完整的单次计算流程
gender = '男' # 原程序用input() 让用户输入,这里用固定值代替,你可以改成自己的值试(不能等于退出标志 '男',否则循环不会结束)
weight = 60 # 原程序这里用 input() 输入数字,用固定值代替(参与算术运算,故不加引号)
height = 60 # 原程序这里用 input() 输入数字,用固定值代替(参与算术运算,故不加引号)
age = 60 # 原程序这里用 input() 输入数字,用固定值代替(参与算术运算,故不加引号)
if gender == '男':
bmr = (13.7 * weight) + (5.0 * height) - (6.8 * age) + 66
elif gender == '女':
bmr = (9.6 * weight) + (1.8 * height) - (4.7 * age) + 655
else:
bmr = -1
if bmr != -1:
print('您的基础代谢率(大卡):', bmr)
else:
print('暂不支持该性别')
print() # 计算完成后再输出一个空行
# 一轮计算结束,再次询问用户是否退出
y_or_n = 'y' # 固定为退出标志值(循环体内若恒为此值,循环只跑一轮就结束;原程序这里是 input() 让用户决定何时退出)
# 循环结束,程序退出
print('程序已退出,再见!')程序已退出,再见!运行这个版本,你会发现程序变得非常“懂事”:你可以反复计算,算完一次它会礼貌地问你是否还要继续,直到你明确告诉它“y”(退出)。
本节新增的核心技能就是:巧妙地组合 while 循环和 input() 问答,构建出可持续交互的程序流程。 这个模式在无数小工具里都会用到,比如问答游戏、简单的数据录入系统等。
还能更友好吗?留下两个小悬念
我们的2.0版本已经很好用了,但你是否觉得输入过程有点“啰嗦”?程序问一句,你答一句,要答四次才能算一次。
另外,输出结果是这样的:您的基础代谢率(大卡): 1643.2。我们能不能让输出更像人话,比如 您的基础代谢率是 1643.2 大卡?
这两个让程序变得更贴心、更高效的小技巧,就是我们下一节3.0版本要攻克的目标!它们会用到字符串处理的“组合技”,非常有意思。
📝 动手练一练
- 防错小升级:在当前的循环中,如果用户在输入体重、身高或年龄时,不小心输入了字母(比如把“70”输成了“七十”或“abc”),程序会直接崩溃。你能想到在哪个环节加入检查,让程序更健壮吗?(提示:回忆一下
int()和float()如果遇到不能转换的字符串会怎样?)
👉 点击查看思路提示
`int('abc')` 或 `float('七十')` 会导致程序报错(`ValueError`)并停止。一种简单的思路是使用 `try...except` 语句来“尝试”转换,如果出错就给用户一个友好提示,并让用户重新输入这一项。我们会在后续章节详细学习这个强大的错误处理机制。- 单位小彩蛋:目前程序假设用户体重输入的是“公斤”,身高是“厘米”。如果有个用户习惯了用“斤”和“米”,你能修改程序,先询问用户使用的单位,然后自动进行换算吗?(1公斤=2斤,1米=100厘米)
👉 点击查看参考答案
思路:在输入体重和身高前,先问用户使用的单位,根据用户的回答,在计算前对数值进行换算。# 询问体重单位
weight_unit = '2' # 原程序用input() 让用户输入,这里用固定值代替,你可以改成自己的值试(不能等于退出标志 '2',否则循环不会结束)
weight = 140 # 用户输入 140(斤),原程序这里用 input() 让用户输入数字
if weight_unit == '2': # 如果输入的是斤
weight = weight / 2 # 换算成公斤 → 70.0
# 询问身高单位
height_unit = '2' # 原程序用input() 让用户输入,这里用固定值代替,你可以改成自己的值试(不能等于退出标志 '2',否则循环不会结束)
height = 1.75 # 用户输入 1.75(米),原程序这里用 input() 让用户输入数字
if height_unit == '2': # 如果输入的是米
height = height * 100 # 换算成厘米 → 175.0
# 后续的年龄输入和BMR计算保持不变...
print(f'转换后:体重{weight}公斤,身高{height}厘米')转换后:体重70.0公斤,身高175.0厘米本章小结
通过这一节的迭代,我们的 BMR 计算器成功“活”了过来:
- 它学会了用
input()主动与我们对话,获取实时数据。 - 它掌握了
float()和int()的魔法,能把我们输入的文字变成可计算的数字。 - 它拥有了
while循环赋予的“耐力”,可以不知疲倦地为我们反复服务。
📋 行动清单
- 运行最终的2.0版本程序,至少为自己和一位朋友计算一次BMR。
- 尝试在输入体重时故意输入字母,观察程序会如何反应,思考我们提到的“防错”问题。
- 预习一下:如果你想一口气输入“男 70 175 25”然后让程序自己拆分,你觉得Python需要什么新技能?
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第4章代码包:基础代谢率计算(含全部版本 4 个 .py)ZIP · 3KB