1. 程式人生 > 實用技巧 >異常和模組from 模組名 import 目標

異常和模組from 模組名 import 目標

異常
目標
瞭解異常
捕獲異常
異常的else
異常finally
異常的傳遞
自定義異常
一. 瞭解異常
當檢測到一個錯誤時,直譯器就無法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的"異常"。

例如:以r方式開啟一個不存在的檔案。

open('test.txt', 'r')
二. 異常的寫法
2.1 語法
try:
可能發生錯誤的程式碼
except:
如果出現異常執行的程式碼
2.2 快速體驗
需求:嘗試以r模式開啟檔案,如果檔案不存在,則以w方式開啟。

try:
f = open('test.txt', 'r')
except:
f = open('test.txt', 'w')
2.3 捕獲指定異常
2.3.1 語法
try:
可能發生錯誤的程式碼
except 異常型別:
如果捕獲到該異常型別執行的程式碼
2.3.2 體驗
try:
print(num)
except NameError:
print('有錯誤')
注意:

如果嘗試執行的程式碼的異常型別和要捕獲的異常型別不一致,則無法捕獲異常。
一般try下方只放一行嘗試執行的程式碼。
2.3.3 捕獲多個指定異常
當捕獲多個異常時,可以把要捕獲的異常型別的名字,放到except 後,並使用元組的方式進行書寫。

try:
print(1/0)

except (NameError, ZeroDivisionError):
print('有錯誤')
2.3.4 捕獲異常描述資訊
try:
print(num)
except (NameError, ZeroDivisionError) as result:
print(result)
2.3.5 捕獲所有異常
Exception是所有程式異常類的父類。

try:
print(num)
except Exception as result:
print(result)
2.4 異常的else
else表示的是如果沒有異常要執行的程式碼。

try:
print(1)
except Exception as result:
print(result)
else:
print('我是else,是沒有異常的時候執行的程式碼')
2.5 異常的finally
finally表示的是無論是否異常都要執行的程式碼,例如關閉檔案。

try:
f = open('test.txt', 'r')
except Exception as result:
f = open('test.txt', 'w')
else:
print('沒有異常,真開心')
finally:
f.close()
三. 異常的傳遞
體驗異常傳遞

需求:

​ 1. 嘗試只讀方式開啟test.txt檔案,如果檔案存在則讀取檔案內容,檔案不存在則提示使用者即可。

​ 2. 讀取內容要求:嘗試迴圈讀取內容,讀取過程中如果檢測到使用者意外終止程式,則except捕獲異常並提示使用者。

import time
try:
f = open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
# 如果在讀取檔案的過程中,產生了異常,那麼就會捕獲到
# 比如 按下了 ctrl+c
print('意外終止了讀取資料')
finally:
f.close()
print('關閉檔案')
except:
print("沒有這個檔案")
四. 自定義異常
在Python中,丟擲自定義異常的語法為raise 異常類物件。

需求:密碼長度不足,則報異常(使用者輸入密碼,如果輸入的長度不足3位,則報錯,即丟擲自定義異常,並捕獲該異常)。

自定義異常類,繼承Exception

class ShortInputError(Exception):
def init(self, length, min_len):
self.length = length
self.min_len = min_len

# 設定丟擲異常的描述資訊
def __str__(self):
    return f'你輸入的長度是{self.length}, 不能少於{self.min_len}個字元'

def main():
try:
con = input('請輸入密碼:')
if len(con) < 3:
raise ShortInputError(len(con), 3)
except Exception as result:
print(result)
else:
print('密碼已經輸入完成')

main()
五. 總結
異常語法
try:
可能發生異常的程式碼
except:
如果出現異常執行的程式碼
else:
沒有異常執行的程式碼
finally:
無論是否異常都要執行的程式碼
捕獲異常
except 異常型別:
程式碼

except 異常型別 as xx:
程式碼
自定義異常

1. 自定義異常類

class 異常類類名(Exception):
程式碼

# 設定丟擲異常的描述資訊
def __str__(self):
  return ...

2. 丟擲異常

raise 異常類名()

捕獲異常

except Exception...
模組和包
目標
瞭解模組
匯入模組
製作模組
all
包的使用方法
一. 模組
Python 模組(Module),是一個 Python 檔案,以 .py 結尾,包含了 Python 物件定義和Python語句。

模組能定義函式,類和變數,模組裡也能包含可執行的程式碼。

1.1. 匯入模組
1.1.1 匯入模組的方式
import 模組名
from 模組名 import 功能名
from 模組名 import *
import 模組名 as 別名
from 模組名 import 功能名 as 別名
1.1.2 匯入方式詳解
1.1.2.1 import
語法

1. 匯入模組

import 模組名
import 模組名1, 模組名2...

2. 呼叫功能

模組名.功能名()
體驗
import math
print(math.sqrt(9)) # 3.0
1.1.2.2 from..import..
語法
from 模組名 import 功能1, 功能2, 功能3...
體驗
from math import sqrt
print(sqrt(9))
1.1.2.3 from .. import *
語法
from 模組名 import *
體驗
from math import *
print(sqrt(9))
1.1.2.4 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')
1.2. 製作模組
在Python中,每個Python檔案都可以作為一個模組,模組的名字就是檔案的名字。也就是說自定義模組名必須要符合識別符號命名規則。

1.2.1 定義模組
新建一個Python檔案,命名為my_module1.py,並定義testA函式。

def testA(a, b):
print(a + b)
1.2.2 測試模組
在實際開中,當一個開發人員編寫完一個模組後,為了讓模組能夠在專案中達到想要的效果,這個開發人員會自行在py檔案中新增一些測試資訊.,例如,在my_module1.py檔案中新增測試程式碼。

def testA(a, b):
print(a + b)

testA(1, 1)
此時,無論是當前檔案,還是其他已經匯入了該模組的檔案,在執行的時候都會自動執行testA函式的呼叫。

解決辦法如下:

def testA(a, b):
print(a + b)

只在當前檔案中呼叫該函式,其他匯入的檔案內不符合該條件,則不執行testA函式呼叫

if name == 'main':
testA(1, 1)
1.2.3 呼叫模組
import my_module1
my_module1.testA(1, 1)
1.2.4 注意事項
如果使用from .. import ..或from .. import *匯入多個模組的時候,且模組內有同名功能。當呼叫這個同名功能的時候,呼叫到的是後面匯入的模組的功能。

體驗

模組1程式碼

def my_test(a, b):
print(a + b)

模組2程式碼

def my_test(a, b):
print(a - b)

匯入模組和呼叫功能程式碼

from my_module1 import my_test
from my_module2 import my_test

my_test函式是模組2中的函式

my_test(1, 1)
1.3. 模組定位順序
當匯入一個模組,Python解析器對模組位置的搜尋順序是:

當前目錄
如果不在當前目錄,Python則搜尋在shell變數PYTHONPATH下的每個目錄。
如果都找不到,Python會察看預設路徑。UNIX下,預設路徑一般為/usr/local/lib/python/
模組搜尋路徑儲存在system模組的sys.path變數中。變數裡包含當前目錄,PYTHONPATH和由安裝過程決定的預設目錄。

注意
自己的檔名不要和已有模組名重複,否則導致模組功能無法使用
使用from 模組名 import 功能的時候,如果功能名字重複,呼叫到的是最後定義或匯入的功能。
1.4. all
如果一個模組檔案中有__all__變數,當使用from xxx import *匯入時,只能匯入這個列表中的元素。

my_module1模組程式碼
all = ['testA']

def testA():
print('testA')

def testB():
print('testB')
匯入模組的檔案程式碼
from my_module1 import *
testA()
testB()
二. 包
包將有聯絡的模組組織在一起,即放到同一個資料夾下,並且在這個資料夾建立一個名字為__init__.py 檔案,那麼這個資料夾就稱之為包。

2.1 製作包
[New] — [Python Package] — 輸入包名 — [OK] — 新建功能模組(有聯絡的模組)。

注意:新建包後,包內部會自動建立__init__.py檔案,這個檔案控制著包的匯入行為。

2.1.1 快速體驗
新建包mypackage
新建包內模組:my_module1 和 my_module2
模組內程式碼如下

my_module1

print(1)

def info_print1():
print('my_module1')

my_module2

print(2)

def info_print2():
print('my_module2')
2.2 匯入包
2.2.1 方法一
import 包名.模組名

包名.模組名.目標
2.2.1.1 體驗
import my_package.my_module1

my_package.my_module1.info_print1()
2.2.2 方法二
注意:必須在__init__.py檔案中新增__all__ = [],控制允許匯入的模組列表。

from 包名 import *
模組名.目標
2.2.2.1 體驗
from my_package import *

my_module1.info_print1()
三. 總結
匯入模組方法
import 模組名

from 模組名 import 目標

from 模組名 import *
匯入包
import 包名.模組名

from 包名 import *
all = [] :允許匯入的模組或功能列表
1人點贊
Python基礎