基础代谢率计算/基础代谢率计算(3)

去社区提问

简介:本节课我们将学习更多字符串的相关操作,完成带单位的信息输出。

案例描述

欢迎来到今天的课堂~这节课让我们一起学习基础代谢率计算程序的3.0版本。

本节课要优化程序输入和输出功能:

之前的2.0版本中,用户的性别、体重、身高、年龄这些信息需要用四行input()语句来输入,可不可以优化为只用一行就实现所有信息的输入呢?

在新的版本中,还希望输出时,能够把用户的信息和计算出的基础代谢率打印出来,并且输出结果是带有单位的。

下面就让我们来分析和实现这两个新功能吧。

案例分析

在写程序之前,我们需要先了解一些有关字符串操作的补充知识。

字符串分割

如果在一行中输入用户所有信息(性别、体重、身高、年龄),那么呈现出的形式应该是这样:

‘男 70 180 28’

或者是这样的:

‘男,70,180,28’

不论哪种形式,输入的结果都是一个整体的字符串,还需要对其进行拆分才能得到各项数值。

关于字符串的分割的实现,我们将学习一个新的知识:str.split()方法。

str.split()方法会根据规则来完成字符串的分割,括号中写入我们指定的分割条件。

当想要以逗号’,’作为标志分割字符串时,只需要在str.split()的括号中写入逗号:

遇到字符串中的逗号时,程序就会自动完成分割操作。

同样地,如果数据的输入形式是’男 70 180 28’,就要以空格来将它们分隔开,下面这行代码可以帮助我们完成字符串分割:

  1. str.split(' ')

注意,引号中不是无内容的,而是手动敲入了一个空格键哦~

掌握了上面的知识,对于数据输入的优化工作就变得非常简单啦。

先来打印一行提示语句,提示用户在一行内输入数据,并且用空格来分隔:

  1. print('请输入以下数据,用空格分隔')

下面再用我们非常熟悉的input()函数输入:

  1. print('请输入以下数据,用空格分隔')
  2. info=input('性别 体重(kg) 身高(cm) 年龄:')

接下来就要对用户输入的信息进行分割,请你结合刚才学习的新知识,先来思考这行代码应该如何书写。

揭晓答案时间到!用户输入的一行字符串存储在变量info中,并且里面的内容是用空格分隔开来的,因此我们只需要下面这行代码就能完成字符串分割:

  1. info.split(' ')

到这里我们又会面临新的严肃的问题,字符串分割后的结果是什么形式的?我们又应该如何把分割得到的内容分别提取出来呢?

还记得上节课学习到的type()函数吗,它的功能就是查看变量的类型。我们可以先用它查看一下分割后变量的类型,再来思考如何从中提取内容。

这里插播一条消息,由于str.split()方法只是执行了字符串分割的操作,分割后的结果还要记得用一个新的变量来接收和存储。

定义变量cut_info存储结果,打印出它的类型:

代码练习:

编程区

  1. info = '男 70 180 28'
  2. cut_info = info.split(' ')
  3. print(type(cut_info))

终端区

从上面的结果可以看出,分割后的字符串是一个list,也就是列表类型。在后续的课程中我们会详细介绍和学习有关列表的知识内容,这里你只需要了解列表是Python中一种用于存放数据的容器。

并且在列表list中,数据是有序存放的。

既然元素在列表中有顺序,我们当然就可以利用每个元素在列表中的序号取出对应内容了。

和之前学习过的字符串索引方法一样,列表中元素的索引值也是从0开始的。

因此获取第一个元素,就可以使用cut_info[0],第二个元素:cut_info[1],以此类推。

这样一来,我们就能准确地把切割后字符串中的每项内容提取出来了,依然把它们存储在4个变量中:

  1. #在一行内输入信息
  2. print('请输入以下数据,用空格分隔')
  3. info=input('性别 体重(kg) 身高(cm) 年龄:')
  4. #分割字符串
  5. cut_info=info.split(' ')
  6. #从列表中提取分割后的字符串
  7. gender = cut_info[0]
  8. weight = cut_info[1]
  9. height = cut_info[2]
  10. age = cut_info[3]

由于分割后的内容依然是以一个个更为简短的字符串存储在列表中的,别忘记对它们进行类型转换:

  1. #在一行内输入信息
  2. print('请输入以下数据,用空格分隔')
  3. info=input('性别 体重(kg) 身高(cm) 年龄:')
  4. #分割字符串
  5. cut_info=info.split(' ')
  6. #从列表提取分割后的字符串并转换类型
  7. gender = cut_info[0]
  8. weight = float(cut_info[1])
  9. height = float(cut_info[2])
  10. age = int(cut_info[3])

接下来就可以用上面的这段代码替换掉之前程序中的输入功能了。

  1. y_or_no = input('是否选择退出?(y/n):')
  2. while y_or_no != 'y':
  3. #在一行内输入信息
  4. print('请输入以下信息,用空格分隔')
  5. info = input('性别 体重(kg) 身高(cm) 年龄:')
  6. #分割字符串
  7. str_list = info.split(' ')
  8. #从列表提取分割后的字符串并转换类型
  9. gender = str_list[0]
  10. weight = float(str_list[1])
  11. height = float(str_list[2])
  12. age = int(str_list[3])
  13. #计算BMR值
  14. if gender == '男':
  15. BMR=13.7*weight+5.0*height-6.8*age+66
  16. elif gender == '女':
  17. BMR=9.7*weight+1.8*height-4.7*age+665
  18. else:
  19. BMR=-1
  20. #输出结果
  21. if BMR == -1:
  22. print('输入的性别有误')
  23. else:
  24. print('您的BMR值是:',BMR)
  25. y_or_no = input('是否选择退出?(y/n):')

解决完输入过程的优化工作,其实我们就已经成功了一大半~下面关于输出的改进内容会非常简单,快跟上我的思路继续来学习吧。

如果想在打印结果时,得到下面这样带单位的输出效果:

您的身高:180cm

您的BMR值:1730大卡

根据之前学过的知识,用逗号连接几个内容,可以完成上述要求:

  1. height = 180
  2. print('您的身高:',height,'大卡')

但当我们需要打印串联的语句变得更多,一个个使用逗号分隔的话看起来十分麻烦,有没有更简洁的方式呢?

字符串格式化输出

字符串格式化输出闪亮登场~它恰好可以解决我们眼前的问题,也是常用的一种输出形式。

举一个输出身高的例子来看看它的用法:

代码练习:

编程区

  1. height=180
  2. print('您的身高:{}cm'.format(height))

终端区

在格式化输出中,{}是占位符,每当出现这个符号的时候就等于告诉计算机 ‘等下我要在这里放内容,先把位置占上啦!’。

再在format()的括号中放入字符串中缺少的内容,这样打印结果时就会自动把括号中的信息替换到占位符的位置上。

再来举个例子,输出BMR值:

当然它也支持多个内容的格式化输出,在format()的括号中依次写入信息,就会按照顺序来替换占位符。

代码练习:

编程区

  1. gender = '男'
  2. height = 180
  3. weight = 70
  4. age =28
  5. print('您的性别:{},身高:{},体重:{},年龄:{}'.format(gender,height,weight,age))

终端区

是不是非常简单?

下面就来改进输出功能~

  1. y_or_no = input('是否选择退出?(y/n):')
  2. while y_or_no != 'y':
  3. #在一行内输入信息
  4. print('请输入以下信息,用空格分隔')
  5. info = input('性别 体重(kg) 身高(cm) 年龄:')
  6. #分割字符串
  7. str_list = info.split(' ')
  8. #从列表提取分割后的字符串并转换类型
  9. gender = str_list[0]
  10. weight = float(str_list[1])
  11. height = float(str_list[2])
  12. age = int(str_list[3])
  13. #计算BMR值
  14. if gender == '男':
  15. BMR=13.7*weight+5.0*height-6.8*age+66
  16. elif gender == '女':
  17. BMR=9.7*weight+1.8*height-4.7*age+665
  18. else:
  19. BMR=-1
  20. #输出结果
  21. if BMR == -1:
  22. print('输入的性别有误')
  23. else:
  24. print('您的性别:{},身高:{}cm,体重:{}kg,年龄:{}'.format(gender,height,weight,age))
  25. print('您的BMR值是:{}大卡'.format(BMR))
  26. y_or_no = input('是否选择退出?(y/n):')

来运行看看效果吧。

本关总结

本节课我们一起学习了字符串的更多操作,下面一起来总结一下~

  • 字符串分割

str.split()

  • 字符串格式化输出,使用{}占位

例如:
'身高:{}cm'.format(height)

下节预告

如果用户‘不按套路出牌’,比如输入体重为:‘七十’,身高:‘一米八’。

这种情况我们应该如何机智应对?下节课就来解决这个小问题~

如果你想获取课程相关资料,和更多小伙伴一起交流学习,欢迎添加班主任微信,我们下节课不见不散哦~

扫描二维码添加班主任微信

已经添加过班主任的同学,可以直接联系对应老师,无需重复添加。

基础代谢率计算 1/3

基础代谢率计算(3)

1.0x

恭喜完成本课时的学习!
坚持学习

行动力超过

累计学习

学习下一课时