Python北理工 第四章 程序控制结构

  • 程序的控制结构
    • 单分支结构
    • 二分支结构
    • 多分支结构
    • 条件判断及组合
    • 程序的异常处理

分支结构 

单分支结构

根据 判断条件结果 而选择不同向前路径的运行方式

if <条件>:
   <语句块>

# 示例
guess = eval(input())
if guess == 99:
    print("yes!")

二分支结构

根据 判断条件结果 而选择不同向前路径的运行方式

if <条件>:
    <语句块1>
else:
    <语句块2>

# 示例
guess = eval(input())
if guess == 99:
    print("True!")
else:
    print("False!")

紧凑形式

适用于简单表达式的二分支结构

<表达式1> if <条件> else <表达式2>

# 示例
guess = eval(input())
print("true") if guess == 99 else print("no")

# 示例
guess = eval(input())
print("猜{}了".format("对" if guess==99 else "错"))

注意:

if else 对应的输出是“表达式”,而不是“语句”。表达式是语句的一部分

多分支结构

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

示例

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))

 注意:

多条件之间的包含关系

变量取值范围的覆盖

条件判断及组合

操作符:(省略)

用于条件组合的三个保留字:

操作符及使用描述
x and y两个条件 x 和 y 的逻辑
x or y两个条件 x 和 y 的逻辑
not x条件 x 的逻辑

示例

guess = eval(input())
if guess > 99 or guess < 99:
    print("False")
else:
    print("True")

 理解:就是把 C语言中的 && 翻译为 and,|| 翻译为 or

程序的异常处理

try:
    <语句块1>
except <异常类型>:
    <语句块2>

要执行的程序放在 语句块1中,如果出现异常则执行 语句块2

注意:标注异常类型之后,仅响应 该异常,异常类型名字等同于变量

try:
    num = eval(input("请输入一个整数:"))
    print(num * 2)
except:
    print("输入不是整数")

异常处理的高级使用

try:
    <语句块1>
except:
    <语句块2>
else:
    <语句块3>
finally:
    <语句块4>

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

-else 对应语句块3 在不发生异常时执行,(理解:try执行完之后奖励一个else)

身体质量指数 BMI 问题分析

BMI=体重(kg) / 身高^2(m^2)

问题需求:

输入:给定体重和身高值

输出:BMI指标分类信息(国际和国内)

难点:在于同时输出 国际和国内 对应的分类

思路1:分别计算,并给出国际和国内BMI分类

height, weight = eval(input("请输入身高(米)和体重\(公斤)[逗号隔开]:"))
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:混合计算,并给出国际和国内BMI分类

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 = "偏胖", "肥胖"
print("BMI指标为:国际'{0}', 国内'{1}'".format(who, nat))

举一反三

关注多分支条件的组合

  • 多分支条件之间的覆盖是重要问题
  • 程序可运行,但是不正确,要注意多分支
  • 分支结构是程序的重要框架,读程序先看分支

循环结构

遍历循环

遍历某个结构形成的循环运行方式

for <循环变量> in <遍历结构>:
    <语句块>
  • 从遍历结构中 逐一提取元素,放在循环变量中
  • 由保留字 for 和 in 组成,完整遍历所有元素后结束
  • 每次循环,所获得的元素放入循环变量,并执行一次语句块

计数循环(N次)-1

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

示例

for i in range(5):
    print(i)

# 打印结果:0, 1, 2, 3, 4 (一行一个数字)

 计数循环(N次)-2

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

 [M, N),步长为 K

示例

for i in range(1, 6):
    print(i)
# 1, 2, 3, 4, 5

for i in range(1, 6, 2)
    print(i)
# 1, 3, 5

字符串 遍历循环

# S是字符串,C是字符,遍历字符串中每个字符,产生循环
for C in S:
    <语句块>

示例:

for c in "Python123":
    print(c, end=",")
# P,y,t,h,o,n,1,2,3,

列表遍历循环

# ls是一个列表,遍历其每个元素,产生循环
for item in ls:
    <语句块>

示例

for item in [123, "PY", 456]:
    print(item, end=",")
# 123,PY,456,

文件遍历循环

# fi是一个文件标识符,遍历其每行,产生循环
for line in fi:
    <语句块>

小结:

只要这个后面那个变量or数据类型,是由多个数据元素构成的,就都可以用 for in 方式进行遍历。

无限循环

由条件控制的循环运行方式

反复执行语句块,直到条件不满足时结束

示例:

a = 3
while a > 0:
    a = a - 1
    print(a)
# 2,1,0

 循环控制保留字 break, continue

break:跳出并结束当前整个循环,执行循环后的语句

continue:结束当次循环,继续执行后续次数循环

break和continue 可以与 for和while 搭配使用

for c in "PYTHON":
    if c == "T":
        continue
    print(c, end="")
# PYHON

for c in "PYTHON":
    if c == "T":
        break
    print(c, end="")
# PY
s = "PYTHON"
while s != "":
    for c in s:
        print(c, end="")
    s = s[:-1]
# PYTHONPYTHOPYTHPYTPYP
# 字符串切片,<字符串>[M:N],从M开始到N的前一个位置,因为最后一个元素的下标为-1
# 就是从开头到最后一个元素的前一个位置,即每次去掉最后一个元素,直到字符串为空为止

 

s = "PYTHON"
while s != "":
    for c in s:
        if c == "T":
            break
        print(c, end="")
    s = s[:-1]

这里,break仅跳出当前最内层循环,

  1. s=PYTHON,进入for循环,遍历到T停止当前for循环(输出PY),切片去掉最后一个元素N;
  2. s=PYTHO,进入for循环,遍历到T停止当前for循环(输出PY),切片去掉最后一个元素O;
  3. s=PYTH,进入for循环,遍历到T停止当前for循环(输出PY),切片去掉最后一个元素H;
  4. s=PYT,进入for循环,遍历到T停止当前for循环(输出PY) ,切片去掉最后一个元素T;
  5. s=PY,进入for循环,遍历完当前for循环(输出PY),切片去掉最后一个元素Y;
  6. s=P,进入for循环,遍历完当前for循环(输出P),切片去掉最后一个元素P,字符串为空,退出while循环。

循环的扩展-循环与else

# 1.for循环
for <循环变量> in <遍历结构>:
    <语句块1>
else:
    <语句块2>

# 2.while循环
while<条件>:
    <语句块1>
else:
    <语句块2>
  • 当循环没有被break语句退出时,执行else语句块
  • else语句块作为“正常” 完成循环时的奖励
  • 这里else的用法与异常处理中else用法相似

示例:

无break,执行else语句块

for c in "PYTHON":
    if c == "T":
        continue
    print(c, end="")
else:
    print("正常退出")

# 输出内容:
# PYTHON正常退出

有break,不执行else语句块

for c in "PYTHON":
    if c == "T":
        break
    print(c, end="")
else:
    print("正常退出")

# 输出内容:
# PY

random库基本介绍

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

  • -伪随机数:采用 梅森旋转算法 生成的(伪)随机序列中元素;
  • -random库 主要用于生成 随机数;
  • -使用 random库:import random

random库包括两类函数,常用共8个:

  • 基本随机数函数:seed(),random()
  • 扩展随机数函数:randint(), getrandbits(), uniform(), randrange(), choice(), shuffle()

 随机数种子

基本随机函数

函数描述
seed(a=None)

初始化给定的随机数种子,默认为当前系统时间

>>>random.seed(10)

# 产生种子10对应的序列

random()

生成一个 [0.0, 1.0) 之间的随机小数

>>>random.random()

# 0.7826840676791244

为什么要设定 “随机数种子”?

有利于程序的再现,设定种子之后,产生的随机数是相同的,但是如果不设定随机数种子的话,那么随机数种子默认为当时的系统时间,不利于程序的再现。

扩展随机数函数

函数描述
randint(a, b)

生成一个 [a, b] 之间的整数

>>>random.randint(10, 100)

64

randrange(m, n [, k])生成一个 [m, n) 之间以 k 为步长的随机整数
getrandbits(k)

生成一个 k比特长 的随机整数

>>>random.getrandbits(16)

37885

uniform(a, b)

生成一个 [a, b] 之间的随机小数

>>>random.uniform(10, 100)

72.07953405190293

choice(seq)从序列 seq 中随机选择一个元素

实例6:圆周率的计算问题分析

法一:圆周率的近似计算公式

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))
# 圆周率值是:3.141592653589793

法二:蒙特卡罗方法

圆内撒点数量/ 整个撒点数量,就是 1/4 个pi 

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):
    # 产生随机坐标,random函数产生的恰好是0~1之间的数字
    x, y = random(), random()
    # 判断这个坐标是否在圆内,就看它到圆心的距离是多少
    dist = pow(x ** 2 + y ** 2, 0.5)
    # 如果它到圆心的距离 小于等于 1.0,就说明在圆内,击中+1
    if dist <= 1.0:
        hits = hits + 1
pi = 4 * (hits/DARTS)
print("圆周率值是:{}".format(pi))
print("运行时间是:{:.5f}s".format(perf_counter()-start)  )
# 圆周率值是:3.14214
# 运行时间是:1.20182s

圆周率的计算-举一反三

理解方法思维

  • -数学思维:找到公式,利用公式求解;
  • -计算思维:抽象一种过程,用计算机自动化求解。

程序运行时间分析

  • -使用time库的计时方法获得程序运行时间;
  • -改变撒点数量,理解程序运行时间的分布。(一个程序的80%的时间花在10%的代码上(循环))

计算问题的扩展

  •  -不求解圆周率,而是某个特定图形的面积;
  • -在工程计算中寻找蒙特卡罗方法的应用情景。

练习&作业

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值