模組、套件與獨立程式
(A) 模組
模組就是一個Python檔案,每一個Python檔案被視為一個模組,可以在程式中匯入其他Python模組,模組就可以不斷地被其他程式再利用。到此已經介紹程式的關鍵字(if、for、while…)、變數與運算子,可以想成單字;多個關鍵字、變數與運算子組合成一行程式,可以想成句子;多行程式可以組合成函式,可以想成段落;多個函式可以組合成模組,可以想成是一篇文章,以下介紹模組的實作與匯入模組。
(A-1) 實作模組
Python的模組就是一個檔案,實作一個模組,可以隨機回傳「剪刀」、「石頭」、「布」三個其中一個。
行號
1
2
3
4
範例(guess.py)
import random
status = ['剪刀', '石頭', '布']
def figure_guess():
return random.choice(status)
程式說明
第1行:匯入模組random。
第2行:定義變數status為串列,串列的內容有「剪刀」、「石頭」、「布」。
第3到4行:自訂函式figure_guess,使用random模組的函式choice,隨機從變數status中挑選一個元素出來,經由return回傳選出來的元素。
上述程式儲存在guess.py,匯入模組guess.py就可以呼叫函式figure_guess回傳「剪刀」、「石頭」、「布」三個其中一個,實作細節請參考下一節「匯入模組」。
(A-2) 匯入模組
有了模組後,其他程式就可以將模組匯入,使用「import」進行匯入,匯入的方法如下。
(1)匯入整個模組
使用「import 模組名稱」匯入整個模組,該模組(檔案)要在系統所指定的路徑內,系統會依序找尋所指定的路徑下是否有該模組(檔案),可以將模組與匯入該模組的程式放在同一個資料夾下,這樣一定能夠匯入,接著使用「模組名稱.函式名稱()」執行匯入模組的函式,例如:新增一個檔案在資料夾下,取名為mod1.py,在同一資料夾下有檔案guess.py,程式中匯入模組guess,使用「guess.figure_guess()」呼叫模組guess的函式figure_guess。
行號
1
2
3
範例(mod1.py)
import guess
computer = guess.figure_guess()
print(computer)
執行結果
石頭
解說
第1行:匯入模組guess。
第2行:呼叫模組guess的函式figure_guess,隨機從「剪刀」、「石頭」與「布」中挑選一個回傳到變數computer。
第3行:使用函式print顯示變數computer的內容到螢幕上。
(2)只匯入模組中想要的函式
使用「from 模組名稱 import 函式名稱」匯入模組中的特定函式,該模組(檔案)要在系統所指定的路徑內,系統會依序找尋所指定的路徑下是否有該模組(檔案),可以將模組與匯入該模組的程式放在同一個資料夾下,這樣一定能夠匯入,接著使用「函式名稱()」執行匯入模組的函式,例如:新增一個檔案在資料夾下,取名為mod2.py,在同一資料夾下有檔案guess.py,程式中匯入模組guess,使用「figure_guess()」呼叫模組guess的函式figure_guess。
行號
1
2
3
範例(mod2.py)
from guess import figure_guess
computer = figure_guess()
print(computer)
執行結果
剪刀
解說
第1行:匯入模組guess的函式figure_guess。
第2行:呼叫函式figure_guess,隨機從「剪刀」、「石頭」與「布」中挑選一個回傳到變數computer。
第3行:使用函式print顯示變數computer的內容到螢幕上。
(3)使用別名匯入模組
使用「import 模組 as 別名」匯入模組並命名為「別名」,該模組(檔案)要在系統所指定的路徑內,系統會依序找尋所指定的路徑下是否有該模組(檔案),可以將模組與匯入該模組的程式放在同一個資料夾下,這樣一定能夠匯入,接著使用「別名.函式名稱()」執行匯入模組的函式,例如:新增一個檔案在資料夾下,取名為mod3.py,在同一資料夾下有檔案guess.py,程式中匯入模組guess,重新命名為gs,使用「gs.figure_guess()」呼叫模組gs的函式figure_guess。
行號
1
2
3
範例(mod3.py)
import guess as gs
computer = gs.figure_guess()
print(computer)
執行結果
剪刀
解說
第1行:匯入模組guess,重新命名為gs。
第2行:呼叫模組gs的函式figure_guess,隨機從「剪刀」、「石頭」與「布」中挑選一個回傳到變數computer。
第3行:印出變數computer到螢幕上。
(A-3)匯入模組的路徑
若想要知道Python匯入模組的資料夾路徑與順序,需先匯入模組sys,讀取sys.path的每一個元素就可以知道,可以發現第一個找尋模組是否存在的資料夾就在執行程式的資料夾下,若找到就不會到下一個資料夾去找尋。
行號
1
2
3
範例
import sys
for path in sys.path:
print(path)
程式說明
第1行:匯入模組sys。
第2到3行:使用for迴圈依序讀取模組sys的屬性path到變數path,印出變數path到螢幕上。
執行後的結果
F:\python\ch7
F:\python
C:\Users\pr3\AppData\Local\Programs\Python\Python35-32\python35.zip
C:\Users\pr3\AppData\Local\Programs\Python\Python35-32\DLLs
C:\Users\pr3\AppData\Local\Programs\Python\Python35-32\lib
C:\Users\pr3\AppData\Local\Programs\Python\Python35-32
C:\Users\pr3\AppData\Local\Programs\Python\Python35-32\lib\site-packages
(B)套件
多個模組(檔案)放在同一個資料夾下,在該資料夾下新增一個檔案,檔案名稱為「__init__.py」,該資料夾就形成套件。
(B-1)實作套件
實作一個套件game,新增dice.py可以產生擲骰子的點數,與新增poker.py可以產生撲克牌的花色與點數,將這兩個檔案放在資料夾game下,在資料夾game下新增一個檔案「__init__.py」,檔案「__init__.py」的內容可以是空的。
新增dice.py,程式碼如下
行號
1
2
3
範例(dice.py)
from random import choice
def dice():
return choice(range(1,7,1))
解說
第1行:匯入模組random的choice函式。
第2到3行:定義dice函式,隨機回傳數值1到6的其中一個數字。
新增poker.py,程式碼如下
行號
1
2
3
4
5
範例(poker.py)
from random import choice
def poker():
a = ['C', 'H', 'D', 'S']
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 'T', 'J', 'Q', 'K']
return choice(a)+str(choice(b))
解說
第1行:匯入模組random的函式choice。
第2到5行:定義poker函式,串列a表示花色與串列b表示點數,隨機挑選串列a與串列b中一個元素,回傳挑選出來的花色與點數串接起來的結果。
(B-2)套件的使用
使用「from 套件名稱 import 模組名稱1, 模組名稱2」匯入套件中的特定模組,該套件要在系統所指定的路徑內,系統會依序找尋所指定的路徑下是否有該套件,可以將套件資料夾與匯入該套件的程式放在同一個資料夾下,這樣一定能夠匯入,接著使用「模組名稱.函式名稱()」執行匯入套件的模組中函式,例如:新增一個Python檔案在資料夾下,取名為pkg.py,前一節在資料夾下有game資料夾,game資料夾下有檔案dice.py與poker.py,程式中匯入套件game的模組dice與poker,使用「dice.dice()」呼叫模組dice的函式dice,使用「poker.poker()」呼叫模組poker的函式poker。
行號
1
2
3
4
範例(pkg.py)
from game import dice, poker
for i in range(2):
print(dice.dice())
print(poker.poker())
執行結果
2
SQ
5
H1
解說
第1行:匯入套件game的模組dice與poker。
第2到4行:使用for迴圈執行兩次,呼叫模組dice的函式dice隨機產生骰子點數,印出骰子點數到螢幕上,與呼叫模組poker的函式poker隨機產生撲克牌花色與點數,印出撲克牌花色與點數到螢幕上。
(C)腳本程式
腳本程式可以當成模組被匯入,也可以成為腳本程式,使用「if __name__ == '__main__':」,串接在此判斷條件後的程式碼,在腳本程式被當成模組被匯入時,不會被執行,只有在腳本程式獨立執行時才會執行。
(C-1)實作腳本程式
製作一個「剪刀、石頭、布」的小遊戲,電腦出拳為隨機出拳,使用者由介面輸入「剪刀」、「石頭」與「布」,比較電腦出拳與使用者出拳決定勝負的結果,使用「if __name__ =='__main__':」製作出獨立執行的腳本程式,當執行該腳本程式,就可以玩「剪刀、石頭、布」的遊戲。
行號
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
範例(guess2.py)
from guess import figure_guess
def run():
computer = figure_guess()
my = input('請輸入「剪刀」、「石頭」或「布」?')
print('電腦出', computer)
if my == '剪刀':
if computer == '剪刀':
print('平手')
elif computer == '石頭':
print('電腦獲勝')
else:
print('玩家獲勝')
elif my == '石頭':
if computer == '剪刀':
print('玩家獲勝')
elif computer == '石頭':
print('平手')
else:
print('電腦獲勝')
else:
if computer == '剪刀':
print('電腦獲勝')
elif computer == '石頭':
print('玩家獲勝')
else:
print('平手')
if __name__ == '__main__':
for i in range(10):
run()
else:
print('我不是獨立執行的python程式')
執行結果
顯示最後兩次的執行結果
請輸入「剪刀」、「石頭」或「布」?剪刀
電腦出 布
玩家獲勝
請輸入「剪刀」、「石頭」或「布」?剪刀
電腦出 剪刀
平手
解說
第1行:匯入模組guess的函式figure_guess。
第2到26行:定義函式run。
第3行:呼叫函式figure_guess,回傳從「剪刀」、「石頭」與「布」中挑選一個回傳到變數computer。
第4行:在螢幕上顯示「請輸入「剪刀」、「石頭」或「布」?」,輸入結果指定給變數my。
第5行:顯示「電腦出」與變數computer在螢幕上。
第6到12行:若變數my等於「剪刀」,表示玩家出剪刀,則若電腦出「剪刀」,則顯示「平手」,否則若電腦出「石頭」,則顯示「電腦獲勝」,否則(電腦出「布」)顯示「玩家獲勝」(第7到12行)。
第13到19行:若變數my等於「石頭」,表示玩家出石頭,則若電腦出「剪刀」,則顯示「玩家獲勝」,否則若電腦出「石頭」,則顯示「平手」,否則(電腦出「布」)顯示「電腦獲勝」(第14到19行)。
第20到26行:否則(變數my等於「布」),表示玩家出布,則若電腦出「剪刀」,則顯示「電腦獲勝」,否則若電腦出「石頭」,則顯示「玩家獲勝」,否則(電腦出「布」)顯示「平手」(第21到26行)。
第27到31行:若「__name__」等於「__main__」,則使用for迴圈執行函式run十次;否則顯示「我不是獨立執行的python程式」
若使用「import」匯入獨立執行的腳本程式,則「if __name__ == '__main__':」判斷結果為False,本程式會執行else,顯示「我不是獨立執行的python程式」。
行號
1
範例(import.py)
import guess2
執行結果
我不是獨立執行的python程式
解說
第1行:匯入模組guess2。