💡 模組 (Module):一個獨立的程式檔案。
將程式寫在一個檔案中,此檔案可被其他程式碼『重複』載入『使用』。
套件 Package VS. 模組 Module
- 套件 Package
- 一個容器(資料夾),包含了一個或多個的模組(Module),並且擁有
__init__.py
檔案。
- 一個容器(資料夾),包含了一個或多個的模組(Module),並且擁有
- 模組 Module
- 一個檔案,包含了相關性較高的程式碼。
隨著應用程式的開發規模越來越大,我們不可能把所有的程式碼都寫在同一份 Python 檔案中,一定會將關聯性較高的程式碼抽出來放在不同的檔案中來形成模組(Module),主程式再透過引用的方式來使用。
所以,模組(Module)可以提高程式碼的重用性(Reusable)且易於維護。
模組的載入與使用
語法
寫法一
#載入模組 import module_name #使用模組的變數 module_name.var #使用模組的函式 module_name.func([parameters])
import math a = math.pi b = math.sqrt(4) print(a, b)
寫法二
#載入模組 import module_name as alias #使用模組的變數 alias.var #使用模組的函式 alias.func([parameters])
import math as m a = m.pi b = m.sqrt(4) print(a, b)
模組類型介紹
內建模組
- 這類的模組在安裝 Python 時就已經預先安裝,因此使用時不需再額外安裝,也稱為 Python 的標準程式庫(standard library)。
e.g.
- os, sys, datetime, random 模組
os 模組:作業系統操作
import os #取得檔案列表 print(os.listdir('./')) #建立資料夾 os.makedirs('./dir_test/')
sys 模組:取得系統相關的重要資訊
import sys #當前的作業系統 print(sys.platform) #整數型態的最大值 print(sys.maxsize) #搜尋模組的路徑 print(sys.path)
外部模組
- 外部模組因不包含在 Python 的標準程式庫中,因此使用前必須先安裝,安裝完成後,導入的方法和導入 Python 內建模組完全相同。
e.g.
- numpy, pandas, matplotlib 模組
numpy 模組:陣列操作
$ pip install numpy
import numpy as np a = np.array([1, 2, 3]) b = np.array([2, 4, 6]) print(np.add(a, b)) #[3, 6, 9]
自訂模組
geometry 模組:定義平面幾何運算用的函式 (須自行定義 geometry.py)
### MainScript.py ### import geometry print(geometry.distance(1, 1, 5, 5))
MainScript.py 拆檔案 - 模組化
## MainScript.py ##
#計算兩點間的距離
def distance(x1, y1, x2, y2):
return ((x2 - x1)**2 + (y2 - y1)**2)**0.5
#計算線段的斜率
def slope(x1, y1, x2, y2):
return (y2 - y1)/(x2 - x1)
result1 = distance(1, 1, 5, 5)
result2 = slope(1, 2, 5, 6)
print(result1) #5.656854249492381
print(result2) #1.0
Step 1:新建 Module geometry.py
💡 sys.path
Python 會搜尋模組的位置並印出。
表示當我們要載入一個模組時,Python 到很多地方搜尋模組並載入。
因此,若自訂的模組沒有放到搜尋的路徑中,則無法順利載入並使用模組!
geometry.py
與
MainScript.py
相同目錄階層#計算兩點間的距離 def distance(x1, y1, x2, y2): return ((x2 - x1)**2 + (y2 - y1)**2)**0.5 #計算線段的斜率 def slope(x1, y1, x2, y2): return (y2 - y1)/(x2 - x1)
MainScript.py
import geometry result1 = geometry.distance(1, 1, 5, 5) result2 = geometry.slope(1, 2, 5, 6) print(result1) #5.656854249492381 print(result2) #1.0
Step 2:調整目錄架構(引入 Package 概念)
- 建立資料夾
MyModules
,並將geometry.py
放入 資料夾MyModules
內。geometry.py
不需要修改
MainScript.py
需要新增模組的搜尋路徑MainScript.py
與 資料夾MyModules
置於同一階層。import sys #新增模組的路徑 sys.path.append("MyModules") #print(sys.path) import geometry result1 = geometry.distance(1, 1, 5, 5) print(result1) #5.6568 result2 = geometry.slope(1, 2, 5, 6) print(result2) #1.0
Step 3:自訂套件 (Package) geometry
💡 套件 = 封包 = package = 包含模組的『資料夾』
套件 -> 把模組分門別類
用於整理、分類模組程式碼,利用『資料夾』來整理。
使用時機:當我們有 100 個以上的模組時,就需要對模組做分類整理。
💡 對應關係
package (套件、封包) -> 『資料夾』
module (模組) -> 『.py 檔案』
專案檔案配置
- 專案資料夾
- MainScript.py
- 套件資料夾
- __init__.py
- 模組一.py
- 模組二.py
💡 含有 __init__.py 的資料夾,才會被當作是 套件(package)。
修改後
- 專案資料夾
- MainScript.py
- geometry (將 MyModules 更名為 geometry)
- __init__.py
- point.py (將 geometry.py 拆檔)
- line.py (將 geometry.py 拆檔)
__init__.py
- 空檔案
point.py
#計算兩點間的距離 def distance(x1, y1, x2, y2): return ((x2 - x1)**2 + (y2 - y1)**2)**0.5
line.py
#計算線段的斜率 def slope(x1, y1, x2, y2): return (y2 - y1)/(x2 - x1)
MainScript.py
待下一步驟調整
Step 4:載入並使用套件
語法
import package_name.module_name or from package_name import module_name 💡 注意! 必須 import 套件.模組 ,這樣才能正常使用。 切記,不可 import 套件 而已。
MainScript.py
第一種寫法
import geometry.point import geometry.line as line result1 = geometry.point.distance(1, 1, 5, 5) result2 = line.slope(1, 2, 5, 6) print(result1) #5.656854249492381 print(result2) #1.0
第二種寫法
from geometry import point, line result1 = point.distance(1, 1, 5, 5) result2 = line.slope(1, 2, 5, 6) print(result1) #5.656854249492381 print(result2) #1.0