haihongyuan.com
海量文库 文档专家
当前位置:首页 >> 数学 >>

Python电子教案4-1 程序的控制结构_图文

Python电子教案4-1 程序的控制结构_图文

Python语言程序设计

第4章 程序的控制结构

程序的基本结构

程序的流程图

程序流程图用一系列图形、流程线和文字说明描述程序的基本操作和 控制流程,它是程序分析和过程描述的最基本方式。 ?流程图的基本元素包括7种

程序的流程图

程序流程图示例:由连接点A连接的一个程序

程序的基本结构
? 顺序结构是程序的基础,但单一的顺序结构不可能解决 所有问题。

? 程序由三种基本结构组成:
? 顺序结构 ? 分支结构 ? 循环结构 ? 这些基本结构都有一个入口和一个出口。任何程序都由

这三种基本结构组合而成

程序的基本结构
? 顺序结构是程序按照线性顺序依次执行的一种运行方式,其 中语句块1S1和语句块S2表示一个或一组顺序执行的语句

程序的基本结构
分支结构是程序根据条件判断结果而选择不同向前执行路径的 一种运行方式,包括单分支结构和二分支结构。由二分支结构 会组合形成多分支结构

程序的基本结构
循环结构是程序根据条件判断结果向后反复执行的一种运 行方式,根据循环体触发条件不同,包括条件循环和遍历 循环结构

程序的基本结构实例
对于一个计算问题,可以用IPO描述、流程图描述或者直接以 Python代码方式描述
微实例4.1:圆面积和周长的计算。

输入:圆半径R 处理: 圆面积:S = π*R*R 圆周长:L = 2*π*R 输出:圆面积S、周长L
问题IPO描述
1
R = eval(input("请输入圆半径:"))

2
3 4

S = 3.1415*R*R
L = 2*3.1415*R print("面积和周长:",S,L)

Python代码描述

程序的基本结构实例
微实例4.2:实数绝对值的计算。

1 2 3 4

R = eval(input(" 输 入 实 数:"))

if (R < 0):
R = -R print("绝对值",R)

R

(a) 问题IPO描述

(b) 流程图描述

(c) Python代码描述

程序的基本结构实例
微实例4.3:整数累加。

输入:正整数R 处理:
1
2 3 4 5

R = eval(input(" 请 输 入 正 整数:")) i, S = 1, 0 while (i<=R): S = S + i i = i + 1 print("累加求和",S)

S=1+2+3+…+R
输出:输出S

6

(a) 问题IPO描述

(b) 流程图描述

(c) Python代码描述

程序的基本结构实例
IPO描述主要用于区分程序的输入输出关系,重点在于结 构划分,算法主要采用自然语言描述 流程图描述侧重于描述算法的具体流程关系,流程图的 结构化关系相比自然语言描述更进一步,有助于阐述算

法的具体操作过程
Python代码描述是最终的程序产出,最为细致。

程序的分支结构

单分支结构: if语句
Python中if语句的语法格式如下:

if <条件>:
语句块 ? 语句块是if条件满足后执行的一个或多个语句序列 ? 语句块中语句通过与if所在行形成缩进表达包含关系 ? if语句首先评估<条件>的结果值,如果结果为True,则

执行语句块里的语句序列,然后控制转向程序的下一条语
句。如果结果为False,语句块里的语句会被跳过。

单分支结构: if语句
if语句中语句块执行与否依赖于条件判断。但无论什么情况 ,控制都会转到if语句后与该语句同级别的下一条语句

if语句的控制流程图

单分支结构: if语句
? if语中<条件>部分可以使用任何能够产生True或False的语句 ? 形成判断条件最常见的方式是采用关系操作符 ? Python语言共有6个关系操作符
操作符 数学符号 操作符含义

<
<= >= > == !=

<
≤ ≥ > =

小于
小于等于 大于等于 大于 等于 不等于

单分支结构: if语句
输入:接收外部输入PM2.5值
处理: if PM2.5值 >= 75,打印空气污染警告 if 35 <= PM2.5值 < 75,打印空气污染警告 if PM2.5值 < 35,打印空气质量优,建议户外运动 输出:打印空气质量提醒
微实例4.4
1 2 3 4 5 6 7

微实例4.4:PM 2.5空气质量提醒(1)

m4.4PM25Warning.py

PM = eval(input("请输入PM2.5数值: ")) if 0<= PM < 35: print("空气优质,快去户外运动!") if 35 <= PM <75: print("空气良好,适度户外活动!") if 75 <= PM: print("空气污染,请小心!")

二分支结构: if-else语句
Python中if-else语句用来形成二分支结构,语法格式如下:

if <条件>:
<语句块1> else: <语句块2> ? <语句块1>是在if条件满足后执行的一个或多个语句序列

? <语句块2>是if条件不满足后执行的语句序列
? 二分支语句用于区分<条件>的两种可能True或者False ,分别形成执行路径

二分支结构: if-else语句
微实例4.5:PM 2.5空气质量提醒(2)

微实例4.5

m4.5PM25Warning.py

1 2 3 4
5

PM = eval(input("请输入PM2.5数值: ")) if PM >= 75: print("空气存在污染,请小心!") else: print("空气没有污染,可以开展户外运动!")

二分支结构: if-else语句
二分支结构还有一种更简洁的表达方式,适合通过判断返 回特定值,语法格式如下: <表达式1> if <条件> else <表达式2>

1
2

PM = eval(input("请输入PM2.5数值: "))
print("空气{}污染!".format("存在" if PM >= 75 else "没有"))

二分支结构: if-else语句
if…else的紧凑结构非常适合对特殊值处理的情况,如下:

>>>count = 2 >>>count if count!=0 else "不存在" 2 >>>count = 0

>>>count if count!=0 else "不存在"

"不存在"

多分支结构: if-elif-else语句
Python的if-elif-else描述多分支结构,语句格式如下: if <条件1>: <语句块1>

elif <条件2>:
<语句块2> ... else: <语句块N>

多分支结构: if-elif-else语句
? 多分支结构是二分支结构的扩展,这种形式通常用 于设置同一个判断条件的多条执行路径。 ? Python依次评估寻找第一个结果为True的条件,执 行该条件下的语句块,同时结束后跳过整个if-elifelse结构,执行后面的语句。如果没有任何条件成 立,else下面的语句块被执行。else子句是可选的

多分支结构: if-elif-else语句
微实例4.4通过多条独立的if语句对同一个变量PM进行判
断,这种情况更适合多分支结构,改造后的代码如下

1 2 3 4 5 6 7

PM = eval(input("请输入PM2.5数值: ")) if 0<= PM < 35: print("空气优质,快去户外运动!") elif 35 <= PM <75: print("空气良好,适度户外活动!") else: print("空气污染,请小心!")

身体质量指数BMI

BMI的定义如下: BMI = 体重(kg)÷身高2(m2) 例如,一个人身高1.75米、体重75公斤,他的BMI值为24.49

身体质量指数BMI
编写一个根据体重和身高计算BMI值的程序,并同时输出国际和

国内的BMI指标建议值

分类 偏瘦 正常 偏胖 肥胖

国际BMI值(kg/m2) < 18.5 18.5 ~ 25 25 ~ 30 >= 30

国内BMI值(kg/m2) < 18.5 18.5 ~ 24 24 ~ 28 >= 28

实例代码5.1 1 2 3 4 5 #e5.1CalBMI.py

e5.1CalBMI.py

height, weight = eval(input("请输入身高(米)和体重\ (公斤)[逗号隔开]: ")) bmi = weight / pow(height, 2) print("BMI数值为:{:.2f}".format(bmi)) wto, dom = "", ""

身体质量指数BMI
# WTO标准
# 18.5 <= bmi < 25 # 25 <= bmi < 30 wto = "偏瘦"

6
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

if bmi < 18.5:
elif bmi < 25: wto = "正常" elif bmi < 30: wto = "偏胖" else: wto = "肥胖" if bmi < 18.5: dom = "偏瘦" elif bmi < 24: dom = "正常" elif bmi < 28: dom = "偏胖" else: dom = "肥胖"

>>> 请输入身高(米)和体重(公

# 我国卫生部标准 # 18.5 <= bmi < 24 # 24 <= bmi < 28

斤)[逗号隔开]: 1.75, 75 BMI数值为:24.49 BMI指标为:国际'正常', 国内' 偏胖'

print("BMI指标为:国际'{0}', 国内'{1}'".format(wto, dom))

实例代码5.2
1 2 #e5.2CalBMI.py

e5.2CalBMI.py

height, weight = eval(input("请输入身高(米)和体重\ (公斤)[逗号隔开]: "))

3 4 5 6

bmi = weight / pow(height, 2) print("BMI数值为:{:.2f}".format(bmi)) wto, dom = "", "" if bmi < 18.5:

7
8 9 10 11 12 13 14 15 16 17 18

wto, dom = "偏瘦", "偏瘦"
elif 18.5 <= bmi < 24: wto, dom = "正常", "正常" elif 24 <= bmi < 25: wto, dom = "正常", "偏胖" elif 25 <= bmi < 28: wto, dom = "偏胖", "偏胖" elif 28 <= bmi < 30: wto, dom = "偏胖", "肥胖" else: wto, dom = "肥胖", "肥胖" print("BMI指标为:国际'{0}', 国内'{1}'".format(wto, dom))

程序的循环结构

遍历循环: for语句
遍历循环: 根据循环执行次数的确定性,循环可以分为确定次数循

环和非确定次数循环。确定次数循环指循环体对循环次数
有明确的定义循环次数采用遍历结构中元素个数来体现 Python通过保留字for实现“遍历循环” : for <循环变量> in <遍历结构>: <语句块>

遍历循环: for语句
遍历结构可以是字符串、文件、组合数据类型或range()函数:
循环N次 遍历文件fi的每一行 遍历字符串s 遍历列表ls

for i in range(N): <语句块>

for line in fi: <语句块>

for c in s: <语句块>

for item in ls: <语句块>

遍历循环还有一种扩展模式,使用方法如下: for <循环变量> in <遍历结构>: <语句块1> else:

<语句块2>

遍历循环: for语句
? 当for循环正常执行之后,程 序会继续执行else语句中内容 。else语句只在循环正常执行 之后才执行并结束,
1 2 3 for s in "BIT": print("循环进行中: " + s) else:

4
5

s = "循环正常结束"
print(s)

>>> 循环进行中: B 循环进行中: I 循环进行中: T 循环正常结束

? 因此,可以在<语句块2>中放
置判断循环执行情况的语句。

无限循环: while语句
无限循环: ?无限循环一直保持循环操作直到特定循环条件不被满足才 结束,不需要提前知道确定循环次数。 ?Python通过保留字while实现无限循环,使用方法如下: while <条件>: <语句块>语句块

无限循环: while语句
? 无限循环也有一种使用保留字else的扩展模式: while <条件>: <语句块1>

else:
<语句块2>
1 2 3 4 5 6 7 s, idx = "BIT", 0 while idx < len(s): print("循环进行中: " + s[idx]) idx += 1 else: s = "循环正常结束" print(s) >>> 循环进行中: B 循环进行中: I 循环进行中: T 循环正常结束

循环保留字: break和continue
? 循环结构有两个辅助保留字:break和continue,它们用来 辅助控制循环执行

? break用来跳出最内层for或while循环,脱离该循环后程序从
循环后代吗继续续执行
1 2 3 4 5 for s in "BIT": for i in range(10): print(s, end="") if s=="I": break

其中,break语句跳出了 最内层for循环,但仍然 继续执行外层循环。每个

break语句只有能力跳出
>>> BBBBBBBBBBITTTTTTTTTT

当前层次循环

循环保留字: break和continue
? continue用来结束当前当次循环,即跳出循环体中下面尚

未执行的语句,但不跳出当前循环。
? 对于while循环,继续求解循环条件。而对于for循环,程 序流程接着遍历循环列表 ? 对比continue和break语句,如下
1
2 3 4

for s in "PYTHON":
if s=="T": continue print(s, end="")

1
2 3 4

for s in "PYTHON":
if s=="T": break print(s, end="")

>>> PYHON

>>> PY

循环保留字: break和continue
continue语句和break语句的区别是: ?continue语句只结束本次循环,而不终止整个循环的执行。 ?break语句则是结束整个循环过程,不再判断执行循环的条件

是否成立
1 2 3 4 for s in "PYTHON": if s=="T": continue print(s, end="") 1 2 3 4 for s in "PYTHON": if s=="T": break print(s, end="")

>>> PYHON

>>> PY

循环保留字: break和continue
? for循环和while循环中都存在一个else扩展用法。
? else中的语句块只在一种条件下执行,即for循环正常遍历了 所有内容没有因为break或return而退出。 ? continue保留字对else没有影响。看下面两个例子
1 2 3 4 5 6 for s in "PYTHON": if s=="T": continue print(s, end="") else: print("正常退出") 1 2 3 4 5 6 for s in "PYTHON": if s=="T": break print(s, end="") else: print("正常退出")

>>> PYHON正常退出

>>> PY

random库的使用

random库概述
? 随机数在计算机应用中十分常见,Python内置的random库 主要用于产生各种分布的伪随机数序列。random库采用梅 森旋转算法(Mersenne twister)生成伪随机数序列,可用

于除随机性要求更高的加解密算法外的大多数工程应用。
? 使用random库主要目的是生成随机数,因此,读者只需要 查阅该库的随机数生成函数,找到符合使用场景的函数使用 即可。这个库提供了不同类型的随机数函数,所有函数都是 基于最基本的random.random()函数扩展而来。

random库解析
函数 seed(a=None) 描述 初始化随机数种子,默认值为当前系统时间

random() randint(a, b)
getrandbits(k) randrange(start, stop[, step]) uniform(a, b) choice(seq) shuffle(seq) sample(pop, k)

生成一个[0.0, 1.0)之间的随机小数 生成一个[a,b]之间的整数
生成一个k比特长度的随机整数 生成一个[start, stop)之间以step为步数的随机整数 生成一个[a, b]之间的随机小数 从序列类型(例如:列表)中随机返回一个元素 将序列类型中元素随机排列,返回打乱后的序列 从pop类型中随机选取k个元素,以列表类型返回

random库解析
对random库的引用方法与 math库一样,采用下面两种 方式实现:
>>>from random import * >>>random() 0.2922089114412476 >>>uniform(1,10) 1.5913082783598524 >>>uniform(1,20) 7 >>>randrange(0,100,4) #从0开始到100以4递增的 元素中随机返回 96 >>>choice(range(100)) 97 >>>ls = list(range(10)) >>>print(ls) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>>shuffle(ls) >>>print(ls) [5,8,4,7,6,9,3,0,2,10, 1, 2, 3, 4, 5, 6, 7, 8, 9]

import random



from random import *

random库解析
生成随机数之前可以通过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年 ,人类才以人工计算方式得到π的808位精确小数。

π的计算
随着计算机的出现,数学家找到了另类求解π的另类

方法:蒙特卡罗(Monte Carlo)方法,又称随机抽样或统
计试验方法。当所要求解的问题是某种事件出现的概率,或 者是某个随机变量的期望值时,它们可以通过某种“试验” 的方法,得到这种事件出现的频率,或者这个随机变数的平 均值,并用它们作为问题的解。这就是蒙特卡罗方法的基本 思想。

π的计算
应用蒙特卡罗方法求解π的基本步骤如下: ? 随机向单位正方形和圆结构,抛洒大量“飞镖”点

? 计算每个点到圆心的距离从而判断该点在圆内或者圆外
? 用圆内的点数除以总点数就是π/4值。 随机点数量越大,越充分覆盖整个图形,计算得到的π值越精 确。实际上,这个方法的思想是利用离散点值表示图形的面 积,通过面积比例来求解π值。

π的计算

计算π使用的正方形和圆结构

计算π使用的1/4区域和抛点过程

π的计算
实例代码6.1
1 2 3 4
5 6 7 8 9 10 11 12 13 14 15

>>> Pi值是3.144. 运行时间是: 0.016477s

e6.1CalPi.py

#e6.1CalPi.py from random import random from math import sqrt from time import clock DARTS = 10000 hits = 0.0 clock() for i in range(1, DARTS+1): x, y = random(), random() dist = sqrt(x ** 2 + y ** 2) if dist <= 1.0: hits = hits + 1 pi = 4 * (hits/DARTS) print("Pi值是{}.".format(pi)) print("运行时间是: {:5.5}s".format(clock()))

π的计算
DARTS 210 211 212 213 214 215 216 218 220 225 π 3.109375 3.138671 3.150390 3.143554 3.141357 3.147827 3.141967 3.144577 3.1426696777 3.1416978836 运行时间 0.011s 0.012s 0.014s 0.018s 0.030s 0.049s 0.116s 0.363s 1.255s 40.13s

不同抛点数产生的精度和运行时间

异常处理机制

异常处理: try-except语句
观察下面这段小程序:
1 2 num = eval(input("请输入一个整数: ")) print(num**2)

当用户输入的不是数字呢?
>>> 请输入一个整数: 100 10000 >>> 请输入一个整数: NO Traceback (most recent call last): File "D:/PythonPL/echoInt.py", line 1, in <module> num = eval(input("请输入一个整数: ")) File "<string>", line 1, in <module> NameError: name 'No' is not defined

异常处理: try-except语句
Python解释器返回了异常信息,同时程序退出

异常处理: try-except语句
? Python异常信息中最重要的部分是异常类型,它表明了发 生异常的原因,也是程序处理异常的依据。

? Python使用try-except语句实现异常处理,基本的语法格
式如下: try: <语句块1> except <异常类型>:

<语句块2>

异常处理: try-except语句
try: num = eval(input("请输入一个整数: ")) print(num**2) except NameError: print("输入错误,请输入一个整数!")

1 2

该程序执行效果如下:
>>> 请输入一个整数: NO 输入错误,请输入一个整数!

异常的高级用法
? try-except语句可以支持多个except语句,语法格式如下: try: <语句块1> except <异常类型1>: <语句块2> …. except <异常类型N>: <语句块N+1> except: <语句块N+2>

异常的高级用法
? 最后一个except语句没有指定任何类型,表示它对应的语

句块可以处理所有其他异常。这个过程与if-elif-else语句
类似,是分支结构的一种表达方式,一段代码如下

1 2 3 4 5 6 7 8

try: alp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" idx = eval(input("请输入一个整数: ")) print(alp[idx]) except NameError: print("输入错误,请输入一个整数!") except: print("其他错误")

异常的高级用法
该程序将用户输入的数字作为索引从字符串alp中返回一个

字符,当用户输入非整数字符时,except NameError异常
被捕获到,提示升用户输入类型错误,当用户输入数字不在 01到256之间时,异常被except捕获,程序打印其他错误 信息,执行过程和结果如 下:
>>> 请输入一个整数: NO 输入错误,请输入一个整数! >>> 请输入一个整数: 100 其他错误

异常的高级用法
除了 try 和 except 保留字外,异常语句还可以与 else 和 finally保留字配合使用,语法格式如下:
try:
<语句块1> except <异常类型1>:

<语句块2>
else: <语句块3>

finally:
<语句块4>

异常的高级用法

异常的高级用法
采用else和finally修改代码如下: 执行过程和结果如下:

1 2 3 4 5

try:

alp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
idx = eval(input("请输入一个整数: ")) print(alp[idx]) except NameError: print("输入错误,请输入一个整数!") else: print("没有发生异常") finally: print("程序执行完毕,不知道是否发生了异常")

6
7 8 9 1 0

>>> 请输入一个整数: 5 F 没有发生异常 程序执行完毕,不知道是否发生了异常 >>> 请输入一个整数: NO 输入错误,请输入一个整数! 程序执行完毕,不知道是否发生了异常


网站首页 | 网站地图
All rights reserved Powered by 海文库 haihongyuan.com
文档资料库内容来自网络,如有侵犯请联系客服。3088529994@qq.com