10. 异常捕获、生成式
1. 异常捕获
1.1 异常分类
内建异常:Python解释器自带的异常捕获机制
自定义异常:主动抛出的异常
1.2 如何主动抛出异常
关键字 raise
raise [Exception [, args [, traceback]]]
1.3 主动捕获异常
(1)不带异常信息
(2)只有单一的异常信息
(3)捕获多个异常信息
(4)捕获所有异常信息
Exception 捕获所有异常类型
当代码没有抛出异常,结束正常代码会自动执行else语句
try:
a = 1 + 2
except Exception as c:
# 在处理异常时可以通过变量c查看当前的异常类型和异常信息
print(f'程序异常{c}')
else:
print(6)
finally:
print(666)
# 6
# 666
代码抛出或不抛出异常都会执行finally语句
try:
a = 1 + n
except Exception as c:
# 在处理异常时可以通过变量c查看当前的异常类型和异常信息
print(f'程序异常{c}')
else:
print(6)
finally:
print(666)
# 程序异常name 'n' is not defined
# 666
1.4 assert断言
如果断言的条件为False,则会触发异常
语法:
assert condition, message
condition:断言的条件,如果为False,则触发异常。
message:可选参数,用于指定触发异常时的错误消息。
2. 生成式
2.1 列表推导式
[表达式 for 变量名 in 可迭代类型 if 条件]
列表推导式举例:
(1)构建一个列表
a = []
for i in range(10):
a.append(i)
print(a) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [j for j in range(10)]
print(b) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
(2)生成一个从1~9的数字的平方的列表
c = [i**2 for i in range(1, 10)]
print(c) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
(3)嵌套循环
# 第一个列表中的每个元素,逐个乘以第二个列表中的所有元素
x = [1, 2, 3]
y = [4, 5, 6]
z = []
for i in x:
for j in y:
res = i * j
z.append(res)
print(z) # [4, 5, 6, 8, 10, 12, 12, 15, 18]
# 使用列表推导式改写
a = [i * j for i in x for j in y]
print(a) # [4, 5, 6, 8, 10, 12, 12, 15, 18]
# 列表对应相同索引位置上的数相乘
a = [3, 6, 9]
b = [3, 6, 9]
c = [a[i] * b[i] for i in range(len(a))]
print(c) # [9, 36, 81]
(4)行列转换
a = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]]
new_list = []
# 第一次取第一列,第二次取第二列,第三次取第三列,第四次取第四列
for i in range(len(a[0])): # 1.开始外圈循环,外圈1次,内圈3次
new_list_inner = [] # 3.每次开始外圈循环时,该列表为空,接收第i次外圈循环原来小列表中索引为i的值组成的小列表
for j in a:
new_list_inner.append(j[i])
# 2.内圈循环
# 第1次外圈循环 列表1 列表2 列表3的0号索引值加到新列表中
# 第2次外圈循环 列表1 列表2 列表3的1号索引值加到新列表中
# 第3次外圈循环 列表1 列表2 列表3的2号索引值加到新列表中
# 第4次外圈循环 列表1 列表2 列表4的3号索引值加到新列表中
new_list.append(new_list_inner) # 4.将i次外圈循环产生的i个小列表作为元素添加到一个大列表中
print(new_list)
print([[j[i] for j in a] for i in range(len(a[0]))])
# [[1, 5, 9],
# [2, 6, 10],
# [3, 7, 11],
# [4, 8, 12]]
a = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]]
# 第一次取第一列,第二次取第二列,第三次取第三列,第四次取第四列
new_l_list = []
for i in range(len(a)[0]): # i = 0 1 2 3
new_s_list = []
for j in a:
new_s_list.append(j[i]) # 第一次循环将原来第1,2,3个小列表中的0号索引取出来并产生新的小列表
new_l_list.append(new_s_list) # 每一次循环都将产生的小列表添加到新的大列表中
print(new_l_list)
# [[1, 5, 9],
# [2, 6, 10],
# [3, 7, 11],
# [4, 8, 12]]
(5)加入判断条件
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
b = []
for i in a:
if i % 3 == 0:
b.append(i)
print(b) # [3, 6, 9]
print([i for i in a if i % 3 == 0]) # [3, 6, 9]
2.2 字典生成式
{k:v for k in 可迭代对象1:for v in可迭代对象2 if 表达式}
tuple_list = [('name', 'messi'), ('age', 37), ('goal', 91), ('club', 'psg')]
a = {}
for i in tuple_list:
# i = ('name', 'messi')
k, v = i
a[k] = v
print(a) # {'name': 'messi', 'age': 37, 'goal': 91, 'club': 'psg'}
print({k: v for k, v in tuple_list})
# {'name': 'messi', 'age': 37, 'goal': 91, 'club': 'psg'}
2.3 元组生成式
a = (i for i in range(10) if i % 3 == 0)
print(a, type(a))
# 生成器对象
# <generator object <genexpr> at 0x0000012BDC3193F0> <class 'generator'>
b = [i for i in range(10) if i % 3 == 0]
print(b, type(b)) # [0, 3, 6, 9] <class 'list'>