💡 含義:程序執行過程中出現的非正常的流程現象
💡 常見異常種類
異常種類 | 含義 |
---|---|
NameError | 使用一個還未被賦值的變量 |
SyntaxError | 代碼不符合python語法規定 |
IndexError | 下標/索引超出範圍 |
ZeroDivisionError | 除數為0 |
KeyError | 字典中不存在這個鍵 |
IOError | 輸入/輸出操作失敗,基本上是無法打開文件(比如要讀的文件不存在) |
AttributeError | 對象沒有這個屬性 |
ValueError | 傳入的值有錯誤 |
TypeError | 類型錯誤,傳入的類型不匹配 |
ImportError | 無法引入模塊或包;基本上是路徑問題或名稱錯誤 |
IndentationError | 縮進錯誤;代碼沒有正確對齊 |
xxxxxxxxxx
print(abc)
# Traceback:異常的追蹤信息,可以追溯到程序異常的具體位置
# XXXError:異常類型,後面包含異常的具體信息
輸出結果:
xxxxxxxxxx
Traceback (most recent call last):
File "/Users/ioichitchao/Documents/Python/PyPractice/py21.py", line 18, in <module>
print(abc)
^^^
NameError: name 'abc' is not defined. Did you mean: 'abs'?
💡
xxxxxxxxxx
try:
不確定是否能夠正常執行的代碼
except:
如果檢測到異常,就執行這個位置的代碼
xxxxxxxxxx
try:
print(abc) # 一般try下面只放一行嘗試執行的代碼
except:
print('這一行代碼有錯誤')
輸出結果:
xxxxxxxxxx
這一行代碼有錯誤
❗ 可以聲明捕獲異常類型,但是遇到其他異常類型時依然會報錯,無法捕獲異常
xxxxxxxxxx
try:
print(abc)
except NameError:
print('這一行代碼有錯誤')
輸出結果:
xxxxxxxxxx
這一行代碼有錯誤
❗ 當要捕獲多個異常類型時,可以把要捕獲的異常類型的外字放在expect後,並以「元組」的形式保存
xxxxxxxxxx
try:
print(abc)
except (TypeError, NameError):
print('這一行代碼有錯誤')
輸出結果:
xxxxxxxxxx
這一行代碼有錯誤
❗ 萬能異常、打印異常回報
xxxxxxxxxx
try:
print(abc)
except Exception as e: # Exception,萬能異常,可以捕獲任意異常類型
# as 相當於取別名,e是變量名,可以自定義,as e相當於把異常信息保存到變量e中去
print('這一行代碼有錯誤')
print(e)
輸出結果:
xxxxxxxxxx
這一行代碼有錯誤
name 'abc' is not defined
💡
xxxxxxxxxx
try:
可能引發異常現象的代碼
except:
出現異常現象的處理代碼
else:
沒有捕獲到異常執行的代碼
xxxxxxxxxx
try:
print(abc)
except Exception as e:
print('這一行代碼有錯誤')
else:
print('這裡是else的代碼')
輸出結果:
xxxxxxxxxx
這一行代碼有錯誤
💡 try和else一起執行,except單獨執行
xxxxxxxxxx
st = '12345'
try:
print(st[4])
except Exception as e:
print('超出下標範圍')
else:
print('try裡面的代碼沒有問題')
輸出結果:
xxxxxxxxxx
5
try裡面的代碼沒有問題
💡
xxxxxxxxxx
try:
可能引發異常現象的代碼
except:
出現異常現象的處理代碼
else:
未出現異常現象的處理代碼
finally:
try代碼塊結束後運行的代碼(表示無論是否檢測到異常,都會執行裡面的代碼)
xxxxxxxxxx
try:
print(abc)
except Exception:
print('這一行代碼有錯誤')
else:
print('沒有異常')
finally:
print('不管怎麼樣我都會被執行')
輸出結果:
xxxxxxxxxx
這一行代碼有錯誤
不管怎麼樣我都會被執行
❗ 可以單獨使用try…finally,也可以配合except等使用
💡
創建一個Exception('xxx')對象,xxx---異常提示信息
raise抛出這個對象(異常對象)
xxxxxxxxxx
raise Exception('這是一個異常')
def func1():
raise Exception('這是一個異常')
# print('哈哈哈,笑死我了!') #執行了raise語法,後面的語法不會繼續往下執行
func1()
輸出結果:
xxxxxxxxxx
Traceback (most recent call last):
File "/Users/ioichitchao/Documents/Python/PyPractice/py22.py", line 6, in <module>
raise Exception('這是一個異常')
Exception: 這是一個異常
案例:密度長度不足就報異常
分析:首先用戶要輸入密碼,判斷輸入長度是否大於等於6,如果輸入長度不足6位,就報錯,即抛出自定義異常,並捕獲該異常
xxxxxxxxxx
def login():
pw = input('請輸入你的密碼:')
if len(pw) >= 6:
return '密碼輸入成功'
raise Exception ('長度不足六位,密碼輸入失敗')
try:
print(login())
except Exception as e:
print(e)
輸出結果:
xxxxxxxxxx
請輸入你的密碼:123455
密碼輸入成功
💡 含義:一個py文件就是一個模塊,即導入一個模塊本質上就是執行一個py文件
💡 分類:
名稱 | 描述 | 注意⚠️ |
---|---|---|
內置模塊 | 例子:random、time、os、logging。直接導入即可使用 | |
第三方模塊 | 下載cmd窗口輸入pip stall 模塊名(Mac要查一下) | |
自定義模塊 | 即自己在項目中定義的模塊 | 注意:命名要遵循標識符規定以及變量的命名規範,並且不要與內置模塊起衝突 |
💡 語法:
xxxxxxxxxx
# 導入模塊:
import 模塊名
import 模塊名1, 模塊名2 # 盡量單獨導入
# 調用功能:
模塊名.功能名
xxxxxxxxxx
import pytest
# 調用pytest模塊中的name變量
print(pytest.name)
# 調用pytest模塊中的func1
pytest.func1()
👉🏻 需要有一個pytest.py文件,且填充以下內容
xxxxxxxxxx
print('這是pytest模塊')
# 變量
name = 'Antonio'
# 函數
def func1():
print('這是test模塊中的func1()')
輸出結果:
xxxxxxxxxx
這是pytest模塊
Antonio
這是test模塊中的func1()
💡 語法:
xxxxxxxxxx
# 從模塊中導入指定的部分
from 模塊名 import 功能1, 功能2
💡 調入功能時直接輸入功能即可,不需要再次添加模塊名
xxxxxxxxxx
from pytest import func2, name
func2()
print(name)
# func1() # 沒有導入就會報錯
👉🏻 需要有一個pytest.py文件,且填充以下內容
xxxxxxxxxx
print('這是pytest模塊')
# 變量
name = 'Antonio'
# 函數
def func1():
print('這是test模塊中的func1()')
def func2():
print('這是test模塊中的func2()')
輸出結果:
xxxxxxxxxx
這是pytest模塊
這是test模塊中的func2()
Antonio
💡 語法:
xxxxxxxxxx
from 模塊名 import *
# 把模塊中的所有內容全部導入
# 符號*就是全部的意思
xxxxxxxxxx
from pytest import *
func1()
func2()
print(name)
👉🏻 需要有一個pytest.py文件,且填充以下內容
xxxxxxxxxx
print('這是pytest模塊')
# 變量
name = 'Antonio'
# 函數
def func1():
print('這是test模塊中的func1()')
def func2():
print('這是test模塊中的func2()')
輸出結果:
xxxxxxxxxx
這是pytest模塊
這是test模塊中的func1()
這是test模塊中的func2()
Antonio
❗ 不建議過多使用from…import…聲明,因為在命名重複時很容易報錯
遇到同名的變量、函數時,調用到的會是最後導入的變量、函數
💡 語法:
xxxxxxxxxx
import 模塊名 as 別名
xxxxxxxxxx
import pytest as pt # 給模塊起別名
pt.func1() # 調用模塊中的func()
print(pt.name) # 打印模塊中的name變量
👉🏻 需要有一個pytest.py文件,且填充以下內容
xxxxxxxxxx
print('這是pytest模塊')
# 變量
name = 'Antonio'
# 函數
def func1():
print('這是test模塊中的func1()')
def func2():
print('這是test模塊中的func2()')
輸出結果:
xxxxxxxxxx
這是pytest模塊
這是test模塊中的func1()
Antonio
💡 語法:
xxxxxxxxxx
from 模塊名 import 功能 as 別名
xxxxxxxxxx
from pytest import func1 as f, name, func2 as g
f()
print(name)
g()
👉🏻 需要有一個pytest.py文件,且填充以下內容
xxxxxxxxxx
print('這是pytest模塊')
# 變量
name = 'Antonio'
# 函數
def func1():
print('這是test模塊中的func1()')
def func2():
print('這是test模塊中的func2()')
輸出結果:
xxxxxxxxxx
這是pytest模塊
這是test模塊中的func1()
Antonio
這是test模塊中的func2()
❗ 注意:導入多個功能使用,隔開,將功能與功能隔開,後面的功能也可以取別名
__name__
💡 語法:
xxxxxxxxxx
if __name__ == '__main__':
作用:用來控制py文件在不同應用場景執行不同的邏輯
__name__
xxxxxxxxxx
import pytest2
pytest2.test()
👉🏻 需要有一個pytest2.py文件,且填充以下內容
xxxxxxxxxx
print('這是pytest2作為模塊時*會*顯示的內容')
def test():
print('哈哈哈')
if __name__ == '__main__': # 被當作模塊導入時,下面的代碼不會被顯示出來
print('這是pytest2作為模塊時*不會*顯示的內容')
輸出結果:
xxxxxxxxxx
這是pytest2作為模塊時*會*顯示的內容
哈哈哈
❗ 注意:當被當作模塊導入時,__name__ == '__main__'
,下面的代碼不會被顯示出來
__init__.py
的文件夾__init__.py
文件的代碼xxxxxxxxxx
import pack_01
👉🏻 需要有一個pack_01包,且在其中的__init__.py
填充以下內容
xxxxxxxxxx
print('這是__init__.py')
輸出結果:
xxxxxxxxxx
這是__init__.py
xxxxxxxxxx
from pack_01 import register
register.reg()
👉🏻 需要有一個pack_01包,且在其中的register.py填充以下內容
xxxxxxxxxx
def reg():
print('這是注冊函數')
輸出結果:
xxxxxxxxxx
這是__init__.py
這是注冊函數
xxxxxxxxxx
from pack_01 import register
👉🏻 需要有一個pack_01包,且在其中的register.py填充以下內容
xxxxxxxxxx
def reg():
print('這是注冊函數')
並在__init__.py
填充以下內容
xxxxxxxxxx
print('這是__init__.py')
# 不建議在init文件中寫大量代碼
# 主要作用:導入這個包的其他模塊
from pack_01 import register
register.reg()
輸出結果:
xxxxxxxxxx
這是__init__.py
這是注冊函數
__all__
:本質上是一個列表,列表裡面的元素就代表要導入的模塊xxxxxxxxxx
from pack_01 import *
register.reg()
👉🏻 需要有一個pack_01包,且在其中的register.py填充以下內容
xxxxxxxxxx
def reg():
print('這是注冊函數')
並在__init__.py
填充以下內容
xxxxxxxxxx
__all__ = ['register'] # 相當於導入中括號裡面定義的模塊
輸出結果:
xxxxxxxxxx
這是注冊函數
xxxxxxxxxx
from pack_01 import *
register.reg()
login.login()
👉🏻 需要有一個pack_01包,且在其中的register.py填充以下內容
xxxxxxxxxx
def reg():
print('這是注冊函數')
在login.py填充以下內容
xxxxxxxxxx
def login():
print('這是一個登錄函數')
並在__init__.py
填充以下內容
xxxxxxxxxx
__all__ = ['register', 'login'] # 相當於導入中括號裡面定義的模塊
輸出結果:
xxxxxxxxxx
這是注冊函數
這是一個登錄函數
目的地 | 超連結 |
---|---|
首頁 | 返回主頁 |
Python學習 | Python學習 |
上一篇 | 10 - 函數進階 |
下一篇 | 12 - 閉包&裝飾器 |