查看全课大纲(第 19 / 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.空气质量数据怎么“洗”干净,还能画成图?

如何让 BMR 计算器更“聪明”?

约 17 分钟

小象实战讲义 · Python 入门:8 个小项目边玩边学

欢迎回来!在上一节,我们让 BMR 计算器学会了“循环工作”,可以反复计算不同人的基础代谢率。这一节,我们要给它升级两个超实用的“小聪明”:

  1. 一键输入:让用户把所有信息(性别、体重、身高、年龄)一口气输完,不用再按四次回车。
  2. 专业输出:让计算结果带上单位(比如“公斤”、“厘米”、“大卡”),看起来就像专业体检报告一样!

学完这一节,你的程序会变得更“懂”用户,交互体验直线上升。是不是很酷?

💡 核心导读

  • 本节新增:只学一个“新武器”——字符串的 split() 方法,它能把一句话拆成多个部分。
  • 输入升级:用 split() 处理用户在一行内用空格分隔的多个信息。
  • 输出升级:用 format() 方法,让输出信息带上单位,更清晰、更专业。
  • 平滑过渡:我们只是把原来分开的 input() 合并了,计算逻辑一点没变,所以学起来毫无压力。

回顾与目标:从“一问一答”到“一键输入”

还记得我们的 BMR 计算器 2.0 吗?它的工作流程是这样的:

请输入性别:男
请输入体重(kg):75
请输入身高(cm):175
请输入年龄:25
您的基础代谢率:1798.5 大卡

用户需要和程序进行四次“问答”。虽然能用,但不够高效。想象一下,如果每次体检都要这样一项一项报数据,是不是有点麻烦?

3.0 版本的目标就是:让用户能像填表格一样,在一行内输入所有信息,比如:

请输入信息(性别 体重(kg) 身高(cm) 年龄):男 75 175 25

然后程序能自动识别出每一项,并计算出结果。同时,在输出结果时,把单位也清晰地标出来。

新武器登场:split() —— 字符串的“剪刀”

要实现“一键输入”,关键是要把用户输入的一串文字(一个字符串)按照空格“剪开”,分成我们需要的四部分。Python 提供了一个超级好用的工具:split() 方法。

split() 是做什么的? 它就像一把剪刀,可以按照你指定的“分隔符”(比如空格、逗号),把一个长字符串剪成好几段,然后把这几段装进一个叫“列表”的盒子里给你。

让我们通过一个简单的例子来感受一下它的魔力:

# 假设用户输入了这样一句话
user_input = "男 75 175 25"
print("原始字符串:", user_input)
print("它的类型是:", type(user_input))

# 使用 split() 方法,按照空格进行分割
info_list = user_input.split(' ')
print("\n使用 split(' ') 分割后:", info_list)
print("分割后的类型是:", type(info_list))

# 现在,我们可以从列表里按位置拿出每一项
print("\n从列表中取出各项:")
print("性别(第0项):", info_list[0])
print("体重(第1项):", info_list[1])
print("身高(第2项):", info_list[2])
print("年龄(第3项):", info_list[3])
原始字符串: 男 75 175 25
它的类型是: <class 'str'>

使用 split(' ') 分割后: ['男', '75', '175', '25']
分割后的类型是: <class 'list'>

从列表中取出各项:
性别(第0项): 男
体重(第1项): 75
身高(第2项): 175
年龄(第3项): 25

看!split(' ') 这一下,就把 "男 75 175 25" 这个字符串,按照空格剪成了 ['男', '75', '175', '25'] 这样一个列表。之后,我们通过 info_list[0]、info_list[1] 这样的方式,就能轻松拿到每一项了。

小提示:split() 的括号里写什么,就按什么字符来分割。比如 split(',') 就是按逗号分割。默认不写参数(split())则是按任意空白字符(空格、换行等)分割。

改造 BMR 计算器:实现“一键输入”

有了 split() 这把“剪刀”,改造我们的程序就非常简单了。我们只需要把原来四个分开的 input(),合并成一个,然后用 split() 处理它。

下面是 BMR 计算器 3.0 的完整代码,最大的变化就是输入部分:

"""
    作者:小象教研组
    功能:BMR计算器
    版本:3.0
    新增功能:用户可以在一行输入所有信息,带单位的信息输出
"""

def main():
    """
        主函数
    """
    # 原程序用 input() 询问是否退出,这里用固定值 'n' 代替,表示不退出
    y_or_n = 'n'

    while y_or_n != 'y':
        print('请输入以下信息,用空格分割')
        # 原程序这里用 input() 接收用户输入,例如"男 75 175 25"
        input_str = '男 75 175 25'   # 固定值代替input(),你可以改成"女 50 165 30"等值来测试

        # 核心步骤:使用 split 将字符串按空格分割成列表
        str_list = input_str.split(' ')

        # 从列表中按位置取出各项,并转换类型
        gender = str_list[0]                # 第0个是性别,已经是字符串,不用转换
        weight = float(str_list[1])         # 第1个是体重,需转成浮点数
        height = float(str_list[2])         # 第2个是身高,需转成浮点数
        age = int(str_list[3])              # 第3个是年龄,需转成整数

        # 根据性别计算 BMR (计算公式与之前完全一样)
        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:
            # 使用 format 方法进行格式化输出,{ } 是占位符
            print('您的性别:{},体重:{}公斤,身高:{}厘米,年龄:{}岁'.format(gender, weight, height, age))
            print('您的基础代谢率:{}大卡'.format(bmr))
        else:
            print('暂不支持该性别')

        print()  # 输出一个空行,让界面更清晰
        # 原程序这里会再次询问是否退出,这里我们直接设为 'y' 来结束循环,演示一次计算
        y_or_n = 'y'

# 模块级直跑,调用主函数
main()
请输入以下信息,用空格分割
您的性别:男,体重:75.0公斤,身高:175.0厘米,年龄:25岁
您的基础代谢率:1798.5大卡

代码解读:

  1. 第14-15行:我们给用户一个清晰的提示,告诉他要怎么输入。
  2. 第17行:用 input_str.split(' ') 将输入的字符串按空格分割,结果存入 str_list 列表。
  3. 第20-23行:从列表中按索引取出数据。注意,除了性别是字符串,体重、身高、年龄都需要转换成数值类型(float 或 int),才能进行后面的数学计算。
  4. 第39行:这是本节第二个亮点——格式化输出。'您的性别:{},体重:{}公斤...'.format(gender, weight, ...) 这句话里,{} 就是一个占位符,format() 方法会按顺序把括号里的变量(gender, weight…)填到对应的 {} 里。这样,单位和数值就完美地结合在了一起,输出非常清晰专业。

你可以把第16行的 '男 75 175 25' 改成 '女 50 165 30' 再运行一次,看看结果。

格式化输出小技巧

format() 方法非常灵活。除了上面按顺序填充,你还可以:

  • 指定填充顺序:当占位符很多,且顺序可能打乱时,可以在 {} 里写数字来指定。
  • 重复使用变量:同一个变量可以填充到多个位置。

看个例子就明白了:

name = "小明"
score_math = 95
score_english = 88

# 方式1:默认顺序
print("{}的数学成绩是{},英语成绩是{}。".format(name, score_math, score_english))

# 方式2:指定顺序 (数字代表 format 中参数的位置,从0开始)
print("{1}分是{0}的数学成绩,而英语他得了{2}分。".format(name, score_math, score_english))

# 方式3:重复使用
print("数学{1}分,英语{2}分,{0}的总分是{1}+{2}={3}分。".format(name, score_math, score_english, score_math+score_english))
小明的数学成绩是95,英语成绩是88。
95分是小明的数学成绩,而英语他得了88分。
数学95分,英语88分,小明的总分是95+88=183分。

新的挑战:如果用户“乱来”怎么办?

我们的程序现在看起来很棒,但你想过这个问题吗? 如果用户不按提示,在应该输入数字的地方(比如体重)输入了文字,比如“七十”而不是“70”,程序会怎样?

试试把上面代码的第16行改成 input_str = '男 七十 175 25' 并运行。你会看到一个错误:

ValueError: could not convert string to float: '七十'

程序“崩溃”了!因为它试图把字符串 '七十' 转换成浮点数 float('七十'),这显然做不到。

这是一个非常重要的编程概念:程序的健壮性。 一个好的程序,应该能妥善处理用户的“意外”输入,而不是直接崩溃。那么,我们该如何解决这个问题呢?

答案将在下一节的 BMR 计算器 4.0 中揭晓! 我们会学习一个叫“异常处理”的强大机制,专门用来应对这种“意外”情况。

📝 动手练一练

  1. 自定义计算:将 BMR 计算器 3.0 的代码复制到你的编辑器中,修改第16行的 input_str 为你自己或朋友的信息(例如 '女 52 160 28'),运行并查看计算结果。
  2. 改造输出:在不改变计算结果的前提下,修改第39行的输出语句,让它的提示更亲切。例如,输出为:“亲爱的用户,根据您提供的信息(性别:{},体重:{}kg,身高:{}cm,年龄:{}岁),您的基础代谢率约为{}大卡。祝您健康!”
  3. 探索 split:写一个小程序,让用户输入一句用逗号分隔的话,例如 "苹果,香蕉,橙子,葡萄",然后程序使用 split(',') 将它们分开,并打印出“我最喜欢的水果是:”以及列表中的第二个水果。
👉 点击查看第3题参考答案

思路:使用 input() 接收一个用逗号分隔的字符串,然后用 split(',') 进行分割,得到一个水果列表。最后通过索引(从0开始)取出第二个水果(索引为1)进行输出。

# 原程序用 input() 接收用户输入,例如"苹果,香蕉,橙子,葡萄"
fruit_str = "苹果,香蕉,橙子,葡萄"  # 固定值代替input()

# 使用 split 按逗号分割字符串
fruit_list = fruit_str.split(',')

# 取出列表中的第二个水果(索引为1)
second_fruit = fruit_list[1]

print("我最喜欢的水果是:", second_fruit)
我最喜欢的水果是: 香蕉

本章小结

恭喜!你的 BMR 计算器又进化了。现在它不仅会算,还很“会来事”:

  • 输入更高效:用户一次性输完所有信息,体验丝滑。
  • 输出更专业:结果带上单位,一目了然。
  • 技能+1:你掌握了 split() 这个处理字符串的利器,以及用 format() 美化输出的技巧。

📋 行动清单

学完立刻可以做的两件事:

  • 运行并修改本节提供的完整代码,用你自己和家人的数据算算 BMR,看看谁的基础代谢更高?
  • 预测一下:如果用户输入时,不小心在数字中间加了两个空格,比如 男 75 175 25,我们的 split(' ') 还能正确工作吗?动手试试看!(提示:可能会产生空字符串元素)

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第4章代码包:基础代谢率计算(含全部版本 4 个 .py)
    ZIP · 3KB
    下载
看图文没弄懂?展开看本节视频讲解(约 17 分钟)
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)