查看全课大纲(第 18 / 51 节)
  1. 1.为什么人人都该学点编程?
  2. 2.计算机与程序设计:你的电脑到底在“想”什么?
  3. 3.Python 这门语言,到底有什么魔力?
  4. 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
  5. 5.如何安装一个更强大的代码编辑器?
  6. 6.汇率兑换1.0:你的第一个“钱生钱”小程序
  7. 7.你的第一行代码,藏着哪些秘密?
  8. 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
  9. 9.汇率兑换程序,如何让它“聪明”地判断币种?
  10. 10.汇率兑换程序能一直运行,直到我喊停吗?
  11. 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
  12. 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
  13. 13.怎么用 Python 画一个会动的五角星?
  14. 14.如何让程序自动画出不同大小的五角星?
  15. 15.函数自己调用自己,会发生什么?
  16. 16.用递归画出神奇的分形树
  17. 17.Python 怎么计算你一天躺着不动能消耗多少热量?
  18. 18.如何让程序“活”起来,持续为你服务?
  19. 19.如何让 BMR 计算器更“聪明”?
  20. 20.当程序遇到“不按套路出牌”的用户怎么办?
  21. 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
  22. 22.如何用列表记录每一周的存款?
  23. 23.如何让程序自己数数?—— 用 for 循环解放你的双手
  24. 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
  25. 25.52周存钱挑战:怎么根据日期自动查存款?
  26. 26.Python 怎么判断一年中的第几天?
  27. 27.列表 vs 元组:哪个更适合存储月份天数?
  28. 28.用集合给月份分个队,换个思路算天数
  29. 29.把月份和天数“锁”在一起:用字典给数据配个对
  30. 30.Python 怎么判断密码强弱?
  31. 31.Python 怎么给密码设置“防沉迷”系统?
  32. 32.Python 怎么把密码保存到文件里?
  33. 33.Python 怎么读取文件里的密码?
  34. 34.Python 怎么把密码检查工具“打包”起来?
  35. 35.Python 怎么把文件操作也“打包”起来?
  36. 36.计算机怎么“扔骰子”?——用Python模拟随机事件
  37. 37.如何用 Python 模拟掷两个骰子?
  38. 38.怎么用 Python 把骰子轨迹画出来?
  39. 39.骰子点数分布长啥样?用直方图一眼看穿!
  40. 40.用科学计算库让骰子程序“起飞”
  41. 41.空气质量指数怎么算?手把手教你写一个AQI计算器
  42. 42.空气质量指数计算:从零开始,让程序看懂空气
  43. 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
  44. 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
  45. 45.Python 怎么让程序自己判断文件类型?
  46. 46.如何让程序自己上网查空气质量?
  47. 47.用美味的汤来解析网页:Beautiful Soup 入门
  48. 48.如何让爬虫自动抓取全国所有城市的空气质量?
  49. 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
  50. 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
  51. 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 循环吗?它能让一段代码重复执行。我们可以用同样的思路,给计算器加一个“总开关”。思路是:

  1. 先问用户:“要开始/继续计算吗?”
  2. 如果用户回答“要”(比如输入 n 表示“不退出”),就执行一轮完整的计算流程。
  3. 算完后,再问一次:“还要继续算吗?”
  4. 如此循环,直到用户说“算了”(比如输入 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版本要攻克的目标!它们会用到字符串处理的“组合技”,非常有意思。

📝 动手练一练

  1. 防错小升级:在当前的循环中,如果用户在输入体重、身高或年龄时,不小心输入了字母(比如把“70”输成了“七十”或“abc”),程序会直接崩溃。你能想到在哪个环节加入检查,让程序更健壮吗?(提示:回忆一下 int() 和 float() 如果遇到不能转换的字符串会怎样?)
👉 点击查看思路提示`int('abc')` 或 `float('七十')` 会导致程序报错(`ValueError`)并停止。一种简单的思路是使用 `try...except` 语句来“尝试”转换,如果出错就给用户一个友好提示,并让用户重新输入这一项。我们会在后续章节详细学习这个强大的错误处理机制。
  1. 单位小彩蛋:目前程序假设用户体重输入的是“公斤”,身高是“厘米”。如果有个用户习惯了用“斤”和“米”,你能修改程序,先询问用户使用的单位,然后自动进行换算吗?(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
    下载
看图文没弄懂?展开看本节视频讲解(约 11 分钟)
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)