Pyhton學習筆記六:模組
阿新 • • 發佈:2018-12-21
- 為了編寫可維護的程式碼,我們把函式分組,分別放到不同的資料夾裡,在python中,一個.py檔案就稱之為一個模組(Module)
- 使用模組有什麼好處呢:一是:大大提高了程式碼的可維護性,當一個模組編寫完成以後,就可以在其他地方引用這些模組;二是:使用模組避免函式名和變數名衝突,相同名字的函式和變數可以存在不同的模組中,但也要注意,不要與內建函式名衝突;
- 為了避免不同的人編寫的模組名相同,python又引入了按目錄來組織模組的方法,成為包(Package);
- 舉個例子,一個
abc.py
的檔案就是一個名字叫abc
的模組,一個xyz.py
的檔案就是一個名字叫xyz
的模組,現在假設我們的這兩個模組的名字與其他模組衝突了,我們可以通過包來組織模組,方法就是選擇一個頂層包名,比如mycompany
- 引入了包以後,只要頂層的包名不與其他人衝突,把所有模組就不會與其他人衝突,現在
abc.py
模組的名字就變成了mycompany.abc
,類似的,xyz.py
的模組名變成了mycompany.xyz
;請注意,每一個包目錄下面都有一個__int__.py
的檔案,這個檔案時必須存在的,否則python就會這個目錄變成一個普通的目錄,而不是一個包,__int__.py
可以是一個空檔案,也可以有程式碼,因為,__int__.py
本身就是一個模組,而他的模組名就是mycompany
; - 類似的可以有多級目錄,組成多層級的包結構:
- 檔案
www.py
模組名就是mycompany.web.www
utils.py
的模組名分別是mycompany.utils
和mycompany.web.utils
; - mycompany.web也是一個模組,該模組對應的是
__int__.py
檔案; - 自己建立模組時要注意命名,不能和Python自帶的模組名稱衝突。例如,系統自帶了
sys
模組,自己的模組就不可命名為sys.py
,否則將無法匯入系統自帶的sys
模組。
1. 使用模組
1.1 使用模組
- python內建了很多有用的模組,安裝完畢即可使用,下面以內建的
sys
模組為例,編寫一個hello
的模組:
#!/user/bin/env python3 本行註釋可以讓此`hello.py`檔案直接在linux/mac/unix上執行
# -*- coding: utf-8 -*- 本行註釋表示.py檔案使用標準UTF-8編碼
' a test module ' # 任何程式碼模組的第一個字串都被視為模組的文件註釋
__author__ = 'Michael Zhao' # 使用__author__變數把作者寫進去,當你公開原始碼的時候,別人就能看見你的名字
# 以上為python模組的標準檔案模板,後面是真正程式碼部分
import sys # 匯入sys模組,我們就有了變數sys指向sys模組,利用sys這個變數就可以訪問sys模組的所有功能
def test():
args = sys.argv
if len(args)==1:
print('Hello, world!')
elif len(args)==2:
print('Hello, %s!' % args[1])
else:
print('Too many arguments!')
if __name__ == '__main__':
test()
-
sys
模組有一個argv
變數,用list儲存了命令列的所有引數,argv
至少有一個元素,因為第一個引數永遠是該.py檔案的名稱,如:執行python3 hello.py
獲得的sys.argv
就是['hello.py']
;執行python3 hello.py Micheal
獲得的sys.argv
就是['hello.py', 'Michael']
。 -
最後注意到最後兩行程式碼:當我們在命令列執行
hello
模組檔案時,python直譯器把一個特殊變數__name__
置為__main__
,而如果在其他地方匯入該hello
模組時,if
判斷失敗,因此,這種if
測試可以讓一個模組通過命令列執行時執行一些額外的程式碼,最常見的就是執行測試。 -
當我們用命令列執行
hello.py
時:
$ python hello.py
Hello, world!
$ python hello.py Michael
Hello, Michael!
- 當我們啟動python互動式環境,再匯入
hello
模組:
(base) E:\4_Programe\1_Python\3_Code\1_LiaoDaDa>python
Python 3.7.0 (default, Jun 28 2018, 08:04:48) [MSC v.1912 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello # 匯入時,沒有列印Hello, world!,因為沒有執行test()函式
>>> hello.test() # 呼叫hello.test()時,才打印Hello, world!
Hello, world!
1.2 作用域
- 在一個模組中,會定義很多變數和函式,有些我們只是希望自己使用,並不像別人共用,所以在python中是通過
_
字首來實現的:正常的函式和變數名時公開的,可以被直接引用,比如:abc
,x123
,PI
等; - 類似於
__xxx__
這樣的變數是特殊變數,可以被直接引用,但是有特殊用途,我們自己的變數一般不要用這種變數名; - 類似於
_xxx
和__xxx
這樣的函式或變數就是非公開的(private),不應該被直接引用,如:_abc
,__abc
等;不應該被直接引用不代表不能被直接引用,是因為從程式設計習慣上不應該引用private函式或變數; - private函式或變數不應該被被人引用,那他有什麼用呢?請看:
def _private_1(name):
return 'Hello, %s' % name
def _private_2(name):
return 'Hi, %s' % name
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
- 我們在模組裡公開
greeting()
函式,而把內部邏輯用private函式隱藏起來了,這樣,呼叫greeting()
函式不用關心內部的private函式細節,這也是一種非常有用的程式碼封裝和抽象的方法,即:外部不需要引用的函式全部定義成private,只有外部需要引用的函式才定義為public。
2. 安裝第三方模組
- 在Python中,安裝第三方模組是通過包管理工具pip完成的
- 在Linux/Mac中安裝pip這個步驟可以跳過,若在win中,確定安裝python的時候,勾選了
pip
和Add python.exe to Path
,在命令提示符視窗下嘗試執行pip
,如果沒有報錯,則正常 - 安裝第三方庫Pillow的命令是:
pip install Pillow # 耐心等待下載安裝即可
2.1 安裝常用模組
- 安裝Anaconda,內建了很多第三方庫;
2.2 模組搜尋路徑
- 當我們試圖載入一個模組時,Python會在指定的路徑下搜尋對應的.py檔案,如果找不到,就會報錯;
>>> import mymodule
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'mymodule'
- 預設情況下,Python直譯器會搜尋當前目錄,所有已安裝的內建模組和第三方模組,搜尋路徑放在
sys
模組的path
變數中:
>>> import sys
>>> sys.path
['', 'E:\\1_Install_Total\\8_Anaconda\\python37.zip', 'E:\\1_Install_Total\\8_Anaconda\\DLLs', 'E:\\1_Install_Total\\8_Anaconda\\lib', 'E:\\1_Install_Total\\8_Anaconda', 'E:\\1_Install_Total\\8_Anaconda\\lib\\site-packages', 'E:\\1_Install_Total\\8_Anaconda\\lib\\site-packages\\win32', 'E:\\1_Install_Total\\8_Anaconda\\lib\\site-packages\\win32\\lib', 'E:\\1_Install_Total\\8_Anaconda\\lib\\site-packages\\Pythonwin']
- 如果要自己新增路徑,有兩種方法:
- 直接修改
sys.path
,新增要搜尋的目錄:
>>> import sys
>>> sys.path.append('/User/michael/my_py_scripts')
# 這種方法是在執行時修改,執行結束以後失效
- 設定環境變數
PYTHONPATH
,該環境變數的內容會被自動新增到模組搜尋路徑中。設定方式與設定Path環境變數類似。注意只需要新增你自己的搜尋路徑,Python自己本身的搜尋路徑不受影響。