程序的分支结构
单分支结构
根据判断条件结果而选择不同向前路径的运行方式
if <条件>:
<语句块>
二分支结构
根据判断条件结果而选择不同向前路径的运行方式
if <条件>:
<语句块1>
else:
<语句块2>
紧凑形式:适用于简单表达式的二分支结构
<表达式1> if <条件> else <表达式2>
多分支结构
if <条件1>:
<语句块1>
elif <条件2>:
<语句块2>
...
else:
<语句块n>
条件判断及组合
条件判断
操作符
< <= >= > == !=
条件组合
用于条件组合的三个保留字
and
逻辑与;or
逻辑或;not
逻辑非
程序的异常处理
异常处理的基本使用
日常使用程序放在<语句块1>,异常时执行<语句块2>
try:
<语句块1>
except:
<语句块2>
区分异常类型:
try:
<语句块1>
except <异常类型>:
<语句块2>
高级使用方法,语句块4一定执行,语句块3在不发生异常时执行:
try:
<语句块1>
except:
<语句块2>
else:
<语句块3>
finally:
<语句块4>
实例5:“身体质量指数BMI”问题
- BMI: Body Mass Index,对身体质量进行刻画
- 定义:BMI=体重(kg)/身高(m)^2
分类 | 国际标准 | 国内标准 |
---|---|---|
偏瘦 | <18.5 | <18.5 |
正常 | 18.5~25 | 18.5~24 |
偏胖 | 25~30 | 24~28 |
肥胖 | >30 | >28 |
问题需求
- 输入:给定身高和体重值
- 输出:BMI指标分类信息(国际和国内)
实例讲解
思路:
- 难点在于同时输出国际和国内对应的分类
- 思路1:分别计算国际和国内
- 思路2:混合计算
思路1:
#CalBMIv1.py
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:
#CalBMIv2.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))
举一反三
关注多分支条件的组合
- 多分支条件之间的覆盖是重要问题
- 程序可运行,但不正确,要注意多分支
- 分支结构是程序的重要框架,读程序先看分支
程序的循环结构
遍历循环
遍历某个结构构成的循环运行方式
for <循环变量> in <遍历结构>:
<语句块>
- 从遍历结构中逐一提取元素,放入循环变量中,执行语句块
计数循环n次
for i in range(N):
<语句块>
计数循环特定次
m到n-1,步长k
for i in range(M,N,K):
<语句块>
字符串遍历循环
for c in s:
<语句块>
- s是字符串,遍历字符串每个字符,产生循环
列表遍历循环
for item in ls:
<语句块>
文件遍历循环
for line in fi:
<语句块>
无限循环
反复执行语句块,直到语句块不满足条件
while <条件>:
<语句块>
循环控制保留字
-
break
跳出并结束当前循环,执行循环后的语句,仅跳出当前最内层循环 -
continue
结束当次循环,继续执行后续循环 - 均可与
for
和while
一起使用
循环的高级用法
- 与
else
搭配 - 当循环没有被
break
退出时,执行else
语句块 -
else
语句块作为“正常”完成循环的奖励 - 与异常处理中的
else
相似
for <循环变量> in <遍历结构>:
<语句块1>
else:
<语句块2>
while <条件>:
<语句块1>
else:
<语句块2>
例:
for c in PYTHON:
if c == "T":
continue
print(c, end=='')
else:
print("正常退出")
结果为:
PYHON正常退出
换成break
for c in PYTHON:
if c == "T":
break
print(c, end=='')
else:
print("正常退出")
结果为:
PY
模块3:random库的使用
概述
random库是使用随机数的Python标准库
伪随机数:采用梅森螺旋算法产生的(伪)随机序列中的元素
包含两类函数,常用8个
- 基本随机数函数:
seed()
,random()
- 扩展随机数函数:
randint()
,getrandbits()
,uniform()
,randrange()
,choice()
,shuffle()
基本随机数函数
随机数种子
用随机数种子产生随机序列,给随机数种子,产生的随机数就定了
函数 | 描述 |
---|---|
seed(a=None) |
初始化给定的随机数种子,默认为系统当前时间 |
random() |
生成一个[0.0,1.0)之间的小数 |
扩展随机数函数
函数 | 描述 |
---|---|
randint(a,b) |
生成一个[a,b]之间的整数 |
randrange(m,n[,k]) |
生成一个[m,n)之间以k为步长的随机整数 |
getrandbits(k) |
生成一个k比特长的随机整数 |
uniform(a,b) |
生成一个[a,b]之间的随机小数 |
choice(seq) |
从序列seq中随机选取一个元素 |
shuffle(seq) |
将序列seq中元素随机排列,返回打乱之后的序列 |
需要掌握的能力
- 利用随机数种子产生“确定”伪随机数
- 能够产生随机整数
- 能够对序列类型随机操作
实例6:圆周率的计算
圆周率的近似计算
#CalPiV1.py
pi = 0
N = 100
for k in range(100):
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库的计时方法获得程序运行时间
- 改变撒点数量,理解程序运行时间的分布
- 初步掌握简单的程序性能分析方法
计算问题的扩展
- 求特定图形的面积