案例(3):BMR计算器
本章通过BMR计算器的4个案例来进行学习基础的Python程序
案例简述
基础代谢率: 我们在安静状态下(通常为静卧状态)小号的最低热量,人的其他活动都建立在这个基础上。计算公式如下:
BMR(男)=(13.7体重(kg))+(5.0身高(cm))-(6.8年龄)+66
BMR(女)=(9.6体重(kg))+(1.8身高(cm))-( 4.7年龄)+655
v1.0
本节简单的写个基础BMR计算器,通过给定的参数,接着判断性别后代入各自的公式直接得出BMR的值,然后输出结果。
知识点:
1.判断方法:if-else语句的使用
2.数据类型:
(1)整数类型,与数学中的整数概念一致;如:100, -250
(2)浮点数类型,带有小数点及小数的数值;如:0.0, -3.14, 3.4e-3 (科学计数法)
3.类型转换
(1)整数->浮点数,float(4) -> 4.0
(2)浮点数->整数,int(3.14)->3,只会保留整数部分
(3)字符串->浮点数, float/eval(‘3.14’)->3.14
(4)字符串->整数,int(‘3’) ->3 == eval(‘3’) ->3
4.type()函数可以判断数据类型
具体代码如下:
PS:输出时可以对没有结果的情况给出不支持提示
def main():
"""
主函数
"""
# 性别
gender = '男'
# 体重(kg)
weight = 60
# 身高(cm)
height = 170
# 年龄
age = 40
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("暂不支持该性别")
v2.0
在v1.0的基础上,该案例通过input()函数来支持根据用户输入计算BMR,使用while语句来使程序持续运行。开始和结束循环都可以根据输入实现。PS:input()获得的是字符串类型,需要转换成整数或浮点型才能计算。
知识点:
1.input()函数可以得到输入数据;例子:data = input(“请输入数据:”)
2.while循环语句,当符合条件时进入并执行循环体,否则跳出循环;例子:while a == 1: 循环体
具体代码:
# 是否循环程序
y_or_n = input("是否退出程序(y/n)")
while y_or_n != 'y':
# 性别
gender = input("请输入性别:")
# 体重(kg)
weight = float(input("请输入体重(kg):"))
# 身高(cm)
height = float(input("请输入身高(cm):"))
# 年龄
age = int(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 = input("是否退出程序(y/n)")
print("程序已退出!")
v3.0
在v2.0的基础上进行修改,用户可以在一行输入所有信息,带单位的信息输出。一行输入所有信息通过字符串分str.split()函数达到效果。带单位信息输出通过str.format()函数。效果分别如下图所示:

知识点:
1.字符串分割,str.split(), 例子: str_list = input_str.split(" ") # 依据空格分割
2.字符串格式化输出,使用{}占位:str.format();例子:‘{}公斤, {}厘米’.format(70, 175)
具体代码:
# 一行输入数据
input_str = input("请依次输入性别、体重(kg)、身高(cm)、年龄(空格隔开):")
# 获取数据,依据空格分割
str_list = input_str.split(" ")
# 性别
gender = str_list[0]
# 体重
weight = float(str_list[1])
# 身高
height = float(str_list[2])
# 年龄
age = int(str_list[3])
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("您的性别:{},体重:{}kg,身高:{}cm,年龄:{}岁".format(gender, weight, height, age))
print("您的基础代谢率:{}卡路里".format(bmr))
v4.0
在v3.0的基础上,新增处理异常操作。方法使用try-except语句实现。
知识点:

2.常用几个错误类型:
(1)序列下标超出了范围:IndexError
(2)字典中找不到某个键:KeyError
(3)输入对象类型有误:TypeError
(4)序列下标超出了范围:IndexError
具体代码:
# 一行输入数据
input_str = input("请依次输入性别、体重(kg)、身高(cm)、年龄(空格隔开):")
# 获取数据,依据空格分割
str_list = input_str.split(" ")
try:
gender = str_list[0] # 性别
weight = float(str_list[1]) # 体重
height = float(str_list[2]) # 身高
age = int(str_list[3]) # 年龄
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("您的性别:{},体重:{}kg,身高:{}cm,年龄:{}岁".format(gender, weight, height, age))
print("您的基础代谢率:{}卡路里".format(bmr))
else:
print("暂不支持该性别")
except ValueError:
print("请输入正确的信息!")
except IndexError:
print("输入信息较少!")
except:
print("程序异常!")
```序列下标超出了范围:IndexError
# 小结

完整代码查看[码云](https://gitee.com/hwang_zc/Python_learn1/tree/master/BMR)