異常
當檢測到一個錯誤時,Python解釋器就無法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的“異常”, 也就是我們常說的BUG
例如:以r
方式打開一個不存在的文件。
f = open(‘python1.txt’,‘r’,encoding=‘utf-8’)
當我們的程序遇到了BUG, 那么接下來有兩種情況:
- 整個程序因為一個BUG停止運行
- 對BUG進行提醒, 整個程序繼續運行
在之前的學習中, 我們所有的程序遇到BUG就會出現①的這種情況, 也就是整個程序直接奔潰。
但是在真實工作中, 我們肯定不能因為一個小的BUG就讓整個程序全部奔潰, 也就是我們希望的是達到② 的這種情況那這里我們就需要使用到捕獲異常
捕獲異常的作用在于:提前假設某處會出現異常,做好提前準備,當真的出現異常的時候,可以有后續手段。
捕獲異常的基本語句
try:可能發生錯誤的代碼
except:如果出現異常執行的代碼例如:
try:f = open('python1.txt','r',encoding='utf-8')
except:f = open('python1.txt','w',encoding='utf-8try:print(name)
except NameError as e:print('name變量名稱未定義錯誤')
注意:
● 如果嘗試執行的代碼的異常類型和要捕獲的異常類型不一致,則無法捕獲異常。
● 一般try下方只放一行嘗試執行的代碼。
當捕獲多個異常時,可以把要捕獲的異常類型的名字,放到except 后,并使用元組的方式進行書寫。
try:print(1/0)
except (NameError, ZeroDivisionError):print('ZeroDivision錯誤...')
執行結果:
異常 else
else表示的是如果沒有異常要執行的代碼。
try:print(1)
except Exception as e:print(e)
else:print('我是else,是沒有異常的時候執行的代碼')
異常的 finally
finally表示的是無論是否異常都要執行的代碼,例如關閉文件。
try:f = open('python.txt', 'r')
except Exception as e:f = open('python.txt', 'w')
else:print('沒有異常,真開心')
finally:f.close()
異常的傳遞
異常是具有傳遞性的
當函數func01中發生異常, 并且沒有捕獲處理這個異常的時候, 異常會傳遞到函數func02, 當func02也沒有捕獲處理這個異常的時候main函數會捕獲這個異常, 這就是異常的傳遞性.
當所有函數都沒有捕獲異常的時候, 程序就會報錯
利用異常具有傳遞性的特點, 當我們想要保證程序不會因為異常崩潰的時候, 就可以在main函數中設置異常捕獲, 由于無論在整個程序哪里發生異常, 最終都會傳遞到main函數中, 這樣就可以確保所有的異常都會被捕獲。
Python 模塊
Python 模塊(Module),是一個 Python 文件,以 .py 結尾. 模塊能定義函數,類和變量,模塊里也能包含可執行的代碼。
模塊的作用: python中有很多各種不同的模塊, 每一個模塊都可以幫助我們快速的實現一些功能, 比如實現和時間相關的功能就可以使用time模塊我們可以認為一個模塊就是一個工具包, 每一個工具包中都有各種不同的工具供我們使用進而實現各種不同的功能。
模塊的導入方式
模塊在使用前需要先導入 導入的語法如下:
常用的組合形式如:
● import 模塊名
● from 模塊名 import 類、變量、方法等
● from 模塊名 import *
● import 模塊名 as 別名
● from 模塊名 import 功能名 as 別名
import 某塊名
import 模塊名
import 模塊名1,模塊名2模塊名.功能名()例如:
# 導入時間模塊
import time
print("開始")
# 讓程序睡眠1秒(阻塞)
time.sleep(1)
print("結束")
from 模塊名 import 功能名
from 模塊名 import 功能名功能名()例如:
# 導入時間模塊中的sleep方法
from time import sleep
print("開始")
# 讓程序睡眠1秒(阻塞)
sleep(1)
print("結束")
from 模塊名 import *
from 模塊名 import *功能名()例如:
# 導入時間模塊中所有的方法
from time import *
print("開始")
# 讓程序睡眠1秒(阻塞)
sleep(1)
print("結束")
as定義別名
# 模塊定義別名
import 模塊名 as 別名# 功能定義別名
from 模塊名 import 功能 as 別名例如:
# 模塊別名
import time as tt
tt.sleep(2)
print('hello')# 功能別名
from time import sleep as sl
sl(2)
print('hello')
制作自定義模塊
Python中已經幫我們實現了很多的模塊. 不過有時候我們需要一些個性化的模塊, 這里就可以通過自定義模塊實現, 也就是自己制作一個模塊。
例如:新建一個Python文件,命名為my_module1.py,并定義test函數
注意: 每個Python文件都可以作為一個模塊,模塊的名字就是文件的名字. 也就是說自定義模塊名必須要符合標識符命名規則。
在實際開發中,當一個開發人員編寫完一個模塊后,為了讓模塊能夠在項目中達到想要的效果,這個開發人員會自行在py文件中添加一些測試信息,例如,在my_module1.py文件中添加測試代碼
test(1,1)
def test(a, b):print(a + b)test(1, 1)
問題:
此時,無論是當前文件,還是其他已經導入了該模塊的文件,在運行的時候都會自動執行test
函數的調用
解決方案:
def test(a, b):print(a + b)# 只在當前文件中調用該函數,其他導入的文件內不符合該條件,則不執行test函數調用
if __name__ == '__main__':test (1, 1)
注意:
當導入多個模塊的時候,且模塊內有同名功能. 當調用這個同名功能的時候,調用到的是后面導入的模塊的功能
all
如果一個模塊文件中有__all__
變量,當使用from xxx import *
導入時,只能導入這個列表中的元素
Python 包
從物理上看,包就是一個文件夾,在該文件夾下包含了一個 init.py 文件,該文件夾可用于包含多個模塊文件從邏輯上看,包的本質依然是模塊
包的作用:當我們的模塊文件越來越多時,包可以幫助我們管理這些模塊, 包的作用就是包含多個模塊,但包的本質依然是模塊
創建步驟
- 新建包
my_package
- 新建包內模塊:
my_module1
和my_module2
- 模塊內代碼如下
![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/f39a67b57bed4042af22bc4e8bd5d6e1.png
導入包
方式一:
import 包名.模塊名
包名.模塊名.目標
方式二:
from 包名 import *
模塊名.目標
注意:必須在__init__.py
文件中添加__all__ = []
,控制允許導入的模塊列表
my_module1報紅證明不可用
注意: __all__針對的是 ’ from … import * ‘ 這種方式對 ‘ import xxx ’ 這種方式無效