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'>

 

posted @ 2024-07-24 19:10  hbutmeng  阅读(2)  评论(0编辑  收藏  举报