查看全课大纲(第 19 / 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.空气质量数据怎么“洗”干净,还能画成图?
如何让 BMR 计算器更“聪明”?
约 17 分钟
小象实战讲义 · Python 入门:8 个小项目边玩边学
欢迎回来!在上一节,我们让 BMR 计算器学会了“循环工作”,可以反复计算不同人的基础代谢率。这一节,我们要给它升级两个超实用的“小聪明”:
- 一键输入:让用户把所有信息(性别、体重、身高、年龄)一口气输完,不用再按四次回车。
- 专业输出:让计算结果带上单位(比如“公斤”、“厘米”、“大卡”),看起来就像专业体检报告一样!
学完这一节,你的程序会变得更“懂”用户,交互体验直线上升。是不是很酷?
💡 核心导读
- 本节新增:只学一个“新武器”——字符串的
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大卡代码解读:
- 第14-15行:我们给用户一个清晰的提示,告诉他要怎么输入。
- 第17行:用
input_str.split(' ')将输入的字符串按空格分割,结果存入str_list列表。 - 第20-23行:从列表中按索引取出数据。注意,除了性别是字符串,体重、身高、年龄都需要转换成数值类型(
float或int),才能进行后面的数学计算。 - 第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 中揭晓! 我们会学习一个叫“异常处理”的强大机制,专门用来应对这种“意外”情况。
📝 动手练一练
- 自定义计算:将 BMR 计算器 3.0 的代码复制到你的编辑器中,修改第16行的
input_str为你自己或朋友的信息(例如'女 52 160 28'),运行并查看计算结果。 - 改造输出:在不改变计算结果的前提下,修改第39行的输出语句,让它的提示更亲切。例如,输出为:“亲爱的用户,根据您提供的信息(性别:{},体重:{}kg,身高:{}cm,年龄:{}岁),您的基础代谢率约为{}大卡。祝您健康!”
- 探索 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