簡單地說,一個模塊是 Python 代碼的文件。 一個模塊可以定義函數(shù),類和變量。一個模塊也可以包括可運行的代碼。
例如:一個名為 aname 模塊的 Python代碼通常放在一個指定為 aname.py 的文件中。這里有一個簡單的模塊,support.py 的例子
def print_func( par ): print "Hello : ", par return
您可以通過在其他一些Python源文件執(zhí)行一個import語句,來使用任何Python源文件作為一個模塊。import 語句的語法如下:
import module1[, module2[,... moduleN]
當解釋程序遇到import語句,如果模塊存在于搜索路徑它將導(dǎo)入這個模塊。搜索路徑是一個目錄列表,解釋器導(dǎo)入模塊之前將進行搜索。例如,要導(dǎo)入模塊 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
模塊被加載一次,不管它是導(dǎo)入(import)的次數(shù)。如果多個導(dǎo)入出現(xiàn),這可以防止模塊執(zhí)行一遍又一遍。
從Python的聲明語句,您可以從一個模塊中導(dǎo)入特定的屬性到當前的命名空間。from...import 的語法如下-
from modname import name1[, name2[, ... nameN]]
#!/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]
此語句不導(dǎo)入整個 fib 模塊到當前的命名空間; 它只是從 fib 模塊導(dǎo)入全局符號表中的項目fibonacci。
from modname import *
這提供了一種簡單的方法來導(dǎo)入模塊到當前命名空間中的所有項目; 不過,這一說法應(yīng)該盡量少用。
在一個模塊,模塊名(做為一個字符串)可以作為全局變量__name__的值。該模塊中的代碼會被執(zhí)行,就好像導(dǎo)入它一樣,但設(shè)定為“__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 將搜索 shell 變量 PYTHONPATH 的每個目錄.
如果這些方法都失敗(未找到),Python檢查默認路徑。 在UNIX上,默認路徑通常是 /usr/local/lib/python3/.
模塊搜索路徑被存儲在系統(tǒng)模塊sys作為所述的 sys.path 變量。sys.path中變量包含當前目錄,PYTHONPATH和安裝相關(guān)的默認目錄。
PYTHONPATH 是一個環(huán)境變量,它由一個目錄列表組成。Python路徑中的語法與 shell 變量PATH相同。
set PYTHONPATH=c:\python34\lib;
set PYTHONPATH=/usr/local/lib/python
變量名稱(標識)映射到對象。命名空間是一組變量(鍵)及其相應(yīng)的對象(值)的字典。
使用Python編寫的語句可以在本地命名空間和全局命名空間訪問變量。如果本地和全局變量具有相同的名稱,局部變量將覆蓋全局變量。
每個函數(shù)都有它自己的本地名稱空間。 類方法與普通的函數(shù)遵循相同的范圍規(guī)則。
Python作出明智的猜測變量是局部還是全局的。它假定任何變量賦值在函數(shù)中的值是局部的。
因此,為了給一個函數(shù)內(nèi)給一個全局變量賦值, 您必須使用global語句。
聲明全局 VarName 告訴 Python 的 VarName 是一個全局變量。Python停止在局部命名空間搜索該變量。
例如,我們在全局命名空間定義一個變量Money。在函數(shù)變量 Money,我們給的 Money 的值,因此 Python 假定 Money 作為一個局部變量。 然而,我們將其設(shè)置之前計算局部變量 Money 的值, 所以一個 UnboundLocalError 錯誤被引發(fā)。取消全局聲明解決了這個問題。
#!/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)
該列表包含一個模塊中定義的所有的模塊,變量和函數(shù)的名稱。下面是一個簡單的例子 -
#!/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__是加載模塊的文件名。
如果 locals() 從函數(shù)中調(diào)用, 它會返回所有可以從函數(shù)訪問的名字。
兩種這些函數(shù)的返回類型是字典。因此,名稱可以使用 keys() 函數(shù)來提取。
因此,如果你希望模塊重新執(zhí)行的頂層代碼, 可以使用 reload()函數(shù)。在reload()函數(shù)會再次導(dǎo)入先前導(dǎo)入模塊。reload()函數(shù)的語法是這樣的 -
reload(module_name)
在這里,module_name 是要重新加載模塊,而不是包含模塊名稱的字符串。例如,要重新加載模塊 hello,請執(zhí)行下列操作 ?
reload(hello)
#!/usr/bin/python3 def Pots(): print ("I'm Pots Phone")
Phone/Isdn.py有一個函數(shù) Isdn()
Phone/G3.py 有一個函數(shù) G3()
為了讓所有的功能可用,當導(dǎo)入Phone,需要把明確 import 語句在 __init__.py 中如下 -
from Pots import Pots from Isdn import Isdn from G3 import G3
#!/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
在上面的例子中,我們已經(jīng)在每個文件采取一個單一的函數(shù)示例,但可以保留多個函數(shù)在文件中。您還可以定義這些Python類不同的文件中,然后你可以創(chuàng)建包在那些類之外。