Python3模組

模組可以讓你從邏輯上組織你的Python代碼。 將相關的代碼放到一個模組使代碼更容易理解和使用。 模組是可以綁定和參考任意命名的Python對象屬性。

簡單地說,一個模組是 Python 代碼的檔。 一個模組可以定義函數,類和變數。一個模組也可以包括可運行的代碼。

示例

例如:一個名為 aname 模組的 Python代碼通常放在一個指定為 aname.py 的檔中。這裏有一個簡單的模組,support.py 的例子

def print_func( par ):
   print "Hello : ", par
   return

import 語句

您可以通過在其他一些Python原始檔案執行一個import語句,來使用任何Python原始檔案作為一個模組。import 語句的語法如下:

import module1[, module2[,... moduleN] 

當解釋程式遇到import語句,如果模組存在於搜索路徑它將導入這個模組。搜索路徑是一個目錄列表,解釋器導入模組之前將進行搜索。例如,要導入模組 hello.py,需要在腳本的頂部放置下麵的命令 -

#!/usr/bin/python3

# Import module support
import support

# Now you can call defined function that module as follows
support.print_func("Zara")

當執行上面的代碼,它產生以下結果 -
Hello : Zara 

模組被加載一次,不管它是導入(import)的次數。如果多個導入出現,這可以防止模組執行一遍又一遍。

from...import 語句

從Python的聲明語句,您可以從一個模組中導入特定的屬性到當前的命名空間。from...import 的語法如下-

from modname import name1[, name2[, ... nameN]]
例如,從 fib 模組導入 fibonacci 函數,使用下麵的語句-
#!/usr/bin/python3

# Fibonacci numbers module

def fib(n): # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result
>>> from fib import fib
>>> fib(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 

此語句不導入整個 fib 模組到當前的命名空間; 它只是從 fib 模組導入全局符號表中的專案fibonacci。

from...import * 語句:

也可以使用下麵的 import 語句, 將一個模組的所有名稱導入到當前的命名空間 -
from modname import * 

這提供了一種簡單的方法來導入模組到當前命名空間中的所有專案; 不過,這一說法應該儘量少用。

執行模組作為腳本

在一個模組,模組名(做為一個字串)可以作為全局變數__name__的值。該模組中的代碼會被執行,就好像導入它一樣,但設定為“__main__”的 __name__。這意味著,通過在模組的末尾添加以下代碼:

#!/usr/bin/python3

# Fibonacci numbers module

def fib(n): # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result
if __name__ == "__main__":
    f=fib(100)
    print(f)
當我們運行上面的代碼,以下輸出將顯示
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

查找模組

當導入模組,在下面 Python解釋器將搜索模組的序列 -
  • 當前目錄。
  • 如果沒有找到該模組,然後 Python 將搜索 shell 變數 PYTHONPATH 的每個目錄.

  • 如果這些方法都失敗(未找到),Python檢查默認路徑。 在UNIX上,默認路徑通常是 /usr/local/lib/python3/.

模組搜索路徑被存儲在系統模組sys作為所述的 sys.path 變數。sys.path中變數包含當前目錄,PYTHONPATH和安裝相關的默認目錄。

PYTHONPATH 變數:

PYTHONPATH 是一個環境變數,它由一個目錄列表組成。Python路徑中的語法與 shell 變數PATH相同。

下麵是 Windows系統中一個典型的 PYTHONPATH :
set PYTHONPATH=c:\python34\lib;
這裏是 UNIX 系統的典型 PYTHONPATH :
set PYTHONPATH=/usr/local/lib/python

命名空間和範圍界定

變數名稱(標識)映射到對象。命名空間是一組變數(鍵)及其相應的對象(值)的字典。

使用Python編寫的語句可以在本地命名空間和全局命名空間訪問變數。如果本地和全局變數具有相同的名稱,局部變數將覆蓋全局變數。

每個函數都有它自己的本地名稱空間。 類方法與普通的函數遵循相同的範圍規則。

Python作出明智的猜測變數是局部還是全局的。它假定任何變數賦值在函數中的值是局部的。

因此,為了給一個函數內給一個全局變數賦值, 您必須使用global語句。

聲明全局 VarName 告訴 Python 的 VarName 是一個全局變數。Python停止在局部命名空間搜索該變數。

例如,我們在全局命名空間定義一個變數Money。在函數變數 Money,我們給的 Money 的值,因此 Python 假定 Money 作為一個局部變數。 然而,我們將其設置之前計算局部變數 Money 的值, 所以一個 UnboundLocalError 錯誤被引發。取消全局聲明解決了這個問題。

#!/usr/bin/python3

Money = 2000
def AddMoney():
   # Uncomment the following line to fix the code:
   # global Money
   Money = Money + 1

print (Money)
AddMoney()
print (Money)

dir( ) 函數

使用 dir()內置函數返回一個包含由模組定義的名稱字串的排序列表。

該列表包含一個模組中定義的所有的模組,變數和函數的名稱。下麵是一個簡單的例子 -

#!/usr/bin/python3

# Import built-in module math
import math

content = dir(math)

print (content)
當執行上面的代碼,它產生以下結果 -
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan',
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp',
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh',
'sqrt', 'tan', 'tanh'] 

在這裏,特殊字串變數__name__是模組的名稱,__file__是加載模組的檔案名。

globals() 和 locals() 函數−

globals() 和 locals()函數可用於在全局和局部名字空間返回名稱,取決於從哪里調用它們。

如果 locals() 從函數中調用, 它會返回所有可以從函數訪問的名字。

如果 globals() 可以在一個函數中調用,它將返回所有可以在全局範圍內,可從函數訪問的名字。

兩種這些函數的返回類型是字典。因此,名稱可以使用 keys() 函數來提取。

reload() 函數

當模組被導入到一個腳本,在模組的頂層部的代碼只執行一次。

因此,如果你希望模組重新執行的頂層代碼, 可以使用 reload()函數。在reload()函數會再次導入先前導入模組。reload()函數的語法是這樣的 -

reload(module_name) 

在這裏,module_name 是要重新加載模組,而不是包含模組名稱的字串。例如,要重新加載模組 hello,請執行下列操作 −

reload(hello)

Python包

包是一個分層檔目錄結構,定義由模組和子包和子子包等一個單一的Python應用環境。
考慮在 Phone 目錄下找到的檔Pots.py。此檔的源代碼如下面的行 -
#!/usr/bin/python3

def Pots():
   print ("I'm Pots Phone")
類似的方式,這裏有不同功能的兩個相同名稱檔如下 -
  • Phone/Isdn.py有一個函數 Isdn()

  • Phone/G3.py 有一個函數 G3()

現在,在 Phone 目錄中創建一個檔__init__.py-
  • Phone/__init__.py

為了讓所有的功能可用,當導入Phone,需要把明確 import 語句在 __init__.py 中如下 -

from Pots import Pots
from Isdn import Isdn
from G3 import G3
在添加這些行到 __init__.py 後,當導入 Phone 包所有的這些類可用。
#!/usr/bin/python3

# Now import your Phone Package.
import Phone

Phone.Pots()
Phone.Isdn()
Phone.G3()
當執行上面的代碼,它產生以下結果 -
I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone 

在上面的例子中,我們已經在每個檔採取一個單一的函數示例,但可以保留多個函數在檔中。您還可以定義這些Python類不同的檔中,然後你可以創建包在那些類之外。


上一篇: Python3函數 下一篇: Python3檔方法