Python——程序结构控制(模块3: random库的使用)(实例:身体质量指数BMI及圆周率的计算)
Posted 柠檬茶@
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python——程序结构控制(模块3: random库的使用)(实例:身体质量指数BMI及圆周率的计算)相关的知识,希望对你有一定的参考价值。
前言
本篇主要介绍程序结构控制,以BMI的计算为例,介绍循环结构的控制和使用。以圆周率的计算为例,介绍random库的使用。
(从本篇开始,出现的一些库中函数介绍以及部分简单代码都将以图片形式呈现)
读完本篇,你将了解:
1.方法论
Python程序的控制语法及结构
2.实践能力
学会编写带有条件判断及循环的程序
本篇将系统介绍:
1.程序的分支结构(单、二、多分支结构,条件判断及异常处理)
2.实例:身体质量指数BMI
3.程序的循环结构(遍历循环、无限循环;循环控制保留字及循环高级用法)
4.模块3: random库的使用(基本随机函数及扩展随机函数)
5.实例:圆周率的计算
一、程序的分支结构
1.单分支结构
根据判断条件结果而选择不同向前路径的运行方式
(1)结构:(如果,则)
if<条件>∶
<语句块>
(2)简单实例
guess = eval(input())
if guess == 99:
print("猜对了")
也可直接使用真假
if True:
print("条件正确")
2.二分支结构
根据判断条件结果而选择不同向前路径的运行方式
(1)结构:
if<条件>∶
<语句块1>
else:
<语句块2>
(2)简单实例
guess = eval(input())
if guess == 99:
print("猜对了")
else:
print("猜错了")
if True:
print("语句块1")
else:
print("语句块2")
(3)紧凑形式:适用于简单表达式的二分支结构
①结构:<表达式1> if <条件> else<表达式2>
当条件成立了返回表达式1的信息
②见代码
guess = eval(input())
print("猜{}了".format("对" if guess == 99 else"错"))
③好处:简单的一行代码表达二分支结构
④注意:紧凑形式中,if else所对应的输出不是语句(带赋值形式的,有等号构成),而是表达式
3.多分支结构
根据多个条件来选择不同语句块运行的一种分支结构
(1)结构:
if <条件>︰
<语句块1>
elif :
<语句块2>
…
else :
<语句块2>
(2)简单实例:对不同分数分级的问题
score = eval(input())
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
print("输入成绩属于级别{}".format(grade))
(3)注意:
①注意多条件之间的包含关系
②注意变量取值范围的覆盖
4.条件判断及组合
(1)条件判断
相关操作符
(2)条件组合
用于条件组合的三个保留字
(3)实例
guess = eval(input())
if guess > 99 or guess < 99:
print("猜错了")
else:
print("猜对了")
if not True:
print("语句块2")
else:
print("语句块1")
5.程序的异常处理
(1)异常处理的基本使用
try :
<语句块1>
except :
<语句块2>
执行语句1,出现异常执行语句2
(2)进一步区分不同的异常类型
try :
<语句块1>
except<异常类型> :
<语句块2>
增加标记,仅在此种异常类型发生时才执行语句块2
(3)简单实例
try:
num = eval(input("请输入一个整数: "))
print(num ** 2)
except:
print("输入不是整数")
也可改为except NameError
(4)注意:标注异常类型后,仅响应该异常。异常类型名字等同于变量
(5)异常处理的高级使用
try :
<语句块1>
except :
<语句块2>
else :
<语句块3>
finally:
<语句块4>
注意:无论前面是否发生异常,finally对应语句块4—定执行
else对应语句块3在不发生异常时执行
二、实例5:身体质量指数BMI
1.问题分析
BMI∶对身体质量的刻画
(1)BMI : Body Mass Index
国际上常用的衡量人体肥胖和健康程度的重要标准,主要用于统计分析
(2)定义:BMI=体重(kg)/身高2(m2 )
(3)问题需求
输入∶给定体重和身高值
输出:BMI指标分类信息(国际和国内)
2.实例讲解
(1)思路方法
难点在于同时输出国际和国内对应的分类
①思路1:分别计算并给出国际和国内BMI分类
②思路2∶混合计算并给出国际和国内BMI分类
(2)代码实现
①思路1
# CalBMIv1
height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]:"))
bmi = weight / pow(height, 2)
print("BMI数值为:{:.2f}".format(bmi))
who = ""
if bmi < 18.5:
who = "偏瘦"
elif 18.5 <= bmi < 25:
who = "正常"
elif 25 <= bmi < 30:
who = "偏胖"
else:
who = "肥胖"
print("BMI指标为:国际‘{0}’".format(who))
简单修改后即可输出国内BMI
②思路2
# CalBMIv2
height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]:"))
bmi = weight / pow(height, 2)
print("BMI数值为:{:.2f}".format(bmi))
who, nat = "", ""
if bmi < 18.5:
who, nat = "偏瘦", "偏瘦"
elif 18.5 <= bmi < 25:
who, nat = "正常", "正常"
elif 24 <= bmi < 25:
who, nat = "正常", "偏胖"
elif 25 <= bmi < 28:
who, nat = "偏胖", "偏胖"
elif 28 <= bmi < 30:
who, nat = "偏胖", "肥胖"
print("BMI指标为:国际‘{0}’, 国内'{1]".format(who, nat))
3.举一反三
(1)关注多分支条件的组合
①多分支条件之间的覆盖是重要问题
②程序可运行,但不正确,要注意多分支
③分支结构是程序的重要框架,读程序先看分支
三、程序的循环结构
1.遍历循环
遍历某个结构形成的循环运行方式
(1)结构:从遍历结构中逐一提取元素,放在循环变量中
for <循环变量> in<遍历结构>∶
<语句块>
①由保留字for和in组成,完整遍历所有元素后结束
②每次循环,所获得元素放入循环变量,并执行一次语句块
(2)常用搭配使用方式(具体应用)
①计数循环(N次)
for i in range(N):
<语句块>
遍历由range()函数产生的数字序列,产生循环
②计数循环(特定次):实现特定次的计数循环
for i in range(N,M,K):
<语句块>
1)M开始(不到N)到N之前的整数,以K为步长
2)举例:
③字符串遍历循环
for c in s:
<语句块>
1)s是字符串,遍历字符串每个字符放到c中,产生循环
2)举例:
④列表遍历循环
for item in ls:
<语句块>
1)ls是一个列表,遍历其每个元素放到item中,产生循环
2)举例:
⑤文件遍历循环
for line in fi:
<语句块>
1)fi是一个文件标识符,遍历其每行,产生循环
2)举例:
2.无限循环
由条件控制的循环运行方式
(1)结构:
while<条件>∶
<语句块>
反复执行语句块,直到条件不满足时结束
(2)无限循环的条件
这段程序将永远执行下去
3.循环控制保留字
(1)break和continue
①break跳出并结束当前整个循环,执行循环后的语句
②continue只结束当次循环,继续执行后续次数循环
③break和continue可以与for和while循环搭配使用
(2)双层循环举例:
s不为空则打印s,每次for之后进行切片操作,在其中插入break
(即只要遇到T就停止遍历)
说明:一个break仅跳出当前最内层循环
4.循环的高级用法
(1)循环与else
①结构1:
for <循环变量> in<遍历结构>∶
<语句块1>
else :
<语句块2>
②结构2:
while <条件>:
<语句块1>
else :
<语句块2>
(2)作用:
①当循环没有被break语句退出时,执行else语句块
②else语句块作为"正常"完成循环的奖励
③这里else的用法与异常处理中else用法相似
(3)举例:
四、模块3: random库的使用
1.random库概述
random库是使用随机数的Python标准库
(1)伪随机数:采用梅森旋转算法生成的(伪)随机序列中元素
(2)random库主要用于生成随机数
(3)使用random库:import random
(4)random库包括两类函数,常用共8个
①基本随机数函数: seed(), random()
②扩展随机数函数: randint(), getrandbits(), uniform(),randrange(), choice(), shuffle()
2.基本随机数函数
(1)随机数种子
随机序列根据种子唯一确定,随机数种子确定了随机序列的产生
(2)两个基本函数
①若不调用seed函数,将使用当前操作系统的默认系统时间作为种子
②random函数中随机小数的产生与种子有关
(3)举例:
种子只需要给一次,会产生后续的随机数。不给种子,默认种子为当前调用第一次random函数的系统时间
(4)使用种子的好处:
可以复现或者再现程序运行的过程
3.6个常用扩展随机数函数
(1)函数介绍
另外两个函数与序列有关
编写代码时如果要将几行代码放在一行中,用分号分隔
4.需要掌握的能力
(1)能够利用随机数种子产生"确定"伪随机数
(2)能够产生随机整数
(3)能够对序列类型进行随机操作
五、实例6:圆周率的计算
1.问题分析
(1)圆周率的近似计算公式
(2)蒙特卡罗方法
撒点(随机)计算
2.实例讲解
(1)编写程序实现上述近似公式
①累加求和,变量k从0开始到无穷大,后边就是一个分数以及乘方乘积的关系
②for循环实现累加
(2)代码实现近似公式
①假设无穷大是100
②增加“\\”使代码进行换行
③运行结果:圆周率值是:3.141592653589793
(3)蒙特卡罗方法的实现(使用四分之一单位正方形)
①DARTS:当前在区域中抛撒点的总数量,设为100万
②hits:在圆的内部的点的数量
③start:当前的系统时间的一个值,启动计时
④循环撒点的过程,可以描述为一次遍历循环的过程,对每一个点做一个循环体的运算
⑤用for in range对所有点进行抛洒
⑥x,y:两个随机数的坐标值,random函数返回0-1的小数值,单位正方形横纵坐标也在0-1之间
使用x,y获得当前的某一个坐标,即为一个随机抛点
⑦如何判断点在圆内:使用这个点到圆心的距离,用pow函数计算,小于1则在圆内部,hits加一
⑧hits比上撒点值再乘以4,即为圆周率
3.举一反三
(1)理解方法思维
①数学思维:找到公式,利用公式求解
②计算思维:抽象一种过程,用计算机自动化求解
(2)程序运行时间
①使用time库的计时方法获得程序运行时间
②改变撒点数量,理解程序运行时间的分布(从性能角度说,关注循环)
③初步掌握简单的程序性能分析方法
(3)计算问题的扩展
①不求解圆周率,而是某个特定图形的面积
②在工程计算中寻找蒙特卡罗方法的应用场景
总结
经过本篇的学习,可以大致掌握运用控制循环结构去实现一些问题的求解(本篇只是基础),大家可以尝试不同的控制结构去拓展更多的循环高级用法。循环的高级用法中的else处理机制与异常处理机制类似,是与c++中不同的语法体系。
善于使用random库函数解决数学问题,学会用代码实现数学思维向计算机语言思维的转换。
如有错误,欢迎指正!
注:代码非原创
下篇将介绍函数和代码复用。
以上是关于Python——程序结构控制(模块3: random库的使用)(实例:身体质量指数BMI及圆周率的计算)的主要内容,如果未能解决你的问题,请参考以下文章