異常處理與推導式

随机昵称yi發表於2024-05-16

異常處理

【一】什麼是異常

異常就是程式在執行當中遇到的報錯

為了程式的健壯性 要捕獲異常後進行處理

斷掉程式 / 重啟程式 / 進入指定處理流程

【二】捕獲異常

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}

相關文章