4.1 程序的分支结构
- 程序的控制结构
- 单分支结构:根据判断条件结果而选择不同向前路径的运行方式
eg1:
guess = eval(input())
if guess == 99:
print("猜对了")
eg2:
if True:
print("条件正确")
- 二分支结构:根据判断条件结果而选择不同向前路径的运行方式
eg1:
guess = eval(input())
if guess == 99:
print("猜对了")
else :
print("猜错了")
eg2:
if True:
print("语句块1")
else :
print("语句块2")
紧凑形式:
适用于简单表达式的二分支结构
<表达式1> if <条件> else <表达式2>
eg3:
guess = eval(input())
print("猜{}了".format("对" if guess==99 else "错"))
- 多分支结构:对不同分数分级的问题
- 注意多条件之间的包含关系
- 注意变量取值范围的覆盖
- 给成绩分等级的参考代码
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的逻辑非 |
eg1:
guess = eval(input())
if guess > 99 or guess < 99:
print("猜错了")
else :
print("猜对了")
eg2:
if not True:
print("语句块2")
else :
print("语句块1")
- 程序的异常处理
eg1:
try :
num = eval(input("请输入一个整数: "))
print(num**2)
except :
print("输入不是整数")
eg2:
try :
num = eval(input("请输入一个整数: "))
print(num**2)
except NameError:
print("输入不是整数")
4.2 实例5: 身体质量指数BMI
- BMI:Body Mass Index
- 国际上常用的衡量人体肥胖和健康程度的重要标准,主要用于统计分析
- BMI = 体重 (kg) / 身高2 (m2)
- 标准如下
分类 | 国际BMI值 | 国内BMI值 |
---|---|---|
偏瘦 | <18.5 | <18.5 |
正常 | 18.5 ~ 25 | 18.5 ~ 24 |
偏胖 | 25 ~ 30 | 24 ~ 28 |
肥胖 | ≥30 | ≥28 |
#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))
#CalBMIV2.py
height, weight = eval(input("请输入身高(m)和体重(kg)【逗号隔开】:"))
bmi = weight / pow(height, 2)
print("BMI数值为:{:.2f}.format(bmi)")
nat = ""
if bmi < 18.5:
nat = "偏瘦"
elif 18.5 <= bmi < 24:
nat = "正常"
elif 24 <= bmi < 28:
nat = "偏胖"
else:
nat = "肥胖"
print("BMI指标为:国内'{0}'".format(who))
#CalBMIV3.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))
4.3 程序的循环结构
- 遍历循环:遍历某个结构形成的循环运行方式
计数循环(N次):
遍历由range()函数产生的数字序列,产生循环
for i in range(N) :
<语句块>
eg1:
for i in range(5):
print(i)
#0
#1
#2
#3
#4
eg2:
for i in range(5):
print("Hello:",i)
#Hello: 0
#Hello: 1
#Hello: 2
#Hello: 3
#Hello: 4
计数循环(特定次):
遍历由range()函数产生的数字序列,产生循环
for i in range(M,N,K) :
<语句块>
eg1:
for i in range(1,6):
print(i)
#1
#2
#3
#4
#5
eg2:
for i in range(1,6,2):
print("Hello:",i)
#Hello: 1
#Hello: 3
#Hello: 5
字符串遍历循环:
s是字符串,遍历字符串每个字符,产生循环
for c in s :
<语句块>
eg:
for c in "Python123":
print(c, end=",")
#P,y,t,h,o,n,1,2,3,
列表遍历循环:
ls是一个列表,遍历其每个元素,产生循环
for item in ls :
<语句块>
eg:
for item in [123, "PY", 456] :
print(item, end=",")
#123,PY,456,
文件遍历循环:
fi是一个文件标识符,遍历其每行,产生循环
for line in fi :
<语句块>
eg:
for line in fi :
print(line)
- 无限循环:由条件控制的循环运行方式,反复执行语句块,直到条件不满足时结束
eg:
a = 3
while a > 0 :
a = a + 1
print(a)
#(CTRL + C 退出执行)
- 循环控制保留字:break 和 continue
- break跳出并结束当前整个循环(break仅跳出当前最内层循环),执行循环后的语句
- continue结束当次循环,继续执行后续次数循环
- break和continue可以与for和while循环搭配使用
eg1:
for c in "PYTHON" :
if c == "T" :
continue
print(c, end="")
eg2:
for c in "PYTHON" :
if c == "T" :
break
print(c, end="")
eg3:
s = "PYTHON"
while s != "" :
for c in s :
print(c, end="")
s = s[:-1]
#PYTHONPYTHOPYTHPYTPYP
eg4:
s = "PYTHON"
while s != "" :
for c in s :
if c == "T" :
break
print(c, end="")
s = s[:-1]
#PYPYPYPYPYP
- 循环的高级用法:循环与else
- 当循环没有被
break语句
退出时,执行else语句块 - else语句块作为"正常"完成循环的奖励
- 这里else的用法与异常处理中else用法相似
for <变量> in <遍历结构> :
<语句块1>
else :
<语句块2>
while <条件> :
<语句块1>
else :
<语句块2>
eg1:
for c in "PYTHON" :
if c == "T" :
continue
print(c, end="")
else:
print("正常退出")
#PYHON正常退出
eg2:
for c in "PYTHON" :
if c == "T" :
break
print(c, end="")
else:
print("正常退出")
#PY
4.4 模块3: random库的使用
- random库是使用随机数的Python标准库,主要用于生成随机数
- 伪随机数: 采用梅森旋转算法生成的(伪)随机序列中元素
- 使用random库: import random
r a n d o m 库包括两类函数 { 基本随机数函数: s e e d ( ) , r a n d o m ( ) 扩展随机数函数: r a n d i n t ( ) , g e t r a n d b i t s ( ) , u n i f o r m ( ) , r a n d r a n g e ( ) , c h o i c e ( ) , s h u f f l e ( ) random库包括两类函数 \begin{cases} 基本随机数函数: seed(), random()\\ 扩展随机数函数: randint(), getrandbits(), uniform(), randrange(), choice(), shuffle()\\ \end{cases} random库包括两类函数{基本随机数函数:seed(),random()扩展随机数函数:randint(),getrandbits(),uniform(),randrange(),choice(),shuffle()
- 基本随机数函数
- 使用random.seed()给定随机数种子,程序可以复现
- 扩展随机数函数
4.5 实例6: 圆周率的计算
- 圆周率的近似计算公式
#CalPiV1.py
pi = 0
N = 100#假设无穷大是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))
#"\"可以换行,与代码原来在一行时结果一致
- 蒙特卡罗方法求圆周率
#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))
-
举一反三:理解方法思维
- 数学思维:找到公式,利用公式求解
- 计算思维:抽象一种过程,用计算机自动化求解
-
举一反三:对于程序运行时间的分析
- 使用time库的计时方法获得程序运行时间
- 改变撒点数量,理解程序运行时间的分布:程序的主要时间用在循环部分
- 初步掌握简单的程序性能分析方法
-
举一反三:计算问题的扩展
- 不求解圆周率,而是某个特定图形的面积
- 在工程计算中寻找蒙特卡罗方法的应用场景