Python - 模塊module


一、什麼是模塊

Python中,一個.py文件就稱之爲一個模塊。
那麼使用模塊有什麼好處呢?

(1)提高了代碼的可維護性。
(2)代碼不必從零開始,當一個模塊編寫完畢後,就可以被其他地方應用。
(3)可以避免函數名和變量名衝突,相同的函數名和變量可以存放在不同的模塊中,但是要注意儘量不要與內置函數名字衝突。
Python所有的內置函數:https://docs.python.org/3/lib...

爲避免模塊名衝突,python又引入了按目錄來阻止模塊衝突的方法,稱爲(python package)。
一個abc.py的文件就是一個名字爲abc的模塊,一個xyz.py的文件就是一個名字爲xyz的模塊。假如abcxyz這兩個模塊名字與其他模塊衝突了,於是我們可以通過不同的包來組織模塊,避免模塊衝突。
則可爲:

↓ mycompany      # 按目錄存放
     _init_.py   # 模塊名:mycompany
     abc.py      # 模塊名:mycompany.abc
     xyz.py      # 模塊名:mycompany.xyz

引入了包以後,只要頂層的包名不與別人衝突,那所有模塊都不會與別人衝突。
每一個包目錄下都會有一個_init_.py的文件,這個文件是必須存在的,否則python就把這個目錄當成普通目錄,而不是一個包。
_init_.py可以是空文件,也可以有python代碼,因爲_init_.py本身就是一個模塊。

二、使用Python自帶模塊

Python內置了很多非常有用的模塊,只要安裝完畢,這些模塊就可以通過import立刻導入使用。
例如下列小程序:以自建的sys模塊,編寫一個hello的模塊hello.py

# !/usr/bin/env python    # -1-
# -*-coding:utf-8 -*-     # -2- 
_author_ = 'xionglp'      # 使用_author_變量把作者寫進去

import 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()

說明:

  • 註釋 # -1- :讓該.py文件直接在unix/linux/mac上運行
  • 註釋 # -2- :.py文件使用標準UTF-8 編碼
  • import sys:導入sys模塊。之後便可以利用sys這個變量,訪問sys模塊的所有功能。
    sys模塊有一個argv變量,用list存儲了命令行的所有參數。argv至少有一個元素,因爲第一個參數永遠是該.py文件的名稱。
  • 當在命令行運行hello.py文件時,python解釋器就把一個特殊變量__name__置爲__main__。如果在其他地方導入該模塊時,if判斷將失敗,即if僅在此模塊單獨運行時生效。因此這種if測試可以讓一個模塊通過命令行運行時執行一些額外的代碼,最常見的就是運行測試。

在交互式環境(cmd)中導入該模塊:

>>> import hello                         
>>> hello.test()                   
hello, world! 

三、安裝使用第三方模塊

除了Python自己的包,還可以安裝安裝第三方模塊。第三方包安裝是通過包管理工具pip完成的。
一般來說,第三方庫都會在Python官方的pypi.python.org網站註冊。所以要安裝一個第三方庫,必須先知道該庫的名稱,可以在官網或者pypi上搜索。比如Pillow的名稱叫Pillow,因此,安裝Pillow的命令就是:pip install Pillow

  • 步驟1:找到安裝Python路徑中的easy_install.exe,例如:D:PythonScripts
  • 步驟2:打開cmd,輸入安裝命令:easy_install.exe pip (pip安裝成功)
  • 步驟3:在cmd下執行pip,輸入命令:pip install pillow

如下:
clipboard.png

安裝成功後便可以使用Pillow了。其他常用的第三方庫還有:MySQL的驅動、用於科學計算的NumPy庫等等。

pip升級:
在使用pip進行安裝時,有時候會提示pip的版本太低,需要upgrade。提示會給出要執行的語句,按照提示執行就行。
執行命令:python –m pip install –upgrade pip

四、模塊搜索路徑

我們也可以導入自己寫入的模塊。當我們試圖加載一個模塊時,Python會在指定的路徑下搜索對應的.py文件,如果找不到,就會報錯,例如:

clipboard.png

默認情況下,Python解釋器會搜索當前目錄、所有已安裝的內置模塊和第三方模塊,搜索路徑存放在sys模塊的path變量中:

>>>import sys
>>>sys.path

如果我們要添加自己的搜索目錄,有兩種方法:

  • 法一:直接修改sys.path,添加要搜索的目錄,這種方法是在運行時修改,運行結束後失效。
>>> import sys
>>> sys.path.append('/Users/xionglp/my_py_scripts')
  • 法二:設置環境變量PYTHONPATH,該環境變量的內容會被自動添加到模塊搜索路徑中。設置方式與設置Path環境變量類似。注意只需要添加你自己的搜索路徑,Python自己本身的搜索路徑不受影響。

【補充點能量】if __name__ =="__main__":

  • __name__:爲系統變量,有兩個取值。當模塊是被調用執行時,取值爲模塊的名字;當模塊是直接執行時,則該變量取值爲__name__
  • if __name__ == "__main__"實現的功能:可以讓模塊既可以導入到別的模塊中用,也可以自己執行。
英文解釋說:make a script both importable and executeable

例如:新建模塊atest.py

# !/usr/bin/env python3
# -*- coding:utf-8 -*-
'a test module'
def addFunc(a, b):
    return a + b
print('a_test_module\'s result is ', addFunc(1, 1))

新建模塊anothertest.py

# !/usr/bin/env python3
# -*- coding :utf-8 -*-
'another test module'
import  atest
print('調用another test module模塊執行的結果時:',atest.addFunc(12,23))

運行:

D:\Python_project>python atest.py
a_test_module's result is  2
D:\Python_project>python anothertest.py
a_test_module's result is  2
調用another test module模塊執行的結果時: 35

說明:當運行anothertest.py的時候,先運行了atest.py,再運行anothertest.py。
若不希望出現atest的內容,python提供了一個系統變量:__name__。可以把被調用的測試代碼寫在if語句裏,當調用該module時,此時的__name__取值爲該模塊的名字,所以if判斷爲假,不執行後續代碼如下:

if __name__ == '__main__':`
       print ('atest的計算結果:',addFunc(1,1))

則運行結果爲:

D:\Python_project>python anothertest.py
調用another test module模塊執行的結果時: 35

此時我們就得到了預期結果,不輸出多餘的結果。


❤ thanks for watching, keep on updating...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章