不間斷 Python 挑戰 Day 21 - 模組(module)

2022/01/12閱讀時間約 9 分鐘
大型程式的開發通常不會由一個人獨力完成,而是將程式依功能拆分成不同的函數或是類別,由不同人協力開發成各個模組,最後再將這些模組導入主程式,或是直接套用現有的模組。模組依來源可以分成三大類:
  • Python內建的模組
  • 外部模組,需從第三方的軟體儲存庫(如PyPI)安裝使用
  • 程式開發者自行開發的模組

Python內建的模組

我們之前一再使用的random模組就是屬於此類模組,這類的模組在安裝Python時就已經預先安裝,因此使用時不需再額外安裝,也稱為Python的標準程式庫(standard library)。其它的模組可在以下Python官方的文件中找到:https://docs.python.org/3/library/

導入整個模組

如同之前介紹random模組時使用的方式,其導入的方式如下:
import 模組
調用模組的函數或類別的方法如下:
模組.函數名稱
模組.類別名稱
例如以下範例使用random模組中的方法,產生0到9之間的隨機整數。
import random
print(random.randint(0, 9))
print(random.randrange(0, 10))

導入模組內的特定函數或類別

除了導入整個模組以外,也可以只導入模組內的特定幾個函數,導入的方式如下:
from 模組 import 函數名稱1, 函數名稱2, ...
from 模組 import 類別名稱1, 類別名稱2, ...
承續上個例子,導入特定的函數後,使用時便可以省略模組名稱。
from random import randint, randrange
print(randint(0, 10))
print(randrange(0, 10))

導入模組內的所有函數或類別

導入模組內所有函數或類別的方式如下:
from 模組 import *
和上個例子相同,導入所有函數後,使用時可以省略模組名稱。
from random import *
print(randint(0, 10))
print(randrange(0, 10))

自訂模組名稱

若覺得原本的模組名稱太長、不好記憶,可以將模組名稱定義為其它的識別字,方法如下:
import 模組 as 識別字
例如以下例子,rand被用來取代random,做為呼叫random模組方法的識別字。
import random as rand
print(rand.randint(0, 9))
print(rand.randrange(0, 10))
也可以單獨更改模組內特定函數或類別的名稱:
from 模組 import 函數名稱 as 識別字
from 模組 import 類別名稱 as 識別字
例如:
from random import randint as rint
print(rint(0, 9))

外部模組

外部模組因不包含在Python的標準程式庫中,因此使用前必須先安裝,安裝完成後,導入的方法和導入Python內建模組完全相同。

安裝外部模組

假設我們需要導入一個matplotlib外部模組,在PyPI可以找到matplotlib的相關用法:https://pypi.org/project/matplotlib/
在PyCharm中,安裝一個外部模組的方法如下:
  1. 點選File。
  2. 點選Settings...。
3. 點選當下編輯的Project名稱,例如我的名稱是marathon_python。
4. 點選Python Interpreter。
5. 點選+號新增模組。
6. 在搜尋的欄位輸入欲安裝的模組名稱,如這裡我輸入matplotlib。
7. 點選Install Package。
8. matplotlib旁顯示安裝中的訊息。
9. 安裝完成後,下方顯示Package 'matplotlib' installed successfully,可將此頁面關閉。
10. 在右方的Package欄位中,可以看到新增了許多相關的套件。

使用外部模組

至此,matplotlib模組就已經安裝完成,我們便可以導入此模組來使用其所提供的功能。
import matplotlib.pyplot
line = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
matplotlib.pyplot.plot(line)
matplotlib.pyplot.show()
執行結果:

自行開發的模組

Python也允許將自行建立的函數或類別儲存在獨立的文件中,再以模組的方式載入主程式。我們以Day20所開發的程式為例,將所有的程式碼儲存在marathon_python_day20.py的文件中,在今天的主程式中導入。
import marathon_python_day20
執行後發現程式已經自動執行了marathon_python_day20.py中主程式的內容,但通常載入模組希望的是能夠獨立引用模組內的方法或類別,而非做為主程式來執行。因此,我們可以使用以下語法,將模組內的主程式部分放入if區塊中,如此一來,當該檔案做為模組導入時,便不會執行if區塊的內容,此時變數__name__的內容為模組的名稱marathon_python_day20。
# marathon_python_day20.py
if __name__ == "__main__":
  # create a test pool
  test_pool = []
  for fact in fact_data:
    fact_obj = CreateTestPool(fact["question"], fact["answer"])
    test_pool.append(fact_obj)
  # do fact test
  fact_test = TestGenerator(test_pool)
  while fact_test.is_last_questions():
    fact_test.generate_next_question()
  # comments
  print(f"你的總分: {fact_test.score}/{fact_test.question_number}.")
  if fact_test.get_score() > 4:
    print("恭喜你答得比黑猩猩好!")
  elif fact_test.get_score() == 4:
    print("黑猩猩4ni?")
  else:
    print("趕快買本書來看吧!")
在今天的主程式中,我們就可以將marathon_python_day20.py中的資料與類別做為模組導入使用,
# marathon_python_day21.py
from marathon_python_day20 import fact_data, TestGenerator, CreateTestPool
# create a test pool
test_pool = []
for fact in fact_data:
  fact_obj = CreateTestPool(fact["question"], fact["answer"])
  test_pool.append(fact_obj)
# do fact test
fact_test = TestGenerator(test_pool)
while fact_test.is_last_questions():
  fact_test.generate_next_question()
# comments
print(f"你的總分: {fact_test.score}/{fact_test.question_number}.")
if fact_test.get_score() > 4:
  print("恭喜你答得比黑猩猩好!")
elif fact_test.get_score() == 4:
  print("黑猩猩4ni?")
else:
  print("趕快買本書來看吧!")

程式範例

為什麼會看到廣告
Wei-Jie Weng
Wei-Jie Weng
留言0
查看全部
發表第一個留言支持創作者!