1. 程式人生 > >Pyhton學習筆記六:模組

Pyhton學習筆記六:模組

  • 為了編寫可維護的程式碼,我們把函式分組,分別放到不同的資料夾裡,在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.utilsmycompany.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中是通過_字首來實現的:正常的函式和變數名時公開的,可以被直接引用,比如:abcx123PI等;
  • 類似於__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的時候,勾選了pipAdd 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']
  • 如果要自己新增路徑,有兩種方法:
  1. 直接修改sys.path,新增要搜尋的目錄:
>>> import sys
>>> sys.path.append('/User/michael/my_py_scripts')
# 這種方法是在執行時修改,執行結束以後失效
  1. 設定環境變數PYTHONPATH,該環境變數的內容會被自動新增到模組搜尋路徑中。設定方式與設定Path環境變數類似。注意只需要新增你自己的搜尋路徑,Python自己本身的搜尋路徑不受影響。