異常處理
【一】什麼是異常
異常就是程式在執行當中遇到的報錯
為了程式的健壯性 要捕獲異常後進行處理
斷掉程式 / 重啟程式 / 進入指定處理流程
【二】捕獲異常
if 捕獲不到異常,要用python自帶的捕獲語句
try:...
except:...
【三】異常捕獲詳細
對程式碼熟悉,能確保程式碼報錯是哪個
【1】指定捕獲的異常
ZeroDivisionError
try:
print(int('a'))
# 異常捕獲的 try語法 要和 except 搭配
# 值錯誤
except ValueError:
print(f"當前報錯了! {ValueError}")
try:
print(1 / 0)
except ZeroDivisionError:
print(f"除數不能為0")
【2】捕獲多個異常
try:
# print(int('a'))
print(1 / 0)
except (ValueError, ZeroDivisionError) as e:
print(e)
【3】多分支捕獲異常
try:
# print(int('a'))
print(1 / 0)
except ValueError:
print(ValueError)
except ZeroDivisionError:
print(ZeroDivisionError)
【四】捕獲基本異常
捕獲基本異常
只要是異常就捕獲
try:
# print(int("a"))
print(1/0)
except Exception as e:
print(e)
【五】主動觸發異常
達到某個條件時主動觸發異常
使用raise關鍵字主動丟擲我們想要的異常資訊
for i in range(10):
if i == 6:
# 主動報錯,這裡不能為 6
# raise 錯誤型別
raise ValueError('不能為 6')
【六】斷言
# assert關鍵字: 達到某個為真的條件丟擲異常資訊
# assert 條件,
for i in range(0, 10):
assert i == 6, '不能為6'
【七】異常捕獲語法擴充
try:
# 可能會發生報錯的程式碼
int('a')
except Exception as e:
# 一旦上面程式碼丟擲異常就會被捕獲
print(e)
else:
# 上面程式碼沒有異常,就走else
print("11")
finally:
# 無論有沒有異常都會執行的程式碼
print("1324")
invalid literal for int() with base 10: 'a'
1324
列表、字典推導式
【一】固定語法
【1】 列表推導式
[表示式 for i in 列表/字典/可迭代型別]
[字串切分/去除空格 for i in 列表/字典/可迭代型別]
[if判斷 for i in 列表/字典/可迭代型別]
【2】字典推導式
{key:value for key in 可迭代型別 for value in 可迭代型別}
【3】三元運算子
為真時的結果 if 返回布林值的判斷條件 else 為假時的結果
【二】列表推導式
【1】直接使用range關鍵字構建列表
num_list = [i for i in range(10)]
print(num_list)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
相當於
num_list = []
for i in range(10):
num_list.append(i)
print(num_list)
【2】遍歷列表
name_list = ['qwer','123']
# 讓每個人名前加 11_10
name_list = ['11_' + i for i in name_list]
print(name_list)
【3】對每個元素進行去除空格
with open('11.txt','r',encoding='utf8') as file:
print(file.readlines())
['qwe\n', '111\n', 'sada']
with open('11.txt','r',encoding='utf8') as file:
list = [line.strip() for line in file]
print(list)
['qwe', '111', 'sada']
第一次輸出帶換行符,第二次輸出換行符被去除了
【4】利用一個元素生成新的列表
放列表
list = [[num , num * num] for num in [i for i in range(10)]]
print(list)
[[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]
放元組
list = [{i : i*i} for i in [i for i in range(10)]]
print(list)
[{0: 0}, {1: 1}, {2: 4}, {3: 9}, {4: 16}, {5: 25}, {6: 36}, {7: 49}, {8: 64}, {9: 81}]
【5】行列轉換
test = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
list_new = [[row[i] for row in test] for i in range(len(test[0]))]
print(list_new)
num_list = []
for i in range(len(test[0])):
num_list_ = []
for row in test:
num_list_.append(row[i])
num_list.append(num_list_)
print(num_list)
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
【6】加入條件進行過濾
est = [1, 2, 3, 4, 5, 6]
list_one = [x for x in test if x % 2 == 0]
print(list_one)
# [2, 4, 6]
num_one = []
for x in test:
if x % 2 == 0:
num_one.append(x)
print(f'num_one {num_one}')
list_two = list(filter(lambda x: x % 2 == 0, test))
print(list_two)
[2, 4, 6]
num_one [2, 4, 6]
[2, 4, 6]
【三】字典推導式
user_data_dict = {}
with open('11.txt','r',encoding='utf8') as fp:
for line in fp:
username,password = line.strip().split('|')
user_data_dict[username] = password
print(user_data_dict)
with open('11.txt', 'r', encoding='utf8') as fp:
user_data_dict = {line.strip().split('|')[0]: line.strip().split('|')[1] for line in fp}
print(user_data_dict)
{'q': 'we', '11': '1', 'sa': 'a'}
{'q': 'we', '11': '1', 'sa': 'a'}
【四】元組生成式
生成的是生成器物件
num_tuple = (i for i in range(10))
print(num_tuple)
<generator object <genexpr> at 0x000002030DC48430>
要強轉一下
print(tuple(num_tuple))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
【五】集合推導式
# 類似 列表推導式
set_num = {i for i in range(10)}
print(set_num)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}