大型程式的開發通常不會由一個人獨力完成,而是將程式依功能拆分成不同的函數或是類別,由不同人協力開發成各個模組,最後再將這些模組導入主程式,或是直接套用現有的模組。模組依來源可以分成三大類:
- Python內建的模組
- 外部模組,需從第三方的軟體儲存庫(如PyPI)安裝使用
- 程式開發者自行開發的模組
Python內建的模組
導入整個模組
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內建模組完全相同。
安裝外部模組
在PyCharm中,安裝一個外部模組的方法如下:
- 點選File。
- 點選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("趕快買本書來看吧!")
程式範例