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

更新於 發佈於 閱讀時間約 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("趕快買本書來看吧!")

程式範例

為什麼會看到廣告
avatar-img
47會員
36內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Wei-Jie Weng的沙龍 的其他內容
全球公衛教授和公共教育家漢斯.羅斯林(Hans Rosling)在其著名的暢銷書「真確」中,提出了13個關於全球貧富、人口、出生/死亡率、教育、公衛等的「留意認知落差測驗」,回答的人不乏受過良好教育的專業人士,結果顯示,受測者在前12題平均只答對2題,遠不如隨機亂選的黑猩猩(如果黑猩猩會回答問題的話
到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。 Python其實是一種物件導向的程式(object oriented programming, 簡稱
Python提供集合做為其資料結構,它就如同高中數學所學集合的概念,集合的內容一般來說是具有某種特性的事物的整體,例如考試分數及格的群體、數字1到100內的所有奇數、球箱內所有球的顏色等。因此,在一個集合中,每個元素的地位都是相同且無序,並且只能出現一次,集合和集合之間,也可以進行交集、聯集、差集等
Python依據變數有效的範圍可以區分為全域變數(Global variable)或區域變數(Local variable)。在函數內宣告的變數為區域變數,有效範圍只有在函數內,函數外部無法引用這個變數;在函數以外宣告的變數為全域變數,它的有效範圍為整個檔案,並且在函數內部也可以引用這個變數。
這篇文章將利用之前所學過的一些東西,包括if敘述、串列、while迴圈、函數等等的觀念,來實作一個撲克牌的小遊戲-21點。
在前面的文章中我們學習了關於字典的基本用法,今天再討論更多關於字典的其它用法,以及它和串列、元組等的關聯。
全球公衛教授和公共教育家漢斯.羅斯林(Hans Rosling)在其著名的暢銷書「真確」中,提出了13個關於全球貧富、人口、出生/死亡率、教育、公衛等的「留意認知落差測驗」,回答的人不乏受過良好教育的專業人士,結果顯示,受測者在前12題平均只答對2題,遠不如隨機亂選的黑猩猩(如果黑猩猩會回答問題的話
到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。 Python其實是一種物件導向的程式(object oriented programming, 簡稱
Python提供集合做為其資料結構,它就如同高中數學所學集合的概念,集合的內容一般來說是具有某種特性的事物的整體,例如考試分數及格的群體、數字1到100內的所有奇數、球箱內所有球的顏色等。因此,在一個集合中,每個元素的地位都是相同且無序,並且只能出現一次,集合和集合之間,也可以進行交集、聯集、差集等
Python依據變數有效的範圍可以區分為全域變數(Global variable)或區域變數(Local variable)。在函數內宣告的變數為區域變數,有效範圍只有在函數內,函數外部無法引用這個變數;在函數以外宣告的變數為全域變數,它的有效範圍為整個檔案,並且在函數內部也可以引用這個變數。
這篇文章將利用之前所學過的一些東西,包括if敘述、串列、while迴圈、函數等等的觀念,來實作一個撲克牌的小遊戲-21點。
在前面的文章中我們學習了關於字典的基本用法,今天再討論更多關於字典的其它用法,以及它和串列、元組等的關聯。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
繼上一篇的破除執念,我按照內文的方式做,最近狀態的確好很多了。我偶爾會找對方說說話,有趣的是,偶爾還是會被激起一些情緒,但那比較像是內在小孩的BUG被抓到了,和對對方的情感關係不大。 比如說對方沒回覆,或是回答簡短的時候,我會情緒激動,因為我感受到"自己不被在乎"和"自己不值得"的負面信念。我同時
Python 模組和套件系統讓我們的程式可以變得更高效且具備更多功能。本篇文章將深入介紹 Python 的模組,包括模組的匯入與使用、Python 的內建模組,以及如何透過 pip 安裝第三方套件,讓您的開發流程更加便利。
Thumbnail
讓愛心文具成為教育的養分 在尼泊爾,佛學院承載著重要的教育責任。很多家庭自小就將最優秀的孩子送來佛學院,讓他們能接受系統的教育和培養。有些孩子則來自非常貧困的家庭,佛學院也提供他們完善受教育的機會。在這趟尼泊爾助學行,德內ㄦ特別訂製準備了3,200個文具組及16箱色鉛筆,將我們的關懷送到了12所學
Thumbnail
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
Thumbnail
世堅無奇不有,如果以一種單一的方式存活,豈不是錯過很多種可能性?
Thumbnail
十年前,我跟小悟參加了台南政府所舉辦的 24 小時不間斷進食比賽,當年,我以兩分之差,沒擠進金榜。在挑戰時間內,來不及吃狀元糕跟芋頭八寶冰,以致失掉食物王的頭銜。十年後,小悟說,要不要再來回味當年勇?我知道,年輕的我胃袋能撐船,可逝去的青春,最先反映在食慾上。我笑著說不了......
Thumbnail
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
NumPy(Numeric Python)是Python中用於科學計算的核心庫之一。它提供了高性能的多維陣列對象(即ndarray)以及用於處理這些陣列的各種函數和工具。 在NumPy中,有幾個常用的指令可以用來創建陣列
Thumbnail
持著前作的風格,《蜘蛛人:穿越新宇宙》在色彩或畫面的呈現上依舊大膽、前衛,並且嘗試藉由多重宇宙的「優勢」,在成長動畫的既有敘事上,嘗試更多不同的可能性。精彩的安排讓觀看這部作品讓成為十足的享受,並賦予了觀眾再次進場支持的充分動機。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
繼上一篇的破除執念,我按照內文的方式做,最近狀態的確好很多了。我偶爾會找對方說說話,有趣的是,偶爾還是會被激起一些情緒,但那比較像是內在小孩的BUG被抓到了,和對對方的情感關係不大。 比如說對方沒回覆,或是回答簡短的時候,我會情緒激動,因為我感受到"自己不被在乎"和"自己不值得"的負面信念。我同時
Python 模組和套件系統讓我們的程式可以變得更高效且具備更多功能。本篇文章將深入介紹 Python 的模組,包括模組的匯入與使用、Python 的內建模組,以及如何透過 pip 安裝第三方套件,讓您的開發流程更加便利。
Thumbnail
讓愛心文具成為教育的養分 在尼泊爾,佛學院承載著重要的教育責任。很多家庭自小就將最優秀的孩子送來佛學院,讓他們能接受系統的教育和培養。有些孩子則來自非常貧困的家庭,佛學院也提供他們完善受教育的機會。在這趟尼泊爾助學行,德內ㄦ特別訂製準備了3,200個文具組及16箱色鉛筆,將我們的關懷送到了12所學
Thumbnail
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
Thumbnail
世堅無奇不有,如果以一種單一的方式存活,豈不是錯過很多種可能性?
Thumbnail
十年前,我跟小悟參加了台南政府所舉辦的 24 小時不間斷進食比賽,當年,我以兩分之差,沒擠進金榜。在挑戰時間內,來不及吃狀元糕跟芋頭八寶冰,以致失掉食物王的頭銜。十年後,小悟說,要不要再來回味當年勇?我知道,年輕的我胃袋能撐船,可逝去的青春,最先反映在食慾上。我笑著說不了......
Thumbnail
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
NumPy(Numeric Python)是Python中用於科學計算的核心庫之一。它提供了高性能的多維陣列對象(即ndarray)以及用於處理這些陣列的各種函數和工具。 在NumPy中,有幾個常用的指令可以用來創建陣列
Thumbnail
持著前作的風格,《蜘蛛人:穿越新宇宙》在色彩或畫面的呈現上依舊大膽、前衛,並且嘗試藉由多重宇宙的「優勢」,在成長動畫的既有敘事上,嘗試更多不同的可能性。精彩的安排讓觀看這部作品讓成為十足的享受,並賦予了觀眾再次進場支持的充分動機。