4.程序的控制结构

本文介绍了Python编程中的程序控制结构,包括单分支、二分支和多分支结构,强调了条件判断的逻辑运算符和组合。同时,讲解了循环结构,如for和while循环,以及break和continue的使用。此外,提到了异常处理的基本和高级用法,并通过BMI计算和随机数生成举例说明。最后,讨论了蒙特卡罗方法在计算圆周率中的应用。
摘要由CSDN通过智能技术生成

本模块任务:
1.方法论:Python程序的控制语法及结构
2.实践能力:学会编写带有条件判断及循环的程序

程序的三种控制结构

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~2518.5~24
偏胖25~3024~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)之间的随机小数
>>>random.random()

0.5714025946899135

       随机数种子确定了随机序列的产生。随机序列是根据种子来唯一确定的,在随机序列中的每一个数就是随机数。只要种子相同,产生的随机序列就相同(无论是序列中的每一个数还是数之间的关系都是确定的)。

       如果不给种子,直接调用random也可以产生随机数。如果不给种子,那么默认的种子是当前调用第一次random函数所对应的系统时间,时间精确到微秒,而这个时间是很难再现的,所以后面产生的程序结果就是完全随机的,不可再现的。为什么要给种子呢?因为如果编程中给出了随机种子,那么下一次程序再次运行时产生的随机数也是相同的,对于使用随机数的程序,我们可以复现或者再现程序运行的过程。因此,是否使用种子要看我们的需求,如果需要再现随机过程,那么我们就设定种子;如果只是用随机数,不关心程序复现的结果,那就可以不设定种子。

3.扩展随机数函数

常用的扩展随机数函数
函数描述
randint(a,b)

生成一个[a,b]之间的整数
>>>random.randint(10,100)

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)圆周率的近似计算公式:

                \pi =\sum_{k=0}^{\infty }[\frac{1}{16^{k}}(\frac{4}{8k+1}-\frac{2}{8k+4}-\frac{1}{8k+5}-\frac{1}{8k+6})]

(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)计算问题的扩展:
①不求解圆周率,而是某个特定图形的面积。
②在工程计算中寻找蒙特卡罗方法的应用场景。


后期出四色定理的相关知识!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值