iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
Python

初學者的 30 天 Python 復健課程系列 第 14

復健第十四天:自己刻出樂高積木 Modules 模組

  • 分享至 

  • xImage
  •  

模組 (Modules)

在講到什麼是模組前,我們需要先談談——「為什麼我們需要模組?」隨著愈加深入學習程式語言,有一個觀念變得越來越重要,那就是「可重複使用」,一如很早之前就說過,人類如果是懶惰的動物,那麼工程師想必是懶惰的王者。

「如果明明可以只要做一次的事,為什麼要做第二次呢?」而模組的建構與使用便是為了解決這個問題,想像今天我們是第一次在家裡組裝一個櫃子,由於我們不確定需要什麼,所以當我們發現這邊需要使用一字起時,我們會臨時去找一字起,而後又發現需要扳手時,我們會再去尋找扳手。

找工具這種狀況,如果只出現個一兩次倒也還好,但如果兩三天便需要組裝一個新傢俱,這樣到處翻找肯定讓人吃不消,因此我們會準備一個工具箱,把所有需要用到的工具放在工具箱裡,每次遇到差不多的狀況時,只要把工具箱拿出來,就不需要臨時在那邊翻找。

模組的基本概念即是如此,透過把工具分門別類貼上標籤,等到需要使用時再將其匯入 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 本身也已經建置好許多模組,讓使用者可以省去很多自己打造模組的時間,有些常用的內建模組如:mathdatetimeossysrandomstatisticscollectionsjsonre 等。

OS 模組

Python 的 os 模組可以自動執行許多作業系統相關的任務,像是創建、修改當前工作目錄、刪除目錄等功能。

# 匯入 os 模組
import os

# 創建目錄
os.mkdir('目錄名稱')
# 更改當前目錄
os.chdir('路徑')
# 獲取當前工作目錄
os.getcwd()
# 刪除目錄
os.rmdir()

Sys 模組

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 模組

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 模組

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 模組

string 模組也算是一個非常好用的模組。

import string

print(string.ascii_letters) # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits)        # 0123456789
print(string.punctuation)   # !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

Random 模組

random 模組可生成隨機數。下面的範例裡面,我們示範如何使用 random()randint()

from random import random, randint

print(random())        # 生成 0 到 0.9999 之間的隨機數
print(randint(5, 20))  # 生成 5 到 20 之間的隨機整數

後記

今天看著五倍學院的 ASTRO Camp 17th 學員完成了他們的專案 demo,突然意識到離我接觸程式語言,也過了近半年的時間,有時候不太確定半年的我到底進步了多少,但肯定的是,到現在我仍然在程式語言的世界感到無比新鮮,每天都能學到新的知識、新的技術,真好玩!


上一篇
復健第十三天:萬事皆可放的函式 Functions
下一篇
復健第十五天:成為串列大師吧——串列推導式 List Comprehension
系列文
初學者的 30 天 Python 復健課程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言