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