本模块任务:
1.方法论:Python程序的控制语法及结构
2.实践能力:学会编写带有条件判断及循环的程序
![](https://i-blog.csdnimg.cn/blog_migrate/af9fce7fdac6c16324e9b3e6b21a98ba.jpeg)
4.1程序的分支结构
1.单分支结构
guess = eval(input())
if guess == 99:
print("猜对了")
2.二分支结构
guess = eval(input())
if guess == 99:
print("猜对了")
else:
print("猜错了")
紧凑形式:适用于简单表达式的二分支结构。格式:<表达式1> if <条件> else <表达式2>
guess = eval(input())
print("猜{}了".format("对" if guess==99 else "错"))
在紧凑形式中,if else 所对应的输出不是语句而是表达式,所谓的表达式是语句的一部分。简单理解为语句是带赋值形式的,但是if else是不支持这种带等号的赋值形式,只支持表达式形式,也就是语句中的一部分。
3.多分支结构
#对不同分数分级的问题(错误代码)
score = eval(input())
if score >= 60:
grade = 'D'
elif score >= 70:
grade = 'C'
elif score >= 80:
grade = 'B'
elif score >= 90:
grade = 'A'
print("输入成绩属于级别{}".format(grade))
注意:①多条件之间的包含关系;②变量取值范围的覆盖。
#对不同分数分级的问题(修改后的正确代码)
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))
4.条件判断及组合
操作符 | 数学符号 | 描述 |
< | < | 小于 |
<= | ≤ | 小于等于 |
>= | ≥ | 大于等于 |
> | > | 大于 |
== | = | 等于 |
!= | ≠ | 不等于 |
操作符及使用 | 描述 |
x and y | 两个条件x和y的逻辑与 |
x or y | 两个条件x和y的逻辑或 |
not x | 条件x的逻辑非 |
#条件判断及组合的示例
guess = eval(input())
if guess > 99 or guess < 99:
print("猜错了")
else:
print("猜对了")
5.程序的异常处理
(1)示例:
(2)异常处理的基本使用:
①格式:
try:
<语句块1>
except:
<语句块2>
#示例1
try:
num = eval(input("请输入一个整数:"))
print(num**2)
except:
print("输入不是整数")
②格式:
try:
<语句块1>
except <异常类型>: #标注异常类型后,仅响应此类异常
<语句块2>
异常类型名字等同于变量名,时python语言自定义的内部定义的,所以不需要用字符串类型表示
#示例2
try:
num = eval(input("请输入一个整数"))
print(num**2)
except NameError:
print("输入不是整数")
③异常处理的高级使用格式:
try:
<语句块1>
except:
<语句块2>
else:
<语句块3> #此语句块在不发生异常时执行
finally:
<语句块4> #此语句块一定执行
4.2实例5:身体质量指数BMI
1.问题分析
BMI(body mass index):对身体质量的刻画,国际上常用的衡量人体肥胖和健康程度的重要标准,主要用于统计分析。公式定义:BMI = 体重(kg)/(身高*身高)㎡。
分类 | 国际BMI值(kg/㎡) | 国内BMI值(kg/㎡) |
偏瘦 | <18.5 | <18.5 |
正常 | 18.5~25 | 18.5~24 |
偏胖 | 25~30 | 24~28 |
肥胖 | ≥30 | ≥28 |
2.问题需求
输入:给定体重和身高值
输出:BMI指标分类信息(国际和国内)
3.实例讲解
#CalBMIv3.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}',国内'{1}'".format(who,nat))
4.举一反三
(1)关注分支条件的组合:
①多分支条件之间的覆盖是重要问题。
②程序可运行,但如果不正确,要注意多分支结构处。
③分支结构是程序的重要框架,读程序先看分支。尤其是阅读函数内部的代码,首先要查看分支,通过分支可以将程序分为几个不同的部分,而逐一再去向下看每部分的功能,这样阅读代码的效率是非常高的。
4.3程序的循环结构
python只提供两种循环方式,①遍历循环,由保留字for和in组成;②无限循环,由保留字while组成。
1.遍历循环
(1)遍历某个结构形成的循环运行方式,格式如下:
for <循环变量> in <遍历结构> : #从遍历结构中逐一提取元素,放在循环变量中
<语句块>
(2)应用:①计数循环(N次):遍历由range()函数产生的数字序列,产生循环。格式如下:
for i in range(N):
<语句块>
②计数循环(特定次):遍历由range()函数产生的数字序列,产生循环。格式如下:
for i in range(M,N,K): #[M,N),步长为K
<语句块>
③字符串遍历循环:s是字符串,遍历字符串每个字符,产生循环,格式如下:
for c in s :
<语句块>
④列表遍历循环:ls是一个列表,遍历其每个元素,产生循环,格式如下:
for item in ls :
<语句块>
⑤文件遍历循环:fi是一个文件标识符,遍历其每行,产生循环。我们可以对外部文件通过python的函数将文件打开。如果文件是以字符形式打开,那么它就会表示为一个文件的标识的名字,相当于用变量来标识系统中的一个文件,这个变量就叫文件标识符。for line in fi 遍历这个文件的每一行。格式如下:
for line in fi :
<语句块>
2.无限循环
(1)由条件控制的循环运行方式。反复执行语句块,直到条件不满足时结束;如果是无限循环,按ctrl+c退出执行。格式如下:
while <条件>:
<语句块>
3.循环控制保留字
(1)break跳出并结束当前整个循环,执行循环后的语句。
(2)continue结束当此循环,继续执行后续次数循环。
4.循环的高级用法:仅与break有关
(1)循环与else:当循环没有被break语句退出时,执行else语句块。else语句块作为“正常”完成循环的奖励,与异常处理中else用法相似。continue不影响else中的语句块,即无论是否执行continue,都执行else语句块。
(2)格式如下:①for <变量> in <遍历结构> : 或 ②while <条件> :
<语句块1>
else:
<语句块2>
#for循环+continue与else:执行了continue
for c in "python" :
if c == "t":
continue
print(c,end="")
else:
print("正常退出")
#输出结果:pyhon正常退出
#for循环+continue与else:未执行continue
for c in "python" :
if c == "a":
continue
print(c,end="")
else:
print("正常退出")
#输出结果:python正常退出
#for循环+break与else:执行了break
for c in "python" :
if c == "t":
break
print(c,end="")
else:
print("正常退出")
#输出结果:py
#for循环+break与else:未执行break
for c in "python" :
if c == "a":
break
print(c,end="")
else:
print("正常退出")
#输出结果:python正常退出
4.4模块3:random库的使用
1.random库基本介绍
(1)random库是使用随机数的Python标准库,主要用于生成随机数。
(2)伪随机数:采用梅森旋转算法生成的(伪)随机序列中元素。
(3)使用random库:import random
(4)random库包括两类函数,常用共8个:
①基本随机数函数:seed(),random()
②扩展随机数函数:randint(),getrandbits(),uniform(),randrange(),choice(),shuffle()
2.基本随机数函数
函数 | 描述 |
seed(a=None) | 初始化给定的随机数种子,默认为当前系统时间 >>>random.seed(10) #产生种子10对应的序列 |
random() | 生成一个[0.0,1.0)之间的随机小数 0.5714025946899135 |
随机数种子确定了随机序列的产生。随机序列是根据种子来唯一确定的,在随机序列中的每一个数就是随机数。只要种子相同,产生的随机序列就相同(无论是序列中的每一个数还是数之间的关系都是确定的)。
如果不给种子,直接调用random也可以产生随机数。如果不给种子,那么默认的种子是当前调用第一次random函数所对应的系统时间,时间精确到微秒,而这个时间是很难再现的,所以后面产生的程序结果就是完全随机的,不可再现的。为什么要给种子呢?因为如果编程中给出了随机种子,那么下一次程序再次运行时产生的随机数也是相同的,对于使用随机数的程序,我们可以复现或者再现程序运行的过程。因此,是否使用种子要看我们的需求,如果需要再现随机过程,那么我们就设定种子;如果只是用随机数,不关心程序复现的结果,那就可以不设定种子。
3.扩展随机数函数
函数 | 描述 |
randint(a,b) | 生成一个[a,b]之间的整数 64 |
randrange(m,n[,k]) | 生成一个[m,n)之间以k为步长的随机整数 >>>random.randrange(10,100,10) 80 |
getrandbits(k) | 生成一个k比特长的随机整数 >>>random.getrandbits(16) 37885 |
uniform(a,b) | 生成一个[a,b]之间的随机小数 >>>random.uniform(10,100) 13.096321648808136 |
choice(seq) | 从序列seq中随机选择一个元素 >>>random.choice([1,2,3,4,5,6,7,8,9]) 8 |
shuffle(seq) | 将序列seq中元素随机排列,返回打乱后的序列 >>>s=[1,2,3,4,5,6,7,8,9];random,shuffle(s);print(s) [3,5,8,9,6,1,2,7,4] |
python想要把几行代码放在一行,也需要用分号。
(1)需要掌握的能力:
①能够利用随机数种子产生“确定”伪随机数
②能够产生随机整数
③能够对序列类型进行随机操作
4.5实例6:圆周率的计算
1.问题分析
(1)圆周率的近似计算公式:
(2)蒙特卡罗方法:
2.实例讲解
(1)圆周率的近似计算公式:
#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))
(2)蒙特卡罗方法:
#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)
3.举一反三
(1)理解方法思维:
①数学思维:找到公式,利用公式求解
②计算思维:抽象一种过程,用计算机自动化求解。比如蒙地卡罗方法求圆周率,抽象了撒点过程,抽象了一种计算点的数量的过程,并且通过计算机生成伪随机函数的自动化求解过程。
两种思维,谁更准确?答案是不好说,如果公式是精确的,那就用数学思维;如果没有公式,那就用计算思维,比如四色定理不能用公式来解决,只能用计算机通过计算思维来解决。
(2)程序运行时间分析:
①使用time库的计时方法获得程序运行时间。
②改变撒点数量,理解程序运行时间的分布。
③初步掌握简单的程序性能分析方法。程序的主要时间都花在循环上,所以从性能上讲要关注循环。程序性能分析法,使用time库的pref_counter()方法来得到循环所用时间,从而分析是否需要优化循环设计。
(3)计算问题的扩展:
①不求解圆周率,而是某个特定图形的面积。
②在工程计算中寻找蒙特卡罗方法的应用场景。
后期出四色定理的相关知识!