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.pypoker.pyinit.py;這代表我們創造了一個 casion 套件,這個套件有兩個模組分別是 dicepokerinit.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 套件,並且呼叫了 dicepoker 模組中的 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__

圖 6-1 資料科學應用套件

參考連結

results matching ""

    No results matching ""