首頁 > 軟體

Python學習之包與模組詳解

2022-03-19 13:01:40

大家好,學完物件導向與例外處理機制之後,接下里我們要學習 包與模組 。首先我們要了解什麼是包?什麼是模組?接下來我們還要學習 如何自定義建立包、自定義建立模組以及如何匯入包與模組。最後我們在學習如何使用第三方包,第三方包就是別人開發好的包。關於包的課程學完之後,就是檔案的讀寫,通過學習這方面的知識,可以讓我們動態的建立檔案、編輯檔案、閱讀檔案。當我們具備檔案的基礎讀寫能力之後,我們就可以學習一些相關的模組了,如 yaml檔案模組、json檔案與模組、紀錄檔模組....

接下來我們就開始學習 包與模組 ,通過學習該部分之後,我們就可以靈活運用 Python 在各個領域中了。比如 web 開發,我們就可以使用 web 相關的包與模組。有很多人在為 python 做貢獻,他們貢獻的就是這些 包與模組。而之前我們學習的課程,也都是在為我們學習包與模組在做準備,一句話總結,學會 包與模組 是真正學會 Python 的重要標誌。

什麼是 Python 的包與模組

  • 包的定義:簡單粗暴的解釋,當一個資料夾內包含一個 __init__.py 檔案時我們就可以認為它是一個包;如果該資料夾下還有子資料夾且該子資料夾中也有一個 __init__.py 檔案,我們就可以認為它是包中還有包。
  • 模組的定義:任何 *.py 格式的檔案都可以當作模組,我們可以使用 import 關鍵字對其執行匯入操作。

我們都知道每一個模組下都是 Python 的函數,所以我們使用一個包或者模組,最終的目的就是使用他們內部函數的功能幫助我們實現業務需要。

一個包裡,可以有一個或多個模組;通過呼叫 包 下面某個 模組 的某個函數去執行,這就是我們使用 Python包或模組的目的

包的身份證

__init__.py 檔案時每一個 python 包必須存在的檔案,只有存在 __init__.py 檔案的目錄,python 直譯器才會認為這是一個 包 ;如果沒有該檔案, python 直譯器只會認為這是一個普通的資料夾。示意圖如下:

從上圖我們看出來,除了 __init__.py 檔案之外,包的目錄檔案圖示有個圓形的小圓點式的圖案。而普通資料夾沒有任何標識。試想一下,如果我們在 python_package_test 資料夾內建立一個 __init__.py 檔案會怎樣?44944…

如何建立包

其實已經不再需要多說什麼了,首先建立一個資料夾。然後在資料夾中建立一個 python 包的身份證檔案 __init__.py 即可;__init__.py 檔案可以空空如也,什麼都不用寫,只要保證該檔案的名字是 __init__.py 即可。 Python 解釋就會認為這是一個包,之後我們就可以在包裡書寫任意的指令碼(也就是模組),非常的簡單。不過我們還需要建立包的良好規範:

  • 首先要有一個主題,功能明確,同時也要方便使用;方便別人看一眼名字就知道是否需要使用你這個包。
  • 其次層次要分明,一個包內可以有很多各模組或者子包。它們之間的關係要明確,這也為後期維護程式碼起到很好的輔助作用。

除了上述的建立資料夾之後再建立包的身份檔案 __init__.py 之外,Pycharm 還可以直接通過 new ---> Python Package 的方式,直接建立一個包。示意圖如下:

建立包的小練習

接下來我們嘗試建立一個 animal 的包,同時在 animal 包下建立一個 cat 包 和 dog 包。然後分別在 cat 包與 dog 包中建立一個 action.py 模組,並且在各自的 action.py 模組定義 eat()、jump()、run() 函數。

同樣的方法在 dog 子包內建立 action.py 模組,內容如下:

# coding:utf-8


def eat():
    return '狗愛啃骨頭'


def run():
    return '貓會跑'


def jump():
    return '貓會跳'

這裡我們建立了 cat 與 dog 兩個子包,實際上真正有功能的是兩個子包中的 action.py 模組。在這兩個模組內,各有三個函數 eat()、run()、jump()。所以我們的最終目的是使用分別來自 cat 與 dog 兩個子包的 action.py 模組的三個函數,接下來我們就看一下如果匯入、呼叫這兩個子包與使用子包內的函數。

包的匯入 - import

如果想要使用一個 包 或者 模組 ,就需要先將其匯入到我們當前的指令碼中。在學習 python 指令碼結構 的章節,我們曾經介紹過,在指令碼的頂部為 頭部註釋 區域;接下來就是 匯入區域 ,匯入區域 就是將我們需要的包、模組匯入到我們當前的指令碼中。接下來 我們看一下 包的匯入 import 關鍵字的用法:

# 用法:
import package

# 引數:
# package:被匯入的包的名字

# 要求:
# 只有 python 包才能被 impor 關鍵字捕獲並匯入,也就是說 python 包中必須要有 __init__.py 這個檔案
# 並且 import 只會拿到當前對應包下的 __init__.py 中的功能或當前模組下的功能

關於 import 只會拿到當前對應包下的 __init__.py 中的功能或當前模組下的功能 可能不是那麼好理解,接下來 我們在 Pycharm 做個小實驗,加深一下理解。

首先開啟 Terminal 終端,輸入 python 啟動 Python 直譯器。然後匯入 animal 包,然後使用 animal 包下的 cat子包。如下圖:

這裡發現報錯了,屬性錯誤 animal 裡沒有 cat 這個屬性;這是為什麼?cat 這個子包 確實在我們的 animal 包下啊。再做個小實驗,我們在 animal 包下的 __init__.py 檔案內書寫一些內容。

然後退出我們的 python 直譯器再進入,為什麼要退出呢?這是因為我們的包的當前結構發生了變化,所以需要退出再重新進入,否則 在 Treminal 終端執行的仍然是之前的結果。這個時候我們再重新 import animal 的包,然後執行以下看看。

這時候在結合剛剛我們說的 import 只會拿到當前對應包下的 __init__.py 中的功能或當前模組下的功能 , 如果想要呼叫一個包中或者模組中的函數函數功能,只需要通過包或者模組的名稱 + . 的形式去呼叫它的函數名就可以了。這個方法是不是和我們物件導向的使用方式很相似呢?

現在又有一個問問題了,剛剛我們匯入的是 animal 包以及使用了 __init__.py 檔案中的功能,那麼我們我們該如何使用 animal 包下的 cat / dog 子包中的函數功能呢? 繼續往下,我們看看 模組的匯入 部分

模組的匯入 - from…import

接下來我們學習如何通過包匯入對應的模組,這一次我們需要 fromimport 兩個關鍵字來配合了;當這兩個關鍵字配合起來之後,就可以通過某個包找到對應的模組。接下來 我們看一下 from...import... 的用法

# 用法:
from package import module

# 引數:
# package:要匯入的包名
# module:包中的目標模組

# from package import module 的意思就是 從當前的包中匯入某個模組


# 範例如下:

from animal import dog
dog.run()

# 通過 from ... import ... 直接找到了 dog 模組
# 所以只需要使用 dog 模組 直接用 . 的方式找到裡面的 run 方法就可以執行了

接下來我們嘗試 參照上文的 animal 包 匯入 dog 的子包 呼叫裡面的 run 函數,內容如下:

匯入子包及子包函數的呼叫

這裡我們發現了一個問題,兩個子包下面都有 action 模組,當我們分別 匯入呼叫的時候會被覆蓋,有沒有什麼辦法讓我們同時匯入兩個子包的 action 模組,分別可以呼叫但是互不影響呢?這就需要藉助到我們的as 關鍵字 了。 在我們學習異常的時候,利用 as 關鍵字 關鍵字將捕獲的異常進行一個起別名的操作,在這裡我們依然可以對我們匯入的模組起別名。如下圖

現在我們是直接通過匯入模組來呼叫 action 模組下的函數,那可不可以直接呼叫函數來使用的呢?嘗試一下:

匯入主包及主包的函數呼叫

首先我們在主包 animal 的子包同級路徑下建立一個 main.py 檔案,並定義一個 main 函數,然後再進行呼叫。內容如下:

# coding:utf-8


def animal():
    return '這是一個 animal 包下子包同級路徑下的模組的函數'

然後我們呼叫該 main.py 檔案的 animal 函數

匯入的包與子包模組之間過長如何優化

我們來看一下 匯入 animal 包下 cat 子包 的 action 模組的 eat() 函數的匯入

前文我們提到過 import 只會拿到當前對應包下的 __init__.py 中的功能或當前模組下的功能 ,那麼我們是否可以把 cat 與 dog 子包中的函數匯入到 animal 包下的 __init__.py ?

接下來 我們嘗試一下 在 animal 包 同級別下建立一個 animal_test.py 檔案,然後在 animal_test.py 檔案內匯入 子包獲取其函數。

注意:這裡的 animal_test.py 指令碼 需要與 animal 包處於同一級別的檔案加下,才可以匯入我們定義好的 __init__.py 檔案的函數功能;如果不在同一個檔案的級別下,匯入是不成功的,大家可以自己手動試一下。

強大的第三方包

上面我們學習了什麼是 python 的包,以及如何建立一個包,並通過匯入的方法使用我們的包與模組。在上面對包的使用相當於是我們自己開發自己使用,屬於一種自產自銷的模式。而接下來我們要學習使用他人開發好的第三方包來幫助我們高效的工作,學完這一小章節我們就可以從浩瀚的第三方包選擇我們需要的包來幫助我們自己完成我們想要的功能。

比如爬蟲的包可以幫助我們爬取圖片、文章等各種我們想要的資料;繪圖的包可以幫我們對各種圖片進行處理…

什麼是第三方包

其實第三方包就是其他程式設計師公開到 Python 指定網站上寫好的功能封裝成包或者模組,方便其他程式設計師方便下載和使用。

使用第三方包最大的好處就是我們想要實現的功能可能別人已經幫助我們寫好了,我們只需要拿來主義,直接應用在我們自己的程式碼中就可以了,這樣自然就大大的提高了我們的開發效率

如何安裝第三方包

瞭解了第三方包之後,我們需要去下載並安裝他們才可以在我們的程式碼中使用。而 pip 與 easy_install就是獲取第三方包的工具,在我們安裝好python 的時候,pip 就已經自動安裝好了,我們只需要在 Terminal 終端 去使用即可;

隨著 python 的發展越來越快,pip 的使用率也越來越高,就逐漸的替代了 easy_install 。

我們剛剛說的 在我們安裝好 python 的時候,就自動的安裝了 pip 其實是有版本限制的,在 Python 3.4 版本之前是不會安裝 pip 的; Python 3.4 版本之後,會自帶這兩種包管理工具。

如果使用的是 老版本的 python ,可以通過 https://pip.pypa.io/en/stable/installing/ 去下載安裝 pip

由於 pip 管理工具中的第三方包要比 easy_install 多很多,所以我們主要介紹 pip 的使用。pip 的用法也是非常簡單的,我們只需要在 Terminal 終端,輸入 pip install 包名 就可以進行下載並安裝。

這裡也推薦大家一個 python 程式設計師的寶藏網站,github.com 搜尋 python 第三方包 (github 會伴隨程式設計師的完整職業生涯);在 github 有很多程式設計師公開出來的第三方包,自然也有 python 的。需要注意的是 github 是一個國外的網站,所以存取的有點慢,大家可以 kexueshangwang 。或者也可以臨時使用 國內的映象源地址 ,在下方的 pip 安裝拓展 小節有介紹。

pip 安裝 第三包

# 查詢當前 pip 版本:
pip -V

# 執行結果如下:
# pip 21.1.2 from D:PycharmProjectsXXXXXXXXXXvenvlibsite-packagespip (python 3.10)

PS:每一個版本的 python 都有自己的 pip ,所以當我們安裝了多個版本的 python 後,猶豫 python 版本太多,所以如果我們使用錯了 pip ,就會造成我們有的時候看著像是已經安裝好了第三方包,但卻無法使用的情況。所以這個地方是一定要注意的!!!

安裝第一個第三方包工具 - ipython

接下來我們就嘗試一下安裝我們第一個第三方包 - ipython;

ipython 是一個 python 的互動式 shell ,比預設的 python shell 好用很多,支援變數自動補全,自動縮排。

在 Terminal 終端,輸入 pip install ipython ,如果報錯:WARNING: You are using pip version 21.1.2; however, version 22.0.4 is available. 可以通過 kexueshangwang 的方式安裝、或 臨時使用國內映象源地址、再或者 升級 你的 pip ;升級 命令 python -m pip install --upgrade pip

這裡看到,我們安裝失敗了;利用我們上面說的方法 kexueshangwang 的方式們再次安裝

當看到 Successfully 則表示我們已經安裝成功了,雖然仍提示 WARNING 讓我們升級 pip ,但是我們依然安裝成功。試試看 ipython 是否可以正常使用。

通過與 python 自帶的 shell 終端相比, ipython 不僅互動更方便,還可以自動支援變數自動補全,自動縮排。凸顯了極大的人性化的便捷性。

這裡還有個需要注意的地方,當我們的環境安裝了 多個版本的 python 時,一定要檢查我們安裝的路徑對不對,否則就會出現安裝到其他版本 python 的 情況。如下圖:

當然瞭如果預設是進入我們其他版本的 python 或者 ipython 我們可以通過 python3 或者 ipython3 的命令進入到我想要進去的版本的互動終端。

注意:在我們平時執行一個指令碼的時候,我們還是推薦使用 python 直譯器,ipython 只是作為我們的一個偵錯環境使用。

pip 安裝拓展

實際上我們安裝 pip 和 第三方包 是有選擇的,預設情況下選擇的是國外的地址去下載並安裝,由於網路與距離的原因往往會很慢,同時因為網路波動問題會造成我們安裝失敗的情況。

在這種情況下,我們國內就推出了一寫可以就近進行下載和安裝的地址,比如我們的 清華、阿里雲、中國科技大學、華中理工大學等都提供了近源地址。如下:

# 官方源地址
# https://pypi.python.org/simple/
# https://pypi.tuna.tsinghua.edu.cn/simple/

# 國內源地址
# 阿里雲:http://mirrors.aliyun.com/pypi/simple/ 
# 中國科技大學:https://pypi.mirrors.ustc.edu.cn/simple/
# 豆瓣:http://pypi.douban.com/simple/
# 清華大學:https://pypi.tuna.tsinghua.edu.cn/simple/
# 中國科學技術大學:http://pypi.mirrors.ustc.edu.cn/simple/

# 使用方法如下:

pip install -i http://pypi.douban.com/simple/ ipython
pip install -i http://pypi.douban.com/simple/ ipython==7.12.0   # 指定版本號安裝

pip 安裝第三方包的解除安裝

既然可以安裝,那就肯定可以解除安裝。解除安裝方法如下:

# 解除安裝方法:

pip uninstall ipython

# 這裡同樣需要注意,被解除安裝的第三方包對應的 python 直譯器版本的問題。

總結

今天該章節主要介紹了什麼是包,什麼是模組。如何匯入包、模組,匯入子包、主包如何呼叫他們的函數。最後又講述瞭如何安裝、使用、解除安裝第三方包。

以上就是Python學習之包與模組詳解的詳細內容,更多關於Python包 模組的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com