鍍金池/ 教程/ Python/ Python3模塊
Python3文件操作
Python3日期和時間
Python3基礎(chǔ)語法
Python3字典
Python3元組
Python3文件方法
Python3字符串
Python3引入什么新的東西?
Python3異常處理
Python3模塊
Python3數(shù)字
Python3變量類型
Python3函數(shù)
Python3循環(huán)
Python3 os文件目錄的方法
Python3 while循環(huán)語句
Python3斷言
Python3基本運算符
Python3環(huán)境安裝設(shè)置
Python3標準異常
Python3嵌套循環(huán)
Python3教程
Python3決策
Python3 for循環(huán)語句
Python3列表

Python3模塊

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

簡單地說,一個模塊是 Python 代碼的文件。 一個模塊可以定義函數(shù),類和變量。一個模塊也可以包括可運行的代碼。

示例

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

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

import 語句

您可以通過在其他一些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")
當執(zhí)行上面的代碼,它產(chǎn)生以下結(jié)果 -
Hello : Zara 

模塊被加載一次,不管它是導(dǎo)入(import)的次數(shù)。如果多個導(dǎo)入出現(xiàn),這可以防止模塊執(zhí)行一遍又一遍。

from...import 語句

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

from modname import name1[, name2[, ... nameN]]
例如,從 fib 模塊導(dǎo)入 fibonacci 函數(shù),使用下面的語句-
#!/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...import * 語句:

也可以使用下面的 import 語句, 將一個模塊的所有名稱導(dǎo)入到當前的命名空間 -
from modname import * 

這提供了一種簡單的方法來導(dǎo)入模塊到當前命名空間中的所有項目; 不過,這一說法應(yīng)該盡量少用。

執(zhí)行模塊作為腳本

在一個模塊,模塊名(做為一個字符串)可以作為全局變量__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]

查找模塊

當導(dǎo)入模塊,在下面 Python解釋器將搜索模塊的序列 -
  • 當前目錄。
  • 如果沒有找到該模塊,然后 Python 將搜索 shell 變量 PYTHONPATH 的每個目錄.

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

模塊搜索路徑被存儲在系統(tǒng)模塊sys作為所述的 sys.path 變量。sys.path中變量包含當前目錄,PYTHONPATH和安裝相關(guān)的默認目錄。

PYTHONPATH 變量:

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

下面是 Windows系統(tǒng)中一個典型的 PYTHONPATH :
set PYTHONPATH=c:\python34\lib;
這里是 UNIX 系統(tǒng)的典型 PYTHONPATH :
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)

dir( ) 函數(shù)

使用 dir()內(nèi)置函數(shù)返回一個包含由模塊定義的名稱字符串的排序列表。

該列表包含一個模塊中定義的所有的模塊,變量和函數(shù)的名稱。下面是一個簡單的例子 -

#!/usr/bin/python3

# Import built-in module math
import math

content = dir(math)

print (content)
當執(zhí)行上面的代碼,它產(chǎn)生以下結(jié)果 -
['__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() 函數(shù)?

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

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

如果 globals() 可以在一個函數(shù)中調(diào)用,它將返回所有可以在全局范圍內(nèi),可從函數(shù)訪問的名字。

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

reload() 函數(shù)

當模塊被導(dǎo)入到一個腳本,在模塊的頂層部的代碼只執(zhí)行一次。

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

reload(module_name) 

在這里,module_name 是要重新加載模塊,而不是包含模塊名稱的字符串。例如,要重新加載模塊 hello,請執(zhí)行下列操作 ?

reload(hello)

Python包

包是一個分層文件目錄結(jié)構(gòu),定義由模塊和子包和子子包等一個單一的Python應(yīng)用環(huán)境。
考慮在 Phone 目錄下找到的文件Pots.py。此文件的源代碼如下面的行 -
#!/usr/bin/python3

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

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

現(xiàn)在,在 Phone 目錄中創(chuàng)建一個文件__init__.py-
  • Phone/__init__.py

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

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

# Now import your Phone Package.
import Phone

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

在上面的例子中,我們已經(jīng)在每個文件采取一個單一的函數(shù)示例,但可以保留多個函數(shù)在文件中。您還可以定義這些Python類不同的文件中,然后你可以創(chuàng)建包在那些類之外。