Python 自學第七天:Module 模組

也就是使用其他 .py 檔案中,預先定義好的變數和函式。使用模組的好處就是,別人寫過或自己定義過的變數和函式可以直接拿來使用

Python 有一些內建好的模組,可以直接拿來使用,如:與作業系統相關的 os、與命令行相關的 sys、與數學相關的 mathrandomstatistics 等,可以參考 Python 標準函式庫概覽。也有其他人寫好的模組,可以從網路上下載來使用。也可以自己定義模組。

模組的引入和使用

「全部」的變數和函式

引入

使用模組前要先告知 Python 主程式,即將引入哪些模組,引入方法如下:

1
2
3
4
5
# 語法一:
import 模組名 (as 別名)

# 語法二:
from 模組名 import *

*:表示該模組中所有的變數和函式。
別名:可以幫很長不好記憶的模組自訂名稱。

使用

1
2
3
4
5
6
模組名.變數名
模組名.函式名()

# 如果有取「別名」則改成這樣
別名.變數名
別名.函式名()

「特定」的變數和函式

引入

但是每次將整個模組的變數和函式引入,會有造成程式運行效能降低的可能性。因此,還可以針對模組中的特定變數和函式來引入:

1
2
from 模組名 import 變數名
from 模組名 import 函式名

使用

不需要在變數和函式前面加 模組名.別名.

1
2
變數名
函式名()

因為簡化了呼叫變數和函式的方式,小心模組中的變數名、函式名Python 內建的變數名、函式名重疊。

Python 內建的模組

以下列出一些常用的模組中的函式。

與作業系統相關的 os 模組

  • getcwd()回傳目前的工作目錄
1
2
3
4
5
import os
print(os.getcwd()) # Return the current working directory

# 輸出結果:
# /Users/zhengzhurong/Desktop/Python_beginning

也可以寫成如下:

1
2
from os import getcwd
print(getcwd())

更多請參考:Python 文件 os 模組

與命令行相關的 sys 模組

  • prefixPython 安裝位置路徑的前綴
  • path路徑 List,用來搜尋模組所在位置path[0] 是主程式所在的目錄。其餘元素是 Python 內建模組的所在位置,為 prefix/lib/python_version
  • versionPython 直譯器的版本號和其他訊息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from sys import prefix, path, version

print(prefix)
print(path)
print(version)

# /Library/Frameworks/Python.framework/Versions/3.8

# ['/Users/zhengzhurong/Desktop/Python_beginning', '/Library/Frameworks/
# Python.framework/Versions/3.8/lib/python38.zip', '/Library/Frameworks/
# Python.framework/Versions/3.8/lib/python3.8', '/Library/Frameworks/
# Python.framework/Versions/3.8/lib/python3.8/lib-dynload', '/Users/
# zhengzhurong/Library/Python/3.8/lib/python/site-packages', '/Library/
# Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages']

# 3.8.0 (v3.8.0:fa919fdf25, Oct 14 2019, 10:23:27)
# [Clang 6.0 (clang-600.0.57)]

更多請參考:Python 文件 sys 模組

與基本運算相關的 math 模組

  • fabs(a):取絕對值
  • log10(a):以 10 為底取對數
1
2
3
4
5
6
7
from math import fabs, log10

print(fabs(-5.5))
print(log10(1000))

# 5.5
# 3.0

更多請參考:Python 文件 math 模組

與隨機選擇相關的 random 模組

  • choice(seq):從 sequence 資料中,隨機選取一個元素sequence 是可以疊代的資料類型,有字串ListTuple 等。
  • sample(seq, n):從 sequence 資料中,隨機選取 n 個元素。回傳 List 資料。
1
2
3
4
5
6
7
8
from random import choice, sample

data = (2, 5, 11, 4, 7, 33)
print(choice(data))
print(sample(data, 2))

# 7
# [4, 2]
  • shuffle(list):將可變動的 sequence 資料 (也就是 List) 中的元素,隨機調換位置。如果想要調換不可變動的 sequence 資料中的元素,只能利用 sample(seq, n=len(seq)) 回傳一個新的 List。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from random import sample, shuffle

data = (2, 5, 11, 4, 7, 33)
my_list = [2, 4, 5, 13, 6, 18]

print(my_list)
shuffle(my_list)
print(my_list)
# [2, 4, 5, 13, 6, 18]
# [6, 2, 18, 5, 13, 4]

print(sample(data, len(data))) # 利用 sample 調換不可變動 Tuple 的元素
# [11, 33, 7, 5, 4, 2]

  • random():不需要傳入任何參數,隨機取得 0.0~1.0(不包含) 之間的浮點數 N
  • uniform(a, b)隨機取得介在 a 和 b 之間的浮點數 N。會不會包含 b 則以公式 a + (b-a) * random() 來決定。
1
2
3
4
5
6
7
from random import random, uniform

print(random())
print(uniform(1.2, 5.5))

# 0.3670324625285356
# 3.0212954783263894
  • randint(a, b)隨機取得介在 a 和 b(包含) 之間的整數 N
  • randrange(a, b[, step])隨機取得介在 a 和 b(不包含) 之間的整數 N。可以指定數字間隔
1
2
3
4
5
6
7
from random import randint, randrange

print(randint(1, 3))
print(randrange(1, 10, 3))

# 3
# 7

更多請參考:Python 文件 random 模組

與統計相關的 statistics 模組

下列函式中,data 要是 sequence 或可疊代的資料。

  • mean(data):計算 data 的平均數
  • median(data):計算 data 的中位數
  • mode(data):取出現最多次的元素
  • stdev(data):計算 data 的樣本標準差
1
2
3
4
5
6
7
8
9
10
11
12
13
from statistics import mean, median, mode, stdev

nums = (2, 5, 7, 10, 13, 99)
print(mean(nums))
print(median(nums))
colors = ["red", "blue", "blue", "red", "green", "red", "red"]
print(mode(colors))
print(stdev(nums))

# 22.666666666666668
# 8.5
# red
# 37.59077901117063

更多請參考:Python 文件 statistics 模組

自定義模組

定義模組很簡單,就是直接建立一個 .py 檔案,裡面放置自訂的變數函式即可。

1
2
3
4
5
6
7
8
# ../my_math.py
grade = "A-"

def practice(thing="arithmetic"):
print("Practice "+thing)

def doExercises(topic="Trigonometric functions"):
print("Do exercises on "+topic)

依照主程式模組放置位置,需要執行不同的動作才能引入:

「同層」目錄結構

1
2
3
Python_beginning
├ main.py
└ my_math.py

不需要格外的動作,可以直接在主程式 main.py 中引入。

1
2
3
4
5
6
7
# ../main.py
import my_math

print("Math grade: "+my_math.grade)
my_math.practice()
# Math grade: A-
# Practice arithmetic

因為如上述提過的 Python 內建 sys 模組中的 path 變數:路徑 List,用來搜尋模組所在位置。path[0] 是主程式 main.py 所在的資料夾,也就是 ../Python_beginning。因此可以直接找到 my_math 模組。

模組在「資料夾」中,屬於下一層

1
2
3
4
Python_beginning
├ main.py
└ subject
└ my_math.py

當我直接引入 my_math.py 模組,會報錯:

1
2
3
4
5
6
7
8
9
import my_math

print("Math grade: "+my_math.grade)
my_math.practice()

# Traceback (most recent call last):
# File "../Python_beginning/main.py", line 1, in <module>
# import my_math
# ModuleNotFoundError: No module named 'my_math'

因為在 sys.path[0] 的位置,也就是 ../Python_beginning 資料夾,找不到 my_math 模組。

需要在 import my_math 之前,自己增加路徑位置,動作如下:

1
2
3
import sys
sys.path.append("./subject")
# sys.path.append("subject") # 這樣寫也可以

append():在可變動 List 資料尾端,新增一個元素。

使用他人建置的模組

pip 是 Python 的模組 package 管理工具,提供了對模組 package 的查詢下載安裝卸載的功能。

如果你的 Python 是從官網上面下載,就包含了 pip 工具。如果尚未安裝 pip 工具,請參考下方。

安裝 pip

pip 官網中,可以看到安裝的方法

  1. 獲得安裝 pip 的檔案。可以使用終端機 cd 進入某個資料夾,用下方指令碼下載;或是去這裏將整個頁面存在一個 .py 的檔案中。
1
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py   # 先下載安裝 pip 的檔案

curl:抓取網頁到一個檔案中。
-o:必須輸入檔案名,將網頁內容下載到該檔案中。

因為 pip 會自動被安裝在 /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages 路徑中,因此 get-pip.py 檔案儲存在哪裡都無所謂。

  1. 使用終端機 cd 進入 get-pip.py 所在資料夾,執行安裝 pip 的檔案。
1
$ sudo python3 get-pip.py    # 執行安裝 pip 的檔案

使用 pip 安裝模組

有了 pip 工具後,使用它安裝他人建置的模組。

1
$ pip install 模組名

參考資料:
彭彭的課程:Python Module 模組的載入與使用