python自动化测试 第 3 章.程序控制流程与程序的异常处理
python程序流程控制是指python的代码执行顺序,流程。
程序结构
顺序结构是计算机程序的基础,
三种基本结构:
- 顺序结构
- 分支结构
- 循环结构
1. 顺序结构
从上往下依次执行
2.分支结构
程序根据条件判断结构而选择不同的代码向前执行的一种方式,条件分支。
- 单分支
- 二分支
- 多分支
2.1 单分支
if 条件表达式:
语句块
image.png
案例:判断成绩是否及格
需求1:用户输入成绩,判断是否合格
- 接收用户的输入
- 判断成绩
- 做出反应
input函数
接受用户输入的文本信息,以字符串的形式返回,它接受字符串参数作为提示信息输出。
特别注意:输入的文本信息,是以字符串的形式返回的,所以如果输入的数字要获取数值形式,要进行数据类型转换
score = input('请输入分数:') # 此时的score是字符串
score = int(score) # 把score从字符串转换成数值类型
if score >= 60:
print('成绩合格')
2.2 二分支
if 条件:
代码块1
else:
代码块2
image.png
score = input('请输入分数:')
score = int(score)
if score >= 60:
print('成绩合格')
else:
print('成绩不合格')
2.3 多分支
if 条件1:
代码块1
elif 条件2:
代码块2
....
else:
代码块n
可以没有else 语句
需求2:成绩评价
- < 40 : E
- 40-60 : D
- 60-75 :C
- 75-85:B
- 85-100 :A
score = input('请输入分数:')
score = int(score)
if score < 40:
print('E')
elif 40 <= score < 60:
print('D')
elif 60 <= score < 75:
print('C')
elif 75 <= score < 85:
print('B')
else:
print('A')
3.循环结构
- 条件循环,while循环
- 遍历循环,for循环,迭代循环
3.1 条件循环
while 条件:
代码块
image.png
条件恒为True,称为无限循环,死循环
# 从0依次打印小于n的整数 n是一个大于0的整数
num = int(input('输入一个大于0的整数:'))
i = 0
while i < num:
print(i)
i += 1
3.2 for循环(又叫遍历循环)
for 循环变量 in 遍历结构:
代码块
定义:for循环会依次取出遍历结构中的元素,然后赋值给循环变量,每次遍历都会执行代码块,直到取出所有的元素为止。
迭代器(iterator)
一个可以记住遍历位置的对象,for循环的本质就是通过迭代器来实现的。
通过内建函数iter可以创建迭代器。
print(iter('abc')) # 输出 <str_iterator object at 0x000002BCBCE654A8>
print(iter([1, 2, 3])) # 输出 <list_iterator object at 0x000002BCBCE654A8>
print(iter(1)) # 出现报错,是不可迭代对象
可迭代对象,凡是可以通过iter创建迭代器的对象,成为可迭代对象,反之就是不可迭代对象。
序列类型,散列类型,都是可迭代对象
range函数
内建函数range可以创建输出整数序列的迭代器,与切片的使用方法一样。
range(start=0, stop, step=1)
range(i,j) 生成 i,i+1, i+2,。。。j-1,
for i in range(1,10):
print(i)
常与for循环一起使用,定义循环次数
# 定义循环次数
for i in range(3):
print(i)
# 输出100以内的偶数
for i in range(0, 100, 2):
print(i)
# 输出-1到-10
for i in range(-1, -11, -1):
print(i)
3.3 循环控制关键字
ls = [60,59,78,80,56,55]
# ls里存放的是所有学生的成绩
# 判断是否有童靴不及格
for score in ls:
if score < 60:
print('有同学不及格')
输出:
有同学不及格
有同学不及格
有同学不及格
break 关键字
break 跳出当前循环体,代码继续往后执行
如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。
ls = [60,59,78,80,56,55]
# ls里存放的是所有学生的成绩
# 判断是否有童靴不及格
for score in ls:
if score < 60:
print('有同学不及格')
break
输出:
有同学不及格
continue关键字
continue 用来跳出当次循环,继续执行下一次循环,(代码块中continue后的代码不执行,直接跳转到for语句)
# 'Python'字符串中输出h以外的字母
for letter in 'Python':
if letter == 'h':
continue
print('当前字母 :', letter)
输出:
当前字母 : P
当前字母 : y
当前字母 : t
当前字母 : o
当前字母 : n
for ... else 语句( while... else 同理)
在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,也就是所有元素都遍历了,while … else 也是一样。
for i in range(10):
if i % 2 != 0:
break
print(i)
else:
print('循环正常结束')
双重循环
# 输出乘法口诀
for i in range(1, 10):
for j in range(1, i+1):
print('{}*{}={}'.format(j, i, j*i), end='\t')
print()
'''
1. 编写程序实现,在程序中预设一个0~9之间的整数,让用户通过键盘输入所猜的数,如果大于预设的数,显示“遗憾,太大了”,
小于预设的数,显示“遗憾,太小了”,如此循环,直至猜中该数,显示“预测N次,你猜中了!”,其中N是用户输入数字的次数。
'''
k = 6
N = 0
while True:
num = int(input('请输出一个0-9之间的整数:'))
N += 1
if num > k:
print('遗憾,太大了')
elif num < k:
print('遗憾,太小了')
elif num == k:
print('预测{}次,你猜中了!'.format(N))
break
"""
2.编写程序实现,用户从键盘输入一行字符,编写一个程序,统计并输出其中英文字符,数字,空格和其他字符的个数。
"""
sp_num = 0
dig_num = 0
al_num = 0
oth_num = 0
msg = input('请从键盘输入一行字符:')
for i in msg:
if i.isspace():
sp_num += 1
elif i.isdigit():
dig_num += 1
elif i.isalpha():
al_num += 1
else:
oth_num += 1
print('空格字符数量为:{},数字字符数量为:{},英文字符数量为:{},其它字符数量为:{}'.format(sp_num, dig_num, al_num, oth_num))
"""
3.使用print函数和循环结构输出如下由*组成的金字塔(可以尝试根据层数动态输出)
*
***
*****
*******
"""
n = int(input('输入金字塔层数:'))
for i in range(1, n+1):
print(' '*(n-i) + '*' * (2*i-1))
'''
4.使用print函数和循环结构输出如下由*组成的空心的金字塔图形
*
* *
* *
*******
'''
n = int(input('输入空心金字塔层数:'))
for i in range(1, n+1):
if i == 1:
print(' ' * (n - i) + '*')
elif i == n:
print(' ' * (n - i) + '*' * (2 * i - 1))
else:
print(' '*(n-i) + '*' + ' '*(2*i-3) + '*')
'''
5.使用print函数和循环结构输出如下由*组成的菱形
*
***
*****
*******
*****
***
*
'''
n = 4
for i in range(1, n+1):
print(' '*(n-i) + '*' * (2*i-1))
for i in range(n-1):
print(' ' * (i+1) + '*'*(n+1-2*i))
6、打印乘法口诀
for i in range(1, 10):
for j in range(1, i+1):
print('{}*{}={}'.format(j, i, j*i), end='\t')
print()
程序异常处理
程序中的错误,语法错误。
运行时错误,runtime error,逻辑有问题,业务发生改变
作用:
- 让用户有更好的体验
- 加强代码的健壮性
try - except
except:翻译为“只是”
语法使用一
try:
代码块0
except 异常类型1:
语句块1
except 异常类型2:
语句块2
执行代码块0,如果出现异常类型1就执行语块1,如果出现异常类型2就执行语块2,以此类推
import builtins
print(dir(builtins))
输出的内容中以大写字母开头的都是异常类型
语法使用二(最常用)
try:
代码块1
except Exception as e:
代码块2
Exception:表示是所有的异常,如果是写ValueError就只会捕捉ValueError的异常类型,出现其他异常照样会报错;
as e:给Exception取别名
print(e)即可把异常类型打印出来,这样就可以看到报错的原因了
语法使用三
try:
代码块1
except:
代码块2
此方法实际上是与语法使用二中的简化,也会捕捉所有异常,但是此方法即无法获取异常的类型,没有方法二中的实用
语法使用四
终极版的try
try:
语句块0
except 异常类型1:
语句块1
except 异常类型2:
语句块2
except 异常类型3:
语句块3
else:
语句块4
finally:
语句块5
image.png
尝试去执行语句块0,出现对应的异常类型就执行对应的语句块,否则就执行else的语句块,最终执行finally语句块
没有发生异常,就会执行else后面的代码块,不管发生异常与否,finally语句后的代码块一定要执行
例子:
while True:
score = input('请输入你的成绩>>>:')
try:
# 转换类型
score = float(score)
# 判断
if score < 40:
print('等级:E')
elif 40 <= score < 60:
print('等级:D')
elif 60 <= score < 75:
print('等级:C')
elif 75 <= score < 85:
print('等级:B')
else:
print('等级:A')
except Exception as e:
print(e)
print('请输入正确分数')
if score == '退出':
break