程序控制结构
目录
- 程序的分支结构
- 实例5:身体质量指数BMI
- 程序的循环结构
- 模块3:random库的使用
- 实例6:圆周率的计算
一、程序的分支结构
分支结构是根据判断结果二选择不同向前路径的运行方式
1.单分支结构
if <条件>:
<语句块>
2.二分支结构
if <条件>:
<语句块1>
else:
<语句块2>
紧凑形式: 适用于简单表达式的二分支结构,只支持表达式的使用
- <表达式1> if <条件> else <表达式2>
guess = eval(input())
print("猜{}了".format("对" if guess = 99 else "错"))
3.多分支结构
- 注意多条件之间的包含关系
- 注意变量取值范围的覆盖
if <条件>:
<语句块1>
elif:
<语句块2>
……
else :
<语句块3>
4.条件判断及组合
除了操作符之外,python提供了三个用于条件组合的保留字:and、or、not
示例:
guess = eval(input())
if guess > 99 or guess < 99:
print("猜错了")
else:
print("猜对了")
5.程序的异常处理
异常处理的基本使用:
try:
<语句块1>
except [<异常类型>]:
<语句块2>
异常处理的高级使用:
try:
<语句块1>
except:
<语句块2>
else:
<语句块3>
finally:
<语句块4>
#finally对应语句块4一定执行
#else对应的语句块3在不发生异常时执行
实例5:身体质量指数BMI
1.问题分析
- BMI是对身体质量的刻画
- BMI = 体重(kg) / 身高 ² (m ²)
- 输入:给指定的体重和身高
- 输出国内和国际标准
2.实例讲解
思路方法:
- 难点在于同时输出国际和国内对应的分类
- 思路1:分别计算并给出国际和国内BMI分类
- 思路2:混合计算并给出国际和国内BMI分类
# CalBMIv1.py
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))
# CalBMIv2.py
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 < 24:
who, nat = "正常", "正常"
elif 24 <= BMI < 25:
who, nat = "正常", "偏胖"
elif 25 <= BMI < 28:
who, nat = "偏胖", "偏胖"
elif 28 <= BMI < 30:
who, nat = "偏胖","肥胖"
else:
who, nat = "肥胖", "肥胖"
print("BMI指标为:国际'{0}',国内'{0}'".format(who,nat))
3.“举一反三”
关注多分支条件的组合
- 多分支条件之间的覆盖是重要问题
- 程序可运作,但不正确,要多注意分支
二、程序的循环结构
1.遍历循环
遍历某个结构 形成的循环运行方式
for < 循环变量> in <遍历结构>:
<语句块>
#从遍历结构中逐一提取元素,放在循环变量中
2.无限循环
由条件控制的循环运行方式
while <条件>:
<语句块>
反复执行直到条件不满足时结束
3.循环控制保留字
break和continue
- break跳出并结束当前整个循环,执行循环后的语句
- continue结束当次循环,继续执行后续次数循环
- break和continue可以与for和while循环搭配使用
4.循环的高级用法
循环与else
for <变量> in <遍历结构>:
<语句块1>
else:
<语句块2>
while <条件>:
<语句块1>
else:
<语句块2>
- 当循环没有被break语句正常退出时,执行else语句块
- else语句块作为“正常”完成循环的奖励
- 这里的else的用法与异常处理中else用法相似
模块3:random库的使用
random库是使用随机数python的标准库
- 伪随机数:采用梅森旋转算法生成的(伪)随机序列中元素
- random库主要用于生成随机数
- 使用random库:import random
1. 基本随机函数
函数 | 描述 |
---|---|
seed(a = None) | 初始化给定的随机数种子,默认为当前系统时间>>> random.seed(10) #产生种子为10对应的序列 |
random() | 生成一个[0.0,1.0)之间的随机小数 |
2.扩展随机函数
函数 | 描述 |
---|---|
randint(a,b) | 生成一个[a,b]之间的整数 |
randrange(m,n[,k]) | 生成一个[m,n)之间以k为补偿的随机整数 |
getrandbits(k) | 生成一个k比特长的随机整数 |
uniform(a,b) | 生成一个[a,b]之间的随机小数 |
choice(seq) | 从序列seq中随机选择一个元素 |
shuffle(seq) | 将序列seq中的元素随机排列,返回打乱后的序列 |
实例6:圆周率的计算
1.“圆周率的计算”问题分析
-
公式:
-
蒙特卡罗方法:
2.实例讲解
- 公式:
pi = 0
N = 100
for k in range(N):
pi += 1/pow(16,k) * (4 / (8*k + 1) - 2/(8*k + 4) -1/(8*k+5) - 1/(8*k+6))
print("圆周率值是:{}".format(pi))
#圆周率值是:3.141592653589793
- 蒙特卡罗方法:
from random import random
from time import perf_counter
DARTS = 1000*1000
hits = 0.0
start = perf_counter()
for i in range(1,DARTS +1):
x,y = random(),random()
dist = pow(x**2 + y**2, 0.5)
if dist<=1.0:
hits += 1
pi = 4 * (hits / DARTS)
print("圆周率值是:{}".format(pi))
print("运行时间是:{:.5f}s".format(perf_counter() - start))
#圆周率值是:3.141756
#运行时间是:0.64751s
3.举一反三
- 使用time库的计时方法获得程序运行时间
- 改变撒点数量,理解程序运行时间的分布
- 初步掌握简单的程序性能分析方法
- 在工程计算中寻找蒙特卡罗方法的应用场景