- 程序的控制结构
- 单分支结构
- 二分支结构
- 多分支结构
- 条件判断及组合
- 程序的异常处理
分支结构
单分支结构
根据 判断条件结果 而选择不同向前路径的运行方式
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仅跳出当前最内层循环,
- s=PYTHON,进入for循环,遍历到T停止当前for循环(输出PY),切片去掉最后一个元素N;
- s=PYTHO,进入for循环,遍历到T停止当前for循环(输出PY),切片去掉最后一个元素O;
- s=PYTH,进入for循环,遍历到T停止当前for循环(输出PY),切片去掉最后一个元素H;
- s=PYT,进入for循环,遍历到T停止当前for循环(输出PY) ,切片去掉最后一个元素T;
- s=PY,进入for循环,遍历完当前for循环(输出PY),切片去掉最后一个元素Y;
- 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%的代码上(循环))
计算问题的扩展
- -不求解圆周率,而是某个特定图形的面积;
- -在工程计算中寻找蒙特卡罗方法的应用情景。
练习&作业