顺序结构
分支结构
循环结构
方法论
-Python程序的控制语法及结构
实践能力
-学会编写带有条件判断及循环的程序
4.1 程序的分支结构
1、单分支结构
根据判断条件结果而选择不同向前路径的运行方式
if <条件>:
<语句块>
单分支实例
guess = eval(input())
if guess == 99:
print('猜对了')
if True:
print('条件正确')
2、二分支结构
根据判断条件结果而选择不同向前路径的运行方式
if <条件>:
<语句块1>
else :
<语句块2>
二分支实例
guess = eval(input())
if guess == 99:
print('猜对了')
else:
print('猜错了')
if True:
print('语句块1')
else:
print('语句块2')
紧凑形式:适用于简单表达式的二分支结构
<表达式1> if <条件> else <表达式2>
guess = eval(input())
print('猜{}了'.format('对' if guess == 99 else '错'))
3、多分支结构
if <条件>:
<语句块1>
elif :
<语句块2>
……
else :
<语句块3>
多分支实例
-注意多条件之间的包含关系
-注意变量取值范围的覆盖关系
对不同分数的分级问题:
score = eval(input())
if score >= 90:
print('A')
elif score >= 80:
print('B')
else:
print('C')
4、条件判断及组合
操作符
用于条件组合的三个保留字
5、程序的异常处理
异常处理的基本使用
try :
<语句块1>
except :
<语句块2>
执行语句块1,如果没有异常继续往下,异常执行语句块2.
还可以区分不同的异常类型:
try :
<语句块1>
except <异常类型>:
<语句块2>
示例1
try :
num = eval(input('请输入一个整数'))
print(num**2)
except :
print('输入不是整数')
示例2
try :
num = eval(input('请输入一个整数'))
print(num**2)
except NameError:
print('输入不是整数')
标注异常类型后,仅相应该异常
异常类型名字等同于变量
异常处理的高级使用
try :
<语句块1>
except :
<语句块2>
else :
<语句块3>
finally :
<语句块4>
-finally对应语句块4一定执行
-else对应语句块3在不发生异常时执行
4.2 实例5:身体质量指数BMI
BMI:对身体质量的刻画
-BMI:Body Mass Index
国际上常用的衡量人体肥胖和健康程度的重要标准,主要用于统计分析
-定义:BMI = 体重 (kg) /身高2 (m2)
问题需求
-输入:给定体重和身高值
-输出:BMI指标分类信息(国际和国内)
思路方法
-思路1:分别计算并给出国际和国内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))
-思路2:混合计算并给出国际和国内BMI分类
#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 25 <= bmi < 28:
who, nat = "偏胖", "肥胖"
else:
who, nat = "肥胖", "肥胖"
print("BMI数值为:国际‘{0}’,国内‘{0}’".format(who, nat))
**
关注多分支条件的组合
-多分支条件之间的覆盖是重要问题
-程序可运行,但不正确,要注意多分支
-分支结构是程序的重要框架,读程序先看分支
4.3 程序的循环结构
1、遍历循环
遍历某个结构形成的循环运行方式
for <循环变量> in <遍历结构>:
<语句块>
-由保留字for和in组成,完整遍历所有元素后结束
-每次循环,所获得元素放入循环变量,并执行一次语句块
遍历循环的应用
(1)计数循环(N次)
for i in range(N):
<语句块>
-遍历由range()函数产生的数字序列,产生循环
for i in range(5):
print(i)
for i in range(M,N,K):
<语句块>
-遍历由range()函数产生的数字序列,产生循环,M到N,步长为K
(2)字符串遍历循环
for i in s:
<语句块>
-s是字符串,遍历字符串每个字符,产生循环
for c in “Python123”:
print(c, end=“,”)
输出:P, y, t, h, o, n, 1, 2, 3,
(3)列表遍历循环
for item in ls:
<语句块>
-ls是一个列表,遍历其每个元素,产生循环
for item in [“Py”, 123, 456]:
print(item, end=“,”)
输出:Py, 123, 456
(4)文件遍历循环
for line in fi:
<语句块>
-fi是一个文件标识符,遍历其每行,产生循环
for line in fi:
print(line)
输出:
第一行
第二行
第三行
2、无限循环
由条件控制的循环运行方式
while <条件>:
<语句块>
-反复执行语句块,直到条件不满足时结束
-按Ctrl C退出无限循环程序
3、循环控制保留字
break和continue
-break跳出并结束当前整个循环,执行循环后的语句
-continue结束当次循环,继续执行后续次数循环
-break和continue可以与for和while循环搭配使用
-break仅跳出当前最内层循环
4、循环的高级用法
循环与else
for <循环变量> in <遍历结构>:
<语句块1>
else:
<语句块2>
while <条件>:
<语句块1>
else:
<语句块2>
-当循环没有被break语句退出时,执行else语句块
-else语句块作为“正常”完成循环的奖励
-这里else的用法与异常处理中else用法相似
4.4 模块3:random库的使用
1、random库概述
random库是使用随机数的Python标准库
-伪随机数:采用梅森旋转算法生成的(伪)随机序列中元素
-random库主要用于生成随机数
-使用random库:import random
random库包含两类函数,常用共8个
-基本随机数函数:seed(), random()
-扩展随机数函数:randint(), getrandbits(), uniform(), randrange(), choice(), shuffle()
2、基本随机数函数
随机数种子
种子相同,随机序列、随机序列中的每一个数以及数之间的关系都是唯一确定的。
设定种子可以复现程序运行结果。
2、扩展随机数函数
需要掌握的能力
-能够利用随机数种子产生“确定”伪随机数
-能够产生随机整数
-能够对序列类型进行随机操作
4.5 实例6:圆周率的计算
圆周率的近似计算公式
蒙特卡罗方法
pi = S圆 / S(1/4矩形)
#CalPiV1.py
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))
用\可以实现代码的换行
#CalPiV2.py
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 = hits + 1
pi = 4 * (hits/DARTS)
print("圆周率值是:{}".format(pi))
print("运算时间是:{:.5f}s".format(perf_counter()-start))
举一反三
理解方法思维
-数学思维:找到公式,利用公式求解
-计算思维:抽象一种过程,用计算机自动化求解
-谁更准确?
程序运行时间分析
-使用time库的计时方法获得程序运行时间
-改变撒点数量,理解程序运行时间的分布(程序主要运行时间花在循环上)
-初步掌握简单的程序性能分析方法
计算问题的扩展
-不求解圆周率,而是某个特定图形的面积
-在工程计算中寻找蒙特卡罗方法的应用场景