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库函数解决数学问题,学会用代码实现数学思维向计算机语言思维的转换。
如有错误,欢迎指正!
注:代码非原创
下篇将介绍函数和代码复用。

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬茶@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值