python-第4章-程序的控制结构
程序的基本结构
程序流程图
流程图的基本元素(7)
起止框 | 一个程序的开始和结束 |
---|---|
判断框 | 判断一个条件是否成立,根据结果选择相应路径 |
处理框 | 一组处理过程 |
输入/输出框 | 数据输入/数据输出 |
注释框 | 增加程序的解释 |
流向线 | 指示程序的执行路径 |
连接点 | 将多个流程图连接在一起 |
流程图实例:由连接点A连接的一个程序
程序的基本结构
顺序结构是程序按照线性顺序依次执行的一种运行方式
顺序结构的流程图表示
分支结构是程序根据条件判断结果而选择不同向前执行路径的一种运行方式,包括单分支结构和双分支结构
分支结构的流程图表示
循环结构是程序根据条件判断结果向后反复执行的一种运行方式,包括条件循环和遍历循环结构
循环结构的流程图表示
程序的描述方式
程序的描述方式主要有3种,自然语言、流程图和伪代码
自然语言 | 使用人类语言直接描述程序,IPO描述是其中的一种 |
---|---|
流程图 | 程序最直观易懂的表达方式,主要用于较短的算法 |
伪代码 | 介于自然语言与编程语言之间的一种算法描述语言 |
*由于python语言语法相对简单,就没有采用伪代码方式描述程序
对于一个计算问题,可以用IPO、流程图或直接以python代码方式描述
IPO描述重点在于结构的划分,流程图描述侧重于描述算法的具体流程关系,python代码描述最为细致
例子:圆面积和周长的计算
顺序结构的描述
分支结构的描述
循环结构的描述
程序的分支结构
单分支结构:if语句
if <条件>:
<语句块>
if语句首先评估条件的结果值,若结果为True,则执行语句块中的语句序列;若结果为Flase,则语句块中的语句会被跳过
if语句流程图
操作符 | 数学符号 | 操作符含义 |
---|---|---|
< | < | 小于 |
<= | ≤ | 小于或等于 |
>= | ≥ | 大于或等于 |
> | > | 大于 |
== | = | 等于 |
!= | ≠ | 不等于 |
*python使用"=“表示赋值语句,使用”=="表示等于
字符或字符串也可以用于条件比较.字符串比较本质上是字符串对应的Unicode编码比较,因此,字符串的比较按照字典顺序进行
>>> 4<5
True
>>> "pig"=="pig"
True
>>> "Pig"<"pig" #英文大写字符对应的Unicode编码比小写小
True
例子:三级模式PM2.5空气质量体醒(分类)
PM=eval(input("请输入PM2,5数值:"))
if 0 <= PM <35:
print("空气优质,快去户外运动!")
if 35 <=PM <75:
print("空气良好,适度户外运动!")
if 75 <=PM :
print("空气污染,请小心!")
============================ RESTART: D:/12121212.py ===========================
请输入PM2,5数值:45
空气良好,适度户外运动!
二分支结构:if-else语句
if <条件>:
<语句块1>
else:
<语句块2>
语句块1是,在if条件满足后执行的一个或多个语句序列,语句块2是if条件不满足后执行的语句序列
二分支结构还有一种更简洁的表达方式,适合通过判断返回特定值
<表达式1> if <条件> else <表达式2>
>>> count=2
>>> count if count!=0 else "不存在"
2
>>> count=0
>>> count if count!=0 else "不存在"
'不存在'
例子:两种情况的PM2.5空气质量提醒(判断)
PM=eval(input("请输入PM2,5数值:"))
if 75 <=PM :
print("空气存在污染,请小心!")
else:
print("空气没有污染,可以展开户外运动!")
============================ RESTART: D:/12121212.py ===========================
请输入PM2,5数值:45
空气没有污染,可以展开户外运动!
PM=eval(input("请输入PM2,5数值:")) #简洁版
print("空气{}污染!".format("存在" if PM>=75 else "没有"))
============================ RESTART: D:/12121212.py ===========================
请输入PM2,5数值:45
空气没有污染!
多分支结构:if-elif-else语句
if <条件1>:
<语句块1>
elif <条件2>:
<语句块2>
...
else:
<语句块N>
多分支结构流程图
多分支结构常用于设置同一个判断条件的多条执行路径。python依次评估寻找第一个结果为True的条件,执行该条件下的语句块,结束后跳过整个if-elif-else结构,执行后面的语句。如果没有任何条件成立,else下面的语句块将被执行
例子:多种执行路径的PM2.5空气质量提醒
PM=eval(input("请输入PM2,5数值:"))
if 0 <= PM <35:
print("空气优质,快去户外运动!")
elif 35 <= PM <75:
print("空气良好,适度户外运动!")
else:
print("空气污染,请小心!")
============================ RESTART: D:/12121212.py ===========================
请输入PM2,5数值:45
空气良好,适度户外运动!
例子:身体质量指数
height,weight=eval(input("请输入身高(米)和体重(公斤)[逗号隔开]:")) #英文逗号
bmi=weight/pow(height,2) #分开版
print("BMI数值为:{:.2f}".format(bmi))
who,dom="",""
if bmi < 18.5:
who = "偏瘦"
elif bmi < 25:
who="正常"
else:
who="肥胖"
if bmi < 18.5:
dom = "偏瘦"
elif bmi < 24:
dom="正常"
elif bmi < 28:
dom="偏胖"
else:
dom="肥胖"
print("BMI指标为国际'{0}',国内'{1}'".format(who,dom))
============================= RESTART: D:/23131.py =============================
请输入身高(米)和体重(公斤)[逗号隔开]:1.7,50
BMI数值为:17.30
BMI指标为国际'偏瘦',国内'偏瘦'
height,weight=eval(input("请输入身高(米)和体重(公斤)[逗号隔开]:")) #融合版
bmi=weight/pow(height,2)
print("BMI数值为:{:.2f}".format(bmi))
who,dom="",""
if bmi < 18.5:
who,dom = "偏瘦","偏瘦"
elif 18.5<=bmi < 24:
who,dom="正常","正常"
elif 24<=bmi < 25:
who,dom="正常","偏胖"
elif 25<=bmi < 28:
who,dom="偏胖","偏胖"
elif 28<=bmi < 30:
who,dom="偏胖","肥胖"
else:
who,dom="肥胖","肥胖"
print("BMI指标为国际'{0}',国内'{1}'".format(who,dom))
============================= RESTART: D:/23131.py =============================
请输入身高(米)和体重(公斤)[逗号隔开]:1.75,75
BMI数值为:24.49
BMI指标为国际'正常',国内'偏胖'
程序的循环结构
根据循环执行次数的确定性,循环可以分为确定次数循环(遍历循环,for语句)和非确定次数循环(无限循环,while)
遍历循环:for语句
for <循环变量> in <遍历结构>:
<语句块>
for语句的循环执行次数是根据遍历结构中元素个数确定的
遍历结构可以是字符串、文件、组合数据类型或range()函数
for i in range(N): #循环N次
<语句块>
for line in fi: #遍历文件fi的每一行
<语句块>
for c in s: #遍历字符串s
<语句块>
for item in ls: #遍历列表ls
<语句块>
for <循环变量> in <遍历结构>: #遍历循环的一种扩展模式
<语句块1>
else:
<语句块2>
在这种扩展模式中,当for循环正常执行之后,程序会继续执行else语句中的内容。else语句只在循环正常执行并结束后才执行,因此,可以在<语句块2>中放置判断循环执行情况的语句
for s in "PIG":
print("循环进行中:"+s)
else:
s="循环正常结束"
print(s)
============================= RESTART: D:/23131.py =============================
循环进行中:P
循环进行中:I
循环进行中:G
循环正常结束
无限循环:while语句
while <条件>:
<语句块>
当条件判断为True时,循环体重复执行语句块中语句;当条件为Flase时,循环终止,执行与while同级别缩进的后续语句
while <条件>: #无限循环的一种else的扩展模式
<语句块1>
else:
<语句块2>
在这种扩展模式中,当while循环正常执行后,程序会继续执行else语句中的内容。else语句只在循环正常执行后才执行
s,idx="PIG",0 #idx初始化
while idx<len(s):
print("循环进行中:"+s[idx])
idx +=1 #计数器idx累加
else:
s="循环正常结束"
print(s)
============================= RESTART: D:/23131.py =============================
循环进行中:P
循环进行中:I
循环进行中:G
循环正常结束
循环保留字:break和continue
循环结构有两个保留字:break和continue,它们用来辅助控制循环执行
break用来跳出最内层for或while循环,脱离该循环后程序从循环代码后继续执行
break语句跳出了最内层for循环,但仍然继续执行外层循环。每个break语句只有能力跳出当前层次循环
for s in "PIG":
for i in range(10):
print(s,end="")
if s =="T":
break
============================= RESTART: D:/23131.py =============================
PPPPPPPPPPIIIIIIIIIIGGGGGGGGGG
continue用来结束当前当次循环,即跳出循环体中下面尚未执行的语句,但不跳出当前循环。对于while循环,继续求解循环条件。而对于for循环,程序流程接着遍历循环列表
for s in "PIG": #continue版
if s =="I":
continue
print(s,end="")
============================= RESTART: D:/23131.py =============================
PG
for s in "PIG": #break版
if s =="I":
break
print(s,end="")
============================= RESTART: D:/23131.py =============================
P
continue语句和break语句的区别是:
continue语句只结束本次循环,而不终止整个循环执行;
break语句则是结束整个循环过程,不再判断执行循环的条件是否成立
else中的语句块只在一种条件下执行——循环正常遍历了所有内容或由于条件不成立而结束循环,没有因为break或return而退出。continue对else没有任何影响
for s in "PIG":
if s =="I":
continue
print(s,end="")
else:
print("正常退出")
============================= RESTART: D:/23131.py =============================
PG正常退出
for s in "PIG":
if s =="I":
break
print(s,end="")
else:
print("正常退出")
============================= RESTART: D:/23131.py =============================
P
random库的使用
概述
random库采用梅森旋转算法生成伪随机数序列,可用于除随机性要求更高的加解密算法外的大多数工程应用
随机数或随机事件是不确定性的产物,其结果是不可预测、产生之前不可预见。因为计算机是按照一定算法产生随机数的,其结果是确定的、可预见的,称为“伪随机数”
真正意义上的随机数是不能评价
解析
random库常用的随机数生成函数(9)
random库的引用方法
第一种:import random
第二种:from random import *
>>> from random import*
>>> random()
0.9882481385499576
>>> uniform(1,10)
7.901675857249479
>>> uniform(1,20)
18.179457350924583
>>> randrange(0,100,4)
60
>>> choice(range(100))
67
>>> ls = list(range(10))
>>> print(ls)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> shuffle(ls)
>>> print(ls)
[2, 7, 6, 4, 1, 5, 0, 8, 9, 3]
生成随机数之前可以通过seed()函数指定随机数种子,随机数种子一般是一个整数,只要种子相同,每次生成的随机数序列也相同
>>> seed(125) #对随机数种子赋值125
>>> "{}.{}.{}".format(randint(1,10),randint(1,10),randint(1,10))
'4.4.10'
>>> "{}.{}.{}".format(randint(1,10),randint(1,10),randint(1,10))
'5.10.3'
>>> seed(125) #再次给随机数种子赋值125
>>> "{}.{}.{}".format(randint(1,10),randint(1,10),randint(1,10))
'4.4.10' #随机数序列与先前相同
例子:π的计算
π(圆周率)是数学和物理学普遍存在的常数之一,它定义了一个标准圆周长与直径之比。直到1948年,人类才以人工计算方式(BBP公式)得到π的808为精确小数。
随着计算机的出现,找到了蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法。该方法属于计算数学的一个分支,由于其能够真实地模拟实际物理过程,解决问题与实际非常符合,可以得到很圆满地结果
蒙特卡罗地基本思想——当所要求的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以通过某种“试验”的方法,得到这种事件出现的概率,或者这个随机变数的平均值,并用它们作为问题的解
from random import random
from math import sqrt
from time import process_time
DARTS=1000 #抛洒大量“飞镖点”
hits=0.0 #通过面积比例求解π值
process_time() #调用process_time(),启动计时器
for i in range(1,DARTS+1):
x,y=random(),random() #两个随机数给出随机抛点(x,y)坐标
dist=sqrt(x**2+y**2) #计算每个点到圆心的距离,用sqrt()函数,求平方根
if dist <=1.0: #判断该点在圆内圆外
hits=hits+1
pi=4*(hits/DARTS) #用圆内的点数除以总点数(hits/DARTS)就是π/4值
print("Pi值是{}.".format(pi))
print("运行时间是:{:.5f}s".format(process_time())) #调用process_time(),返回运行时间
============================ RESTART: D:\1212121.py ============================
Pi值是3.208. #DARTS=1000
运行时间是:0.04688s
============================ RESTART: D:\1212121.py ============================
Pi值是3.1448. #DARTS=100000
运行时间是:0.07812s
============================ RESTART: D:\1212121.py ============================
Pi值是3.1413504. #DARTS=10000000,当总点数越大,π值越精确,运行时间也越长
运行时间是:0.87500s
程序的异常处理
异常处理:try-except语句
python异常信息含义说明图
python异常信息中最重要的部分是异常类型,它表明发生异常的原因,也是程序处理异常的依据
try:
<语句块1>
except <异常类型>:
<语句块2>
语句块1是正常执行的程序内容,当发生异常时执行except保留字后的语句块2
try:
num=eval(input("请输入一个整数:"))
print(num*2)
except NameError:
print("输入错误,请输入一个整数!")
============================ RESTART: D:\1212121.py ============================
请输入一个整数:a
输入错误,请输入一个整数!
编程语言的异常和错误是两个相似但不同的概念。异常和错误都可能引起程序执行错误而退出,它们属于程序没有考虑到的例外情况。
可以预见的例外情况称为“异常”,异常发生后经过妥善处理可以继续执行;因程序编码逻辑产生的不可预见的例外情况称为“错误”,错误发生后程序无法恢复执行,而且程序本不该处理这类可能的例外
异常的高级用法
try:
<语句块1>
except <异常类型1>:
<语句块2>
...
except <异常类型N>:
<语句块N+1>
except:
<语句块N+2>
这些except所包含的语句块只处理这些类型的异常。这个过程与if-elif-else语句类似,是分支结构的一种表达方式
try:
alp="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
idx=eval(input("请输入一个整数:"))
print(alp[idx])
except NameError:
print("输入错误,请输入一个整数!")
except:
print("其他错误")
============================= RESTART: D:\23131.py =============================
请输入一个整数:a #当用户输入非整数字符时,except NameError被捕获
输入错误,请输入一个整数!
============================= RESTART: D:\23131.py =============================
请输入一个整数:100 #当用户输入数字不在(0-25)之间,异常被except捕获
其他错误
try:
<语句块1>
except <异常类型1>:
<语句块2>
else:
<语句块3>
finally:
<语句块4>
当try中的语句块1正常执行结束且没有发生异常时,else中的语句块3执行
finally语句块则不同,无论try中的语句块1是否发生异常,语句块4都会执行
异常处理过程图
try:
alp="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
idx=eval(input("请输入一个整数:"))
print(alp[idx])
except NameError:
print("输入错误,请输入一个整数!")
else:
print("没有发生异常")
finally:
print("程序执行完毕,不知道是否发生异常")
============================= RESTART: D:\23131.py =============================
请输入一个整数:6
G
没有发生异常
程序执行完毕,不知道是否发生异常
============================= RESTART: D:\23131.py =============================
请输入一个整数:a
输入错误,请输入一个整数! #NameError错误
程序执行完毕,不知道是否发生异常
============================= RESTART: D:\23131.py =============================
请输入一个整数:100 #没有设置except捕获IndexError错误
程序执行完毕,不知道是否发生异常
Traceback (most recent call last):
File "D:\23131.py", line 4, in <module>
print(alp[idx])
IndexError: string index out of range
try-except异常一般只用来检测极少发生的情况,例如,用户输入的合规性或文件打开是否成功等
对于面向商业应用的软件产品,稳定性和可靠性时是最重要的衡量指标之一。即使这类软件产品也不会滥用try-except类型语句。因为采用try-except语句会影响代码的可读性,增加代码维护难度,所以,一般只在关键地方采用try-except类型语句处理可能发生的异常。建议结合函数设计统筹应用异常处理
亲,看完这篇笔记,点个赞吧!