一、什麼是模塊
Python中,一個.py
文件就稱之爲一個模塊。
那麼使用模塊有什麼好處呢?
(1)提高了代碼的可維護性。
(2)代碼不必從零開始,當一個模塊編寫完畢後,就可以被其他地方應用。
(3)可以避免函數名和變量名衝突,相同的函數名和變量可以存放在不同的模塊中,但是要注意儘量不要與內置函數名字衝突。
Python所有的內置函數:https://docs.python.org/3/lib...
爲避免模塊名衝突,python又引入了按目錄來阻止模塊衝突的方法,稱爲包(python package)。
一個abc.py
的文件就是一個名字爲abc
的模塊,一個xyz.py
的文件就是一個名字爲xyz
的模塊。假如abc
和xyz
這兩個模塊名字與其他模塊衝突了,於是我們可以通過不同的包來組織模塊,避免模塊衝突。
則可爲:
↓ 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
如下:
安裝成功後便可以使用Pillow了。其他常用的第三方庫還有:MySQL的驅動、用於科學計算的NumPy庫等等。
pip升級:
在使用pip進行安裝時,有時候會提示pip的版本太低,需要upgrade。提示會給出要執行的語句,按照提示執行就行。
執行命令:python –m pip install –upgrade pip
四、模塊搜索路徑
我們也可以導入自己寫入的模塊。當我們試圖加載一個模塊時,Python會在指定的路徑下搜索對應的.py
文件,如果找不到,就會報錯,例如:
默認情況下,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...