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類不同的文件中,然後你可以創建包在那些類之外。