Python模組介紹

過了即是客發表於2017-03-31

模組

匯入模組

Python官方教程讓我們在Python直譯器中練習。但是當我們結束直譯器,所有的程式碼都消失了。如果我們希望讓程式碼永久儲存的話,就需要將它們儲存到檔案中。每一個以.py結尾的檔案,都是一個Python模組。我們可以在程式碼中使用import關鍵字匯入其他模組。

print(`--------------匯入模組--------------`)

import sys

print(f`{sys.path}`)

匯入模組之後,我們就可以使用該模組中的所有函式了,就像上面那樣。不過這種方式,每次都需要新增模組名和點號。有沒有什麼方法可以向Java的靜態匯入那樣,直接使用函式而不需要模組名呢?當然也是可行的,不過這需要下面的匯入方式。

from io import *

這種方式雖然簡單,但是要注意適當使用。因為有些函式可能出現重名。所以最好的辦法還是使用第一種,當然如果你的程式碼很小,確認沒重名,那麼使用哪種方法都可以。

執行模組

有時候我們不僅需要匯入一個模組的函式,還需要執行一個模組中的程式碼。執行程式碼可以使用下面的命令。

python 檔名.py <引數>

預設情況下,當我們匯入一個模組的時候,它的程式碼就會自動執行。如果我們需要將匯入和執行分隔開,不想在匯入的時候執行模組,就需要在模組中新增類似下面的程式碼。

if __name__ == "__main__":
    # ....

這裡用到了另一個內建變數__name__。當前執行的檔案的__name__的值是__main__,匯入的檔案的__name__是模組的名稱。所以我們可以使用該變數來判斷模組是被匯入的,還是被執行的。

模組的查詢

模組的查詢路徑如下:

  • 包含當前輸入檔案的資料夾(如果沒有就是直譯器的當前資料夾)。
  • PYTHONPATH
    變數(和系統環境變數PATH語法相同)、
  • Python安裝資料夾。

具體說來我們可以使用sys模組的path()方法獲取模組資料夾。

import sys

print(f`{sys.path}`)

在我電腦上輸出如下。

[`D:\Desktop\python-study\python-samples`, `D:\Desktop\python-study\python-samples`, `C:\Python36\python36.zip`, `C:\Python36\DLLs`, `C:\Python36\lib`, `C:\Python36`, `C:\Python36\lib\site-packages`]

dir內建函式

我們都知道在windows命令提示符下輸入dir就會列出當前資料夾資訊,類似Linux中的ls。在Python中也有一個內建函式dir(),它會返回給定模組下定義的所有名稱。如果沒指定引數,那麼dir()函式會返回當前模組下的所有名稱。

定義包

包是一種組織模組的方式。相信你在Java或者其他語言中也已經瞭解過包的作用了。Python官方教程為我們列舉了一個典型的包結構。可以看到,包和一般的資料夾沒什麼區別,關鍵是包資料夾下必須包含一個__init__.py,表明這是一個包。

sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

匯入包

定義了包之後,我們就可以匯入包了。語法和匯入模組類似,不過這次我們需要制定完整包名了。

import sound.effects.echo

當然匯入之後使用的時候也需要制定完整包名。

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

如果嫌麻煩也可以將包內容直接匯入到當前名字空間下。這樣以後使用的時候就不需要寫整個包名了。

from sound.effects import echo

在Python中匯入包、子包、模組的語法完全相同。所以我們可以僅把最末尾的子包直接匯入到當前名字空間下,這樣一方面節省了書寫成本,名字衝突的風險也不會太大。

包匯入控制

如果我們使用from sound.effects import *將所有模組都匯入,會發生什麼事情呢?這樣會將該包下的所有子包的所有模組都匯入。如果包比較大的話就會出現效能問題。所以一般我們都需要對一次性匯入的模組進行控制。

方法也很簡單,在包的__init__.py檔案中,操作__all__變數。在__all__變數中,指定要匯入的包。這樣以後就算使用萬用字元一次性匯入所有模組,也只會匯入這裡定義的模組。

__all__ = ["echo", "surround", "reverse"]


相關文章