6 模組與套件
截至目前為止,我們一直都在 Jupyter Notebook 這個互動式環境中執行 Python 的程式,該是時候在終端機試著執行看看我們的程式了,如果您忘記了如何打開電腦的終端機,可以參考 1 開發環境的內容(在 1.2 啟動 Jupyter Notebook 這個小節中有告訴您如何在不同作業系統下啟動終端機。)
6.1 執行 Python 的程式
在任意路徑下新增一個檔案 stand_alone.py,我們以 MacOS Home 目錄下的 intro_2_py_ds 資料夾為例(在 Linux 作業系統能使用相同的指令;在 Windows 作業系統則可以在 任意路徑按滑鼠右鍵,選擇新增純文字文件,接著修改副檔名為 .py):
$ cd ~/intro_2_py_ds
$ touch stand_alone.py
用任意的文字編輯器在這個檔案中輸入簡單的 print
程式:
# coding=utf-8
print "嗨,我可以從終端機執行!"
因為我們輸出的是中文,因此必須在第一行說明編碼,如果您輸出的文字是英文,可以不用指定編碼;存檔以後,回到終端機執行:
$ python stand_alone.py
嗨,我可以從終端機執行!
6.1.2 在命令列加入參數
在任意路徑下新增一個檔案 stand_alone_w_args.py,我們以 MacOS Home 目錄下的 intro_2_py_ds 資料夾為例(在 Linux 作業系統能使用相同的指令;在 Windows 作業系統則可以在 任意路徑按滑鼠右鍵,選擇新增純文字文件,接著修改副檔名為 .py):
$ cd ~/intro_2_py_ds
$ touch stand_alone_w_args.py
用任意的文字編輯器在這個檔案中輸入:
# coding=utf-8
import sys
print "這些是從終端機回傳的參數:", sys.argv
因為我們輸出的是中文,因此必須在第一行說明編碼,如果您輸出的文字是英文,可以不用指定編碼;存檔以後,回到終端機執行:
$ python stand_alone_w_args.py
這些是從終端機回傳的參數: ['stand_alone_w_args.py']
接著我們在執行程式的時候輸入幾個參數嘗試:
$ python stand_alone_w_args.py arg1 arg2 arg3
這些是從終端機回傳的參數: ['stand_alone_w_args.py', 'arg1', 'arg2', 'arg3']
我們發現 sys.argv
會將檔案名稱(stand_alone_w_args.py)、參數 1(arg1)、參數 2(arg2)與參數 3(arg3)依序儲存在一個 list 中,表示可以在執行程式的時候傳入參數。
接著在任意路徑下新增一個檔案 circle_calculator.py,我們以 MacOS Home 目錄下的 intro_2_py_ds 資料夾為例(在 Linux 作業系統能使用相同的指令;在 Windows 作業系統則可以在 任意路徑按滑鼠右鍵,選擇新增純文字文件,接著修改副檔名為 .py):
$ cd ~/intro_2_py_ds
$ touch circle_calculator.py
我們要將 5 函數練習自訂的圓面積圓周長計算函數,利用終端機傳入半徑得到答案。用任意的文字編輯器在這個檔案中輸入:
# coding=utf-8
import sys
import math
def circle_calculator(r):
'計算圓形面積與周長'
area = math.pi * r**2
circum = 2 * math.pi * r
return area, circum
radius = float(sys.argv[1])
print "圓面積:", circle_calculator(radius)[0], "\n", "圓周長:", circle_calculator(radius)[1]
這段程式值得注意的地方是從終端機傳入的參數會以文字(str
)這個資料類型儲存在 sys.argv
這個 list 中,因此我們必須將它轉換為浮點數(float
)。因為輸出是中文,因此必須在第一行說明編碼,如果您輸出的文字是英文,可以不用指定編碼;存檔以後,回到終端機執行:
$ python2 circle_calculator.py 3
圓面積: 28.2743338823
圓周長: 18.8495559215
6.2 模組
當我們將程式以 .py 副檔名儲存之後,就能夠在另外一個程式中運用 import
這個指令將儲存好的程式直接拿來運用,這就稱為載入一個模組(import a module)。
6.2.1 載入一個模組
我們在 MacOS Home 目錄下的 intro_2_py_ds 資料夾新增另一個檔案 coin.py:
$ cd ~/intro_2_py_ds
$ touch coin.py
用任意的文字編輯器在這個檔案中輸入:
from random import choice
def flip_a_coin():
'投擲硬幣'
coin = ["Head", "Tail"]
return choice(coin)
這個程式是一個模擬投擲硬幣的函數,接著我們要在相同路徑下的另外一個程式 coin_flip.py 中呼叫這個函數:
$ cd ~/intro_2_py_ds
$ touch coin_flip.py
用任意的文字編輯器在這個檔案中輸入:
# coding=utf-8
import coin
coin_flip = coin.flip_a_coin()
print "投擲硬幣:", coin_flip
接著我們回到終端機,執行三次 coin_flip.py:
$ python coin_flip.py
投擲硬幣: Head
$ python coin_flip.py
投擲硬幣: Head
$ python coin_flip.py
投擲硬幣: Tail
我們成功地在 coin_flip.py 中載入了 coin.py 中的 flip_a_coin()
函數,並且在三次的投擲中分別擲出了 Head、Head 與 Tail(因為是隨機投擲,讀者的三次投擲結果會不盡相同。)
6.2.2 載入模組後更改命名
在 coin_flip.py 中載入 coin.py 之後可以利用 as
描述進行更名,更改命名在模組原先命名太長的情況下相當常見。
# coding=utf-8
import coin as COIN
coin_flip = COIN.flip_a_coin()
print "投擲硬幣:", coin_flip
6.2.3 載入模組中的部分函數
透過 from ... import ...
的語法可以讓我們只選擇載入模組中的部分函數。讓我們修改一下之前寫好的 circle_calculator.py:
# coding=utf-8
import math
def circle_area(r):
'計算圓形面積'
area = math.pi * r**2
return area
def circle_circum(r):
'計算圓形周長'
circum = 2 * math.pi * r
return circum
然後在相同路徑下新增一個 calculate_circle_area.py(MacOS Home 目錄下的 intro_2_py_ds 資料夾):
# coding=utf-8
import sys
from circle_calculator import circle_area
radius = float(sys.argv[1])
print "圓面積:", circle_area(radius)
接著我們回到終端機,執行 calculate_circle_area.py 並且帶入參數 3:
$ python calculate_circle_area.py 3
圓面積: 28.2743338823
雖然 circle_calculator.py 裡面提供了計算圓形面積與圓形周長的函數,但透過 from circle_calculator import circle_area
可以只載入計算圓形面積函數。
6.3 套件
當我們漸漸累積了多個功能相關的模組,就可以將它們組織成一個套件(package),組織的方式也很簡單,只要將這些模組的檔案放在同一個資料夾中,並為這個資料夾取一個適當的名稱,記得這個資料夾的名稱就是套件名稱。
讓我們在 MacOS Home 目錄下建立一個名為 casino 的資料夾,然後在這個資料夾中建立三個檔案:dice.py、poker.py 與 init.py;這代表我們創造了一個 casion 套件,這個套件有兩個模組分別是 dice 與 poker,init.py 中不需要輸入任何程式,它的功用是告知 Python 這個資料夾是一個套件。
$ cd ~
$ mkdir casino
$ cd casino
$ touch dice.py poker.py __init__.py
$ ls
__init__.py dice.py poker.py
在 dice.py 中我們定義一個投擲骰子的函數:
# coding=utf-8
from random import choice
def roll_dice():
'投擲骰子'
dice = range(1, 7)
return choice(dice)
在 poker.py 中我們定義一個發牌的函數:
# coding=utf-8
from random import choice
def card_deal():
'發撲克牌'
spades = []
hearts = []
diamonds = []
clubs = []
denominations = map(str, range(2, 11)) + ['J', 'Q', 'K', 'Ace']
for i in range(len(denominations)):
spades.append(denominations[i] + " Spade")
hearts.append(denominations[i] + " Heart")
diamonds.append(denominations[i] + " Diamond")
clubs.append(denominations[i] + " Club")
poker_cards = spades + hearts + diamonds + clubs
return choice(poker_cards)
接著我們就可以回到 MacOS Home 目錄下建立一個檔案 casino_play.py,輸入:
# coding=utf-8
from casino import dice, poker
print "投擲骰子:", dice.roll_dice()
print "發撲克牌:", poker.card_deal()
最後回到終端機,執行 casino_play.py:
$ python casino_play.py
投擲骰子: 2
發撲克牌: 4 Spade
太完美了,我們成功地載入 casino 套件,並且呼叫了 dice、poker 模組中的 roll_dice()
與 card_deal()
函數。
6.4 資料科學應用的套件
本書主要使用的資料科學應用套件有:
|套件名稱|主要用途| |NumPy|實現科學計算| |Pandas|使用資料框並用來讀取資料| |Matplotlib|繪圖| |Scikit-learn|實現機器學習相關的演算|
如果讀者跟我們一樣是使用 Anaconda,那麼這些套件都已經安裝妥善可以使用了,讓我們載入這四個套件,並且印出它們的版本編號:
import numpy as np
import pandas as pd
import matplotlib as plt
import sklearn
print np.__version__
print pd.__version__
print plt.__version__
print sklearn.__version__