約維安計畫:Python 的模組

第十八週。

約維安計畫:Python 的類別說明程式設計師因應不同目的以及應用場景,有組織程式碼的需求,希望可以簡潔且有效率地完成任務,Python 與大多數的程式語言相同,擁有其他組織程式碼的機制,具體而言有三個層次,由小而大依序為:

  1. 函數(Functions)。

  2. 類別(Classes)。

  3. 模組(Modules)。

本篇文章要介紹組織程式碼機制的第三個層次:模組

什麼是模組

模組是 Python 組織程式碼包容性最高的機制,當我們自行定義了為數眾多的函數與類別,下一步就可以使用模組來包裝這些程式碼,那麼模組究竟在實體上的形式為何?具體來說,模組就是副檔名為 .py 的檔案(Files)或資料夾(Folders),在裡頭記錄了自行定義的函數以及類別。一個名為 my_module.py 的檔案,就被稱為「my_module」模組,當檔案的數量也增多了的時候,就可以利用資料夾收納這些檔案,而一個名為 my_module 的資料夾,也同樣被稱為「my_module」模組。

如同函數有不同來源一般,模組同樣也有三個來源:

  1. 標準模組。

  2. 第三方模組。

  3. 來自使用者的定義。

Python 程式語言引以為傲的一個特點是自帶電池哲學(Battery included philosophy),這個形容指的是極為豐富的標準模組,這個特點從標準模組的官方文件連結可見一斑:https://docs.python.org/3/library

使用模組

如果想要使用標準模組中的功能,要透過 import 的指令定義,再透過句號(.)參照附屬其中的函數或者類別。

import module_name

module_name.function_name()       # use module's function
object = module_name.class_name() # use module's class

例如載入標準模組 random,然後使用附屬於其中的 randint() 函數。

import random

random.randint(0, 1)

使用模組的使用者並不會知道具體的形式是副檔名為 .py 的檔案或資料夾,如果想要暸解模組形式以及儲存在電腦中的路徑,可以檢視模組的 __file__ 屬性。

print(random.__file__)

假如有時候我們只需要取用模組中少部分的函數或類別,也可以「選擇性」地透過 from 搭配 import 來載入指定功能。

from module_name import function_name
from module_name import class_name

function_name()       # use module's function
object = class_name() # use module's class

例如指定載入標準模組 random 中的 randint() 函數。

from random import randint

randint(0, 1)

除了可以依照使用者的需求多寡決定要載入整個模組或僅載入部分功能,另外一個更好的判斷準則就是仿效模組的說明文件(Documentation)的做法。

使用第三方模組

第三方模組並不像標準模組會在安裝 Python 的時候就一併安裝,即便是資料科學普遍使用的 Anaconda 預先安裝了超過 7,500 個模組,也很有可能獨漏了想要使用的特定模組,因此載入之前必須要先確認模組是否已經安裝妥當,如果模組沒有安裝就嘗試載入,會遭遇到 ModuleNotFoundError

try:
    import third_party_module
except ModuleNotFoundError:
    print("Module is not installed.")

安裝模組的方式是在命令列以 pip install 安裝,如果要更新已安裝的模組,只要加上參數 -U 即可。pip 是 Python 的模組管理系統,可以用來從 PyPI(Python Package Index)下載、安裝和管理模組,從 Python 3.4 起都會預先安裝 pip。

~$ pip install module_name
~$ pip install -U module_name

忘記了什麼是命令列嗎?複習一下約維安計畫:初嘗命令列的滋味吧!

例如安裝數值計算的第三方模組 numpy

~$ pip install numpy
~$ pip install -U numpy

有的時候因為模組的名稱比較長,可以用 as 保留字命名縮寫方便使用,模組命名縮寫雖然可以依個人偏好取名,但是建議遵守說明文件中的縮寫,像是數值計算的第三方模組 numpy 在官方文件中縮寫為 np,所有人都會使用這個縮寫。

import numpy as np

np.random.randint(0, 2, size=5)

自行定義模組

將函數、類別撰寫在工作目錄(Working directory)中一個副檔名為 .py 的檔案中,若是函數與類別的數量眾多時,就可以用一個資料夾將這些檔案收納起來,不論是資料夾名稱或檔案名稱,都是模組的命名,若想要取得其中的函數與類別,就要載入模組之後依照資料夾、檔案、類別與函數的名稱用句號(.)參照取用。

例如在工作目錄中新增擁有下述樹狀結構的資料夾:

my_modules
- calculator.py
- stats.py

在 calculator.py 中寫入約維安計畫:Python 的類別中所自行定義的 SimpleCalculator 類別。

# calculator.py
class SimpleCalculator:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def __repr__(self):
        return "a: {}, b: {}".format(self.a, self.b)
    def add(self):
        return self.a + self.b

在 stats.py 中寫入自行定義的 mean 函數。

# stats.py
def mean(*args):
    return sum(args) / len(args)

import 指令載入模組之後依照資料夾、檔案、類別與函數的名稱用句號(.)參照取用。

import my_modules.calculator
import my_modules.stats

sc = my_modules.calculator.SimpleCalculator(5, 6)
print(sc.add())
print(my_modules.stats.mean(5, 6, 55, 66, 5566))

當然也能夠搭配 from 載入 my_modules 模組下的 calculator 模組與 stats 模組後再取用其中的類別與函數。

from my_modules import calculator
from my_modules import stats

sc = calculator.SimpleCalculator(5, 6)
print(sc.add())
print(stats.mean(5, 6, 55, 66, 5566))

如此一來,我們就能夠暸解未來在資料分析階段所使用的第三方模組,其具體的形式為何進而可以更熟練地使用了。在認識了模組之後,第十八週約維安計畫:Python 的模組來到尾聲,希望您也和我一樣期待下一篇文章。

延伸閱讀


對於這篇文章有什麼想法呢?喜歡😻、留言🙋‍♂️或者分享🙌

Leave a comment

計畫學員專區

付費訂閱電子報的會員可以點選 nbgitpuller 連結將本篇文章完整的 Jupyter Notebook 以及範例模組複製到自己的 Jupyter Server:

nbgitpuller 連結

伺服器選項選擇預設的「Data science environment:學習 Python、R 與 Julia 的資料科學環境」就可以順利運作文章中的範例程式。