Module
程式愈寫愈多愈寫愈長,到最後要修改維護除錯時,一定會忘記當初寫在那裏,為什麼要這麼寫。所以就必需把代碼切成一段一段,存放在不同的檔案中。
在Python中,每一個檔案 (.py) 就是一個模組,使用模組的好處就是提高代碼的維護性。 再者,不必從頭開始編寫程式碼。當一個模組編寫完畢,就可以讓其他專案引用。我們就經常引用其他模組,如Python內置的模組和第三方模組。
函數名或變數名在不同的模組可以重複,但模組名稱(即檔案名稱) 就不可以跟別人寫的名稱一樣。為了解決這種衝突,就可以使用不同的目錄來避開,在Python或Java中,目錄又稱為Package。
Package
存放在專案下的每個目錄,都是一個 package,而package下的檔案,使用package.file來稱呼,比如下面的架構, 就可以使用 mahaljsp.triangle來參考,這樣就可以避開與他人相同的模組名。
專案 ├─ mahaljsp │ ├─ __init__.py │ └─ triangle.py ├─ main.py
假設 triangle.py 裏面有二個函數,如下
import math def circle(r, angle=0): x = r*math.cos(r*math.pi/180) y = r*math.sin(r * math.pi / 180) return x, y def hypotenuse(x, y): return pow((x*x+y*y), 0.5)
那麼在 main.py 如果要調用 circle 函數,就必需使用
from mahaljsp.triangle import circle
from mahaljsp.triangle import circle for i in range(360): print(circle(10,i))
另外也可以使用
from mahaljsp import triangle
from mahaljsp import triangle for i in range(360): print(triangle.circle(10,i))
每一個package 目錄下都需要有一個 __init__.py 檔,否則Python會把這個目錄當成一般的目錄,而不是一個Package。__init__.py 一般是空白檔案,但可以有Python代碼。
sys模組
在DOS Console下執行 python程式時,總會附加一些參數,比如 python first.py Hello Thomas。使用sys.argv 即可取得 first.py 及後面參數
sys.argv[0] : first.py
sys.argv[1] : Hello
sys.argv[2] : Thomas
import sys def start(): args=sys.argv for x in args: print(x) if __name__== '__main__': f = start()
模組變數範圍
模組內的變數, 全都可以被任何地方引用,而且無法禁止被引用。但有時後引用了不該用的變數, 可能會造成錯誤。所以就在命名上作了一些不成文的規定,警告使用者 “不應該” 使用。
一般的變數 : v1=10, 表示可以被其他模組引用
不該用變數 : _v2=10, 加上一個底線, 表示不應該被其他模組引用,但還是可以被其他模組引用
特殊的變數 : __v3=10, 加上二個底線, 表示是特殊變數, 還是可以被其他模組引用
def _add(x, y): return x+y def _time(x, y): return x*y def math(f, x, y): if f==1: return _add(x, y) elif f==2: return _time(x, y) else: return None