10. 異常捕獲、生成式

hbutmeng發表於2024-07-24

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

相關文章