在講到什麼是模組前,我們需要先談談——「為什麼我們需要模組?」隨著愈加深入學習程式語言,有一個觀念變得越來越重要,那就是「可重複使用」,一如很早之前就說過,人類如果是懶惰的動物,那麼工程師想必是懶惰的王者。
「如果明明可以只要做一次的事,為什麼要做第二次呢?」而模組的建構與使用便是為了解決這個問題,想像今天我們是第一次在家裡組裝一個櫃子,由於我們不確定需要什麼,所以當我們發現這邊需要使用一字起時,我們會臨時去找一字起,而後又發現需要扳手時,我們會再去尋找扳手。
找工具這種狀況,如果只出現個一兩次倒也還好,但如果兩三天便需要組裝一個新傢俱,這樣到處翻找肯定讓人吃不消,因此我們會準備一個工具箱,把所有需要用到的工具放在工具箱裡,每次遇到差不多的狀況時,只要把工具箱拿出來,就不需要臨時在那邊翻找。
模組的基本概念即是如此,透過把工具分門別類貼上標籤,等到需要使用時再將其匯入 import
,便能節省那些重複製造、找尋的過程,直接使用現成的工具(物件與函式)即可。
模組 Module 是一個包含一組程式碼或函式的檔案,可以將其包含到應用程式中。模組可大可小,小的話包含單一變數,而大的話則可以是一個或多個函式所組成的大型程式碼的檔案。
要創建模組,我們只需要將程式碼寫入一個 Python 檔案,並將其儲存為 .py
檔案。創建一個名為 my_module.py
的檔案,並在其中撰寫程式碼。
# my_module.py 檔案
def generate_full_name(firstname, lastname):
return firstname + ' ' + lastname
接下來在專案資料夾中創建一個 main.py
檔案,我們想要在 main.py
中使用剛剛所創建的 my_module.py
模組,因此我們要使用關鍵字 import
(匯入)將 my_module.py
匯進現有的 main.py
檔案中。
# 在 main.py 檔案裡
import my_module
print(my_module.generate_full_name('Chien', 'Chuan')) # Chien Chuan
在剛剛的舉例中,我們的 my_module.py
只有一個函式 generate_full_main
,然而一個模組裡也可以有多個函式或是變數、物件,我們可以分別匯入這些函式。
在匯入之前,記得先在 my_module.py
檔案中創建其他的函式。
# my_module.py 檔案
def sum_two_nums(num1, num2):
return num1 + num2
gravity = 9.81
person = {
"firstname": "Chien",
"age": 199,
"country": "Taiwan",
"city": "Taipei"
}
# main.py 檔案
from my_module import generate_full_name, sum_two_nums, person, gravity
print(generate_full_name('Chien', 'Chuan'))
print(sum_two_nums(1, 9))
mass = 100
weight = mass * gravity
print(weight)
print(person['firstname'])
先說說「為什麼需要重新命名?」,當然可以是我們爽,所以想要重新命名,但更多時候是因為現有的檔案(如:main.py
中已經使用了模組內的物件名稱,為了避免名稱重複(Python 可不會讀心術),所以需要給匯入模組的物件一個別名,以利 Python 在呼叫、調用時進行區分。
當然也有可能是一些偷懶的原因,像是本來物件的名稱取得太長,想少打一些字,也是有可能。(我就懶嘛!)
# main.py 檔案
from my_module import generate_full_name as fullname, sum_two_nums as total, person as p, gravity as g
print(fullname('Chien', 'Chuan'))
print(total(1, 9))
mass = 100
weight = mass * g
print(weight)
print(p)
print(p['firstname'])
Python 本身也已經建置好許多模組,讓使用者可以省去很多自己打造模組的時間,有些常用的內建模組如:math
、datetime
、os
、sys
、random
、statistics
、collections
、json
、re
等。
Python 的 os
模組可以自動執行許多作業系統相關的任務,像是創建、修改當前工作目錄、刪除目錄等功能。
# 匯入 os 模組
import os
# 創建目錄
os.mkdir('目錄名稱')
# 更改當前目錄
os.chdir('路徑')
# 獲取當前工作目錄
os.getcwd()
# 刪除目錄
os.rmdir()
sys
模組提供操作 Python 執行環境的函式和變數。sys.argv
函式會回傳一個命令行引數列表,sys.argv[0]
是腳本名稱,sys.argv[1]
是從命令行傳遞的引數。
import sys
print('Welcome {}. Enjoy {} challenge!'.format(sys.argv[1], sys.argv[2]))
執行命令:
python script.py Frank 30DaysOfPython
結果:
Welcome Frank. Enjoy 30DaysOfPython challenge!
一些常用的 sys 指令:
# 退出程式
sys.exit()
# 獲取最大的整數變數
sys.maxsize
# 獲取環境路徑
sys.path
# 獲取 Python 版本
sys.version
statistics
模組提供數據統計相關的函式,例如 mean
(平均數)、median
(中位數)、mode
(眾數)、stdev
(標準差)等。
from statistics import *
ages = [20, 20, 4, 24, 25, 22, 26, 20, 23, 22, 26]
print(mean(ages)) # 平均數
print(median(ages)) # 中位數
print(mode(ages)) # 眾數
print(stdev(ages)) # 標準差
math
模組包含許多數學運算和常數。你可以使用 help(math)
或 dir(math)
查看模組內的函式。你可以選擇匯入特定函式,或是匯入整個模組。
import math
print(math.pi) # 3.141592653589793,圓周率
print(math.sqrt(2)) # 1.4142135623730951,平方根
print(math.pow(2, 3)) # 8.0,次方
print(math.floor(9.81)) # 9,向下取整
print(math.ceil(9.81)) # 10,向上取整
print(math.log10(100)) # 2,以10為底的對數
也可以一次匯入多個函式:
(補充一下,*
是 wildcard 的意思,現階段可以當作是「全部」,雖然實際上的意義有些不同。)
from math import *
print(pi) # 3.141592653589793,圓周率
print(sqrt(2)) # 1.4142135623730951,平方根
print(pow(2, 3)) # 8.0,次方
print(floor(9.81)) # 9,向下取整
print(ceil(9.81)) # 10,向上取整
我們也可以在匯入時重新命名函式:
from math import pi as PI
print(PI) # 3.141592653589793
string
模組也算是一個非常好用的模組。
import string
print(string.ascii_letters) # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits) # 0123456789
print(string.punctuation) # !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
random
模組可生成隨機數。下面的範例裡面,我們示範如何使用 random()
和 randint()
。
from random import random, randint
print(random()) # 生成 0 到 0.9999 之間的隨機數
print(randint(5, 20)) # 生成 5 到 20 之間的隨機整數
今天看著五倍學院的 ASTRO Camp 17th 學員完成了他們的專案 demo,突然意識到離我接觸程式語言,也過了近半年的時間,有時候不太確定半年的我到底進步了多少,但肯定的是,到現在我仍然在程式語言的世界感到無比新鮮,每天都能學到新的知識、新的技術,真好玩!