Python人工智能從入門到精通python
補充:包的相對導入 只對後兩種導入方式有用 前兩次改進的學生管理系統在20課中 已補充app
異常(基礎)except:
什麼是錯誤:
是指因爲邏輯或語法等導程序沒法正常執行的問題
什麼是異常:
是程序出錯的標識符的一種狀態
當異常發時 程序不會再向下執行,而轉去調用此函數的地方
待處理此錯誤並恢復爲正常狀態
異常的做用:
用做信號, 通知上層調用者有錯誤產生須要處理
try 語句:
兩種語法:
ry-except語句(接受異常通知)
try-finally語句
try-except 語法 :
try:
可能觸發異常的語句
except 錯誤類型1[as 變量1]:
異常處理語句2
except 錯誤類型2[as 變量2]:
異常處理語句2
except (錯誤類型3, 錯誤類型4,...)[as 變量3]:
異常處理語句3
......
except:
異常處理語句(其餘)(匹配全部類型錯誤)
else:
未發生異常語句(能夠沒有此語句 沒有發成異常時調用)
finlly:
最終語句
做用:
嘗試捕獲異常, 將程序由異常狀態轉爲正常狀態並正常執行函數
說明:ui
1. as 子句是用於綁定錯誤對象的變量,能夠省略
2. except 子句能夠有一個或多個,但至少要有一個
3. else 子句最多只能有一個,也能夠省略不寫
4. finally 子句最多只能有一個,也能夠省略不寫
5. else 子句將在try沒有出現異常時執行
6. finally子句的語句在任何狀況下都會被執行編碼
示例:人工智能
# 此示例示意用try-except 語句捕獲異常並作出相應的處理 def div_apple(n): print("%d個蘋果您想分給幾我的?" % n) s = input("請輸入人數: ") cnt = int(s) # <- 此處可能觸發ValueError類型錯誤 result = n / cnt # <- 此處可能觸發ZeroDivisitionError錯誤 print("每一個人分了%d個蘋果" % result) try: print("開始分蘋果") div_apple(10) # 可能觸發異常的調用 print("結束分蘋果") except ValueError: print("發生成值錯誤,已處理並轉爲正常狀態!") except ZeroDivisionError: print("發生了被零除的錯誤,程序已轉爲正常狀態") print("程序正常執行並徹底任務,退出程序")
try-finally語法:
try:
可能觸發異常的語句
finally:
最終語句
說明:
1.finally子句不能夠省略
2.必定不存在except子句
做用:
一般try-finally語句來作觸發異常時必需要處理的事情
不管異常是否發生, finally子句必定會被執行
注意:
try-finally 語句不會改變程序的(正常/異常)狀態spa
示例:操作系統
# 如下以 煎蛋爲例示意 try-finally語句的用法 # 必需要作的事情是,關閉天燃氣 def fry_egg(): print("打開天燃氣點燃...") try: count = int(input("請輸入雞蛋個數: ")) print("完成煎雞蛋,共煎了%d個雞蛋" % count) finally: print("關閉天燃氣") fry_egg()
raise 語句:(發起異常通知)
做用:
觸發一個錯誤, 讓程序進入異常狀態
語法:
raise 異常類型
或
raise 異常對
實例:code
def make_exception(): print("函數開始") # 發出一個ValueError類型的錯誤通知給調用者 # raise ValueError err = ValueError("這是自定義的錯誤數據") raise err # 用 err觸發一個異常通知 print("函數結束") try: make_exception() print("make_exception調用結束!") except ValueError as e: print("接收到ValueError類型的異常通知") print("錯誤對象是:", e)
assert 斷言語句:
語法:
assert 真值表達式, 錯誤數據(一般是字符串)
做用:
當真值表達式爲False時, 用錯誤數據建立一個AssertionError
類型的錯誤, 並進入異常狀態
等同於:
if 真值表達式 == false
raise AssertrtionError(錯誤數據)
實例:對象
def get_score(): s = int(input("請輸入學生成績: ")) assert 0 <= s <= 100, '成績超出範圍' # if not (0 <= s <= 100): # raise AssertionError('成績超出範圍') return s try: score = get_score() except AssertionError as err: print("錯誤數據是:", err) print('獲取成績失敗') score = 0 print("學生的成績爲:", score)
小結:
異常處理語句(4條):
try-except 語句:
用於接受異常通知, 捕獲異常
try-finally 語句:
執行必須執行的語句
raise 語句:
發送異常通知, 並進入異常狀態
assert 語句:
根據條件選着性的發送 AssertionError類型的異常通知
爲何要處理異常機制:
在程序調用層數比較深的時候, 向主調用函數傳遞錯誤信息 須要層層return返回
比較麻煩, 用異常處理機制能夠較簡單的傳遞錯誤信息
錯誤類型 | 說明 |
---|---|
如下內容必講 | |
ZeroDivisionError | 除(或取模)零 (全部數據類型) |
ValueError | 傳入無效的參數 |
AssertionError | 斷言語句失敗 |
StopIteration | 迭代器沒有更多的值 |
IndexError | 序列中沒有此索引(index) |
IndentationError | 縮進錯誤 |
OSError | 輸入/輸出操做失敗 |
ImportError | 導入模塊/對象失敗 |
NameError | 未聲明/初始化對象 (沒有屬性) |
AttributeError | 對象沒有這個屬性 |
GeneratorExit | 生成器(generator)發生異常來通知退出 |
TypeError | 對類型無效的操做 |
KeyboardInterrupt | 用戶中斷執行(一般是輸入^C) |
OverflowError | 數值運算超出最大限制 |
FloatingPointError | 浮點計算錯誤 |
BaseException | 全部異常的基類 |
SystemExit | 解釋器請求退出 |
Exception | 常規錯誤的基類 |
StandardError | 全部的內建標準異常的基類 |
ArithmeticError | 全部數值計算錯誤的基類 |
EOFError | 沒有內建輸入,到達EOF 標記 |
EnvironmentError | 操做系統錯誤的基類 |
WindowsError | 系統調用失敗 |
LookupError | 無效數據查詢的基類 |
KeyError | 映射中沒有這個鍵 |
MemoryError | 內存溢出錯誤(對於Python 解釋器不是致命的) |
UnboundLocalError | 訪問未初始化的本地變量 |
ReferenceError | 弱引用(Weak reference)試圖訪問已經垃圾回收了的對象 |
RuntimeError | 通常的運行時錯誤 |
NotImplementedError | 還沒有實現的方法 |
SyntaxError Python | 語法錯誤 |
TabError | Tab 和空格混用 |
SystemError | 通常的解釋器系統錯誤 |
UnicodeError | Unicode 相關的錯誤 |
UnicodeDecodeError | Unicode 解碼時的錯誤 |
UnicodeEncodeError | Unicode 編碼時錯誤 |
UnicodeTranslateError | Unicode 轉換時錯誤 |
如下爲警告類型 | |
Warning | 警告的基類 |
DeprecationWarning | 關於被棄用的特徵的警告 |
FutureWarning | 關於構造未來語義會有改變的警告 |
OverflowWarning | 舊的關於自動提高爲長整型(long)的警告 |
PendingDeprecationWarning | 關於特性將會被廢棄的警告 |
RuntimeWarning | 可疑的運行時行爲(runtime behavior)的警告 |
SyntaxWarning | 可疑的語法的警告 |
UserWarning | 用戶代碼生成的警告 |
詳見:help(builtins) |
練習:
寫一個函數 get_score() 來獲取學生成績,
要求用戶輸入 1~100的整數,輸果輸入出現異常,返此函數返回0,
不然返回用戶輸入的成績
示例:
def get_score():
...
score = get_score()
print("學生的成績是:", score)
練習:
1. 一個球從100米高空落下 ,每次落地後反彈高度是原高度的一半, 在落下
1)寫程序算出皮球在第10次落地後反彈高度是多高?
2)打印出球共通過多少米的路程
答案:
def ball(n, m): L = [100] while True: if n == 0: print("最後彈起的高度是%s米" % s) break s = m * 0.5 m = s L.append(s + m) n -= 1 return L print("10次共經歷了%s米的路程" % sum(ball(10, 100)))
2. 分解質因數, 輸入一個整數, 分解質因數 ,
如:
輸入 90
則打印:
「90=2*3*3*5」
(質因數是指最小能被原數整除的素數 不包括1)
答案:
def m(n): ret = [] while n > 1: for i in range(n): k = i + 2 if n % k == 0: ret.append(k) n = int(n / k) break return ret print(m(90))
3. 修改原學生信息管理程序,加入異常處理語句,讓程序在任何狀況下都可以按邏輯正常執行. 例如: 輸入成績和年齡時,若是用戶輸入非法字符串也不會致使程序崩潰