模組允許邏輯地組織Python程式碼。 將相關程式碼分組到一個模組中,使程式碼更容易理解和使用。 模組是一個具有任意命名屬性的Python物件,可以繫結和參照。
簡單來說,模組是一個由Python程式碼組成的檔案。模組可以定義函式,類和變數。 模組還可以包括可執行的程式碼。
範例
下面是一個名稱為aname
的模組的Python程式碼通常位於一個名稱為aname.py
的檔案中。以下是一個簡單模組的例子:support.py
-
def print_func( par ):
print "Hello : ", par
return
可以通過在其他Python原始檔中執行import
語句來將任何Python原始檔用作模組。匯入具有以下語法 -
import module1[, module2[,... moduleN]
當直譯器遇到匯入語句時,如果模組存在於搜尋路徑中,則匯入該模組。搜尋路徑是匯入模組之前直譯器搜尋的目錄的列表。例如,要匯入模組hello.py
,需要將以下命令放在指令碼的頂部 -
#!/usr/bin/python3
# Import module support
import support
# Now you can call defined function that module as follows
support.print_func("Maxsu")
當執行上述程式碼時,會產生以下結果 -
Hello : Maxsu
不管模組被匯入多少次,模組只能載入一次。這樣可以防止模組執行重複發生,如果有多個匯入。
Python from
語句允許將模組中的特定屬性匯入到當前的名稱空間中。 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
匯入到當前名稱空間中; 它只是將fibonacci
從模組fib
引入匯入模組的全域性符號表。
也可以使用以下import
語句將模組中的所有名稱匯入到當前名稱空間中 -
from modname import *
這提供了將所有專案從模組匯入到當前名稱空間中的簡單方法; 但是,這個說法應該謹慎使用。
在模組中,模組的名稱(作為字串)可用作全域性變數__name__
的值。模組中的程式碼將被執行,就像您匯入它一樣,但是__name__
設定為「__main__
」。
在模組的最後新增這個程式碼 -
#!/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直譯器將按以下順序搜尋模組 -
PYTHONPATH
中搜尋每個目錄。/usr/local/lib/python3/
或者 /usr/sbin/
模組搜尋路徑作為sys.path
變數儲存在系統模組sys
中。sys.path
變數包含當前目錄PYTHONPATH
和依賴於安裝的預設值。
PYTHONPATH
是一個環境變數,由目錄列表組成。 PYTHONPATH
的語法與shell變數`PATH```的語法相同。
這是一個典型的Windows系統上的PYTHONPATH
-
set PYTHONPATH = c:\python34\lib;
這裡是UNIX系統的典型PYTHONPATH
-
set PYTHONPATH = /usr/local/lib/python
變數是對映到物件的名稱(識別符號)。 名稱空間是變數名(鍵)及其對應物件(值)的字典。
global
語句。global VarName
告訴Python VarName
是一個全域性變數。Python停止搜尋本地名稱空間的變數。例如,在全域性名稱空間中定義一個變數Money
。 在函式Money
中為Money
賦值,因此Python將Money
作為區域性變數。
但是,如果在設定之前就存取了本地變數Money
的值,它會產生一個錯誤:UnboundLocalError
。 這裡可以通過取消註釋global
語句來解決問題。如下範例程式碼 -
#!/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()
內建函式返回一個包含由模組定義的名稱的字串的排序列表。這個列表包含模組中定義的所有模組,變數和函式的名稱。 以下是一個簡單的例子 -
#!/usr/bin/python3
# Import built-in module math
import time
content = dir(time)
print (content)
當執行上述程式碼時,會產生以下結果 -
['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'perf_counter', 'process_time', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname']
這裡,特殊的字串變數__name__
是模組的名稱,__file__
是載入模組的檔案名。
globals()
和locals()
函式可用於返回全域性和本地名稱空間中的名稱,具體取決於它們被呼叫的位置。
locals()
從一個函式中呼叫,它將返回從該函式本地存取的所有名稱。globals()
,它將返回從該函式全域性存取的所有名稱。這兩個函式的返回型別是字典。 因此,可以使用keys()
函式提取名稱。
當將模組匯入到指令碼中時,模組的頂級部分的程式碼只能執行一次。
因此,如果要重新執行模組中的頂級程式碼,可以使用reload()
函式。reload()
函式再次匯入以前匯入的模組。 reload()
函式的語法是這樣的 -
reload(module_name)
這裡,module_name
是要重新載入的模組的名稱,而不是包含模組名稱的字串。 例如,要重新載入hello
模組,請執行以下操作 -
reload(hello)
Python中的包是一個分層檔案目錄結構,它定義了一個由模組和子包和子子包組成的Python應用程式環境,等等。
在package
目錄中建立兩個目錄:pkg
和pkg2
, 然後分別在這兩個目錄中建立兩個檔案:a.py
和b.py
。該檔案具有以下一行原始碼 -
檔案: pkg/a.py -
#!/usr/bin/python3
#coding=utf-8
# save file: pkg/a.py
def fun():
print ("I'm pkg.a.fun() ")
檔案: pkg/b.py -
#!/usr/bin/python3
#coding=utf-8
# save file: pkg/b.py
def fun():
print ("I'm pkg.b.fun() ")
檔案: pkg2/a.py -
#!/usr/bin/python3
#coding=utf-8
# save file: pkg2/a.py
def fun():
print ("I'm pkg2.a.fun() ")
檔案: pkg2/b.py -
#!/usr/bin/python3
#coding=utf-8
# save file: pkg2/b.py
def fun():
print ("I'm pkg2.b.fun() ")
在package
目錄中建立一個主程式檔案:main.py
,用於演示如何呼叫包中的各個檔案 -
#!/usr/bin/python3
#coding=utf-8
# save file: phone/pots.py
import pkg.a as a
import pkg.b as b
import pkg2.a as a2
import pkg2.b as b2
a.fun()
b.fun()
a2.fun()
b2.fun()
import pkg2.a
import pkg2.b
print('----------- another way -----------------')
pkg2.a.fun()
pkg2.b.fun()
整個程式碼的目錄如下所示 -
package
|- pkg
|- __init__.py
|- a.py
|- b.py
|- pkg2
|- __init__.py
|- a.py
|- b.py
當執行上述程式碼時,會產生以下結果 -
I'm pkg.a.fun()
I'm pkg.b.fun()
I'm pkg2.a.fun()
I'm pkg2.b.fun()
----------- another way -----------------
I'm pkg2.a.fun()
I'm pkg2.b.fun()
在上面的例子中,將每個檔案中的一個函式作為範例,但是可以在檔案中編寫多個函式。還可以在這些檔案中定義不同的Python類,然後可以使用這些類來建立包。