python语言程序设计——【第四周】程序的控制结构

237 阅读8分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情

python语言程序设计——【第四周】程序的控制结构

课程导学

Python基本语法元素

  • 缩进、注释、命名、变量、保留字
  • 类型、字符串、整数、浮点数、列表
  • 赋值语句、分支语句、函数
  • input()、print()、eval()、print()格式化

Python基本图形绘制

  • 从计算机技术演进角度看待Pythoni语言
  • 海龟绘图体系及import保留字用法
  • penup(、pendown()、pensize()、pencolor0
  • fd()、circle()、seth()

第3章-基本数据类型

  • 数据类型:整数、浮点数、复数
  • 数据类型运算操作符、运算函数
  • 字符串类型:表示、索引、切片
  • 字符串操作符、处理函数、处理方法、.format()格式化
  • time库:time()、strftime()、strptime()、sleep()等

image-20220726224318200

本课概要

第4章-程序的控制结构

  • 4.1 程序的分支结构
  • 4.2 实例5:身体质量指数BMI
  • 4.3 程序的循环结构
  • 4.4 模块3:random库的使用
  • 4.5 实例6:圆周率的计算

4.1程序的分支结构

image-20220726224622456

单分支结构

image-20220727135714723

单分支小案例

guess = eval(input())
if guess === 99:
    print("你猜对了")

二分支结构

image-20220727140039188

image-20220727140140860

案例
guess = eval(input())
print("猜{}了".format("对" if guess === 99 else "错"))#对与错是语句的一部分而不是赋值1、根据判断条件结果而选择不同向前路径的运行方式。
​
2、如果是True, 执行语句块1, 如果是False, 执行语句块2, 然后才执行。
​
3、二分支的紧凑形式中,表达式1和表达式2只能是表达式,不能是赋值语句。

多分支结构

image-20220727141034505

分数分级问题
score = eval(input())
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
elif score >= 60:
    grade = "D"

image-20220727141529873

image-20220727141547274

image-20220727142049854

程序的异常处理

image-20220727142241354

image-20220727142346480

示例1,异常处理,try发生意外则执行except内的内容
try:
    num = eval(input("请输入一个整数"))
    print(num*2)
except:#这里可以指定加上错误(异常)类型才执行,异常类型名字等同于变量
    print("输入的不是整数")

image-20220727145421607

else:对于语句块3在不发生异常时执行

finally:对应语句块4一定执行

image-20220727150136181

4.2实例5:身体质量指数BMI(对身体质量的刻画)

image-20220727150222114

image-20220727150454534

问题需求

输入:给定体重和身高值
输出:BMI指标分类信息(国际和国内)

实例讲解

image-20220727151818399

思路1的代码形式

#CalBMIv1.py
height,weight = eval(input("请输入身高(m)和体重(kg)[逗号隔开]:"))
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的代码形式

#CalBMIv2.py
height,weight = eval(input("请输入身高(m)和体重(kg)[逗号隔开]:"))
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))

image-20220727173215449

4.3程序的循环结构

image-20220727191747981

image-20220727191914826

遍历循环的应用

计数循环(N次)

for i in range(N):
    <语句块>
    
    -遍历由range()函数产生的数字序列,产生循环

image-20220727192209873

for i in range(M,N,K):
    <语句块>
    遍历由range()函数产生的数字序列,产生循环

image-20220727193123491

字符串遍历循环
for c in s:
    <语句块>
    -s是字符串,遍历字符串每个字符,产生循环
for c in "Python123":
    print(c,end=",")#输出:P,y,t,h,o,n,1,2,3,
列表遍历循环
for item in ls:
    <语句块>
    -s是一个列表,遍历其每个元素,产生循环
​
for item in [123,"Python",456]:
    print(item,end = ",")#输出123,Python,456,

image-20220727202214788

image-20220727202456028

line表示:文件的每一行,那么每一行就会被输出出来

image-20220727202610955

无限循环

image-20220727203644991

a = 3
while a > 0:
    a = a - 1
    print(a)#答案出来是2 1 0

image-20220727204406552

循环控制保留字

breakcontinue
-break跳出并结束当前整个循环,执行循环后的语句
-continue结束当次循环,继续执行后续次数循环
-breakcontinue可以与forwhile循环搭配使用

continue使用例子

for c in "PYTHON":
    if c == "T":
        continue
    print(c,end="")
    #答案是PYHON,T被跳过了,退出了当前的循环,但没有退出整个循环,所以T后面的还是会被打印出来。如果是break的话,T后面的就不会打印出来

image-20220727212533637

s = "PYTHON"
while s != "":
    for c in s:
        print(c,end="")
    s = s[:-1]
#答案为PYTHONPYTHOPYTHPYTPYP

image-20220727214315050

循环和else
for c in "TYPHON":
    if c == "T":
        continue
    print(c,end="")
else:
    print("正常退出")
    -------
continue换成break
for c in "PYTHON":
    if c == "T":
        break
    print(c,end="")
else:
    print("正常退出")

image-20220727215115918

image-20220727215325726

4.4模块3:random库的使用

random库是使用随机数的Python标准库

是自带的,不需要安装,直接import引入就行了

电脑中的随机数:各种复杂条件下产生的确定值,也就是伪随机数

伪随机数:采用梅森旋转算法生成的(伪)随机序列中元素

使用random库
import random
​
-基本随机数函数:seed(),random()
-扩展随机数函数:randint(),getrandbits(),uniform(),randrange(),choice(),shuffle()

基本随机数

image-20220727222358714

函数描述
seed(a=None)初始化给定的随机数种子,默认为当前系统时间>>>random.seed(10)#产生种子10对应的序列
random()生成一个[0.0,1.0]之间的随机小数>>>random.random()

种子只需要刚开始给一次就可以了(也可以不给,不给的话是当前调用第一次random函数所对应的系统时间,精确到微秒,所以很难再现的,相当于完全随机了)

这次的种子如果跟上次是一样的话是可能复现上一次的结果的

image-20220728002222150

种子是10,产生的第一个数一定是0.57

扩展随机函数

函数描述
randint(a,b)生成一个[a,b]之间的整数>>>random.random(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.09632164880.精度为小数点后16位
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]

4.5实例6:圆周率的计算

蒙地卡罗方法

通常蒙特卡罗方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。例如在核物理研究中,分析中子在反应堆中的传输过程。中子与原子核作用受到量子力学规律的制约,人们只能知道它们相互作用发生的概率,却无法准确获得中子与原子核作用时的位置以及裂变产生的新中子的行进速率和方向。科学家依据其概率进行随机抽样得到裂变位置、速度和方向,这样模拟大量中子的行为后,经过统计就能获得中子传输的范围,作为反应堆设计的依据。
另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或者随机变量的期望值。通过随机抽样的方法,以随机事件出现的频率估计其概率,或者以抽样的数字特征估算随机变量的数字特征,并将其作为问题的解。这种方法多用于求解复杂的多维积分问题。
假设我们要计算一个不规则图形的面积,那么图形的不规则程度和分析性计算(比如,积分)的复杂程度是成正比的。蒙特卡罗方法基于这样的思想:假想你有一袋豆子,把豆子均匀地朝这个图形上撒,然后数这个图形之中有多少颗豆子,这个豆子的数目就是图形的面积。当你的豆子越小,撒的越多的时候,结果就越精确。借助计算机程序可以生成大量均匀分布坐标点,然后统计出图形内的点数,通过它们占总点数的比例和坐标点生成范围的面积就可以求出图形面积。
​
​
圆周率
蒙特卡罗方法可用于近似计算圆周率:让计算机每次随机生成两个0到1之间的数,看以这两个实数为横纵坐标的点是否在单位圆内。生成一系列随机点,统计单位圆内的点数与总点数,(圆面积和正方形面积之比为PI:4,PI为圆周率),当随机点获取越多时,其结果越接近于圆周率(然而准确度仍有争议:即使取10的9次方个随机点时,其结果也仅在前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))

image-20220728005735084

#CalPiV2.py
from random import random
from time import perf_counter
DARTS = 1000*1000#抛洒的点数,设置为100w
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)#只看4分之一个园
    print("圆周率值是:{}".format(pi))
    print("运行时间是{:.5f}s".format(perf_counter()-start))

image-20220728011025093