這篇文章主要介紹了Python中關(guān)于使用模塊的基礎(chǔ)知識(shí),是Python入門(mén)的基礎(chǔ),需要的朋友可以參考下
一個(gè)模塊可以在邏輯上組織Python代碼,
Python中關(guān)于使用模塊的基礎(chǔ)知識(shí)
。將相關(guān)的代碼到一個(gè)模塊中,使代碼更容易理解和使用。模塊是可以綁定和借鑒任意命名屬性的Python對(duì)象。簡(jiǎn)單地說(shuō),一個(gè)模塊是由Python代碼的文件。一個(gè)模塊可以定義函數(shù),類(lèi)和變量。模塊還可以包括可運(yùn)行的代碼。
例子:
Python代碼的模塊名為aname通常位于一個(gè)名為aname.py。下面是一個(gè)簡(jiǎn)單的模塊,support.py作為例子
def print_func( par ): print "Hello : ", par return
import語(yǔ)句:
可以通過(guò)在其他一些Python源文件執(zhí)行import語(yǔ)句來(lái)使用任何Python源文件作為一個(gè)模塊。import的語(yǔ)法如下:
import module1[, module2[,... moduleN]
當(dāng)解釋器遇到import語(yǔ)句,它導(dǎo)入(import)模塊如果模塊出現(xiàn)在搜索路徑。搜索路徑是一個(gè)目錄列表,該解釋器導(dǎo)入模塊之前搜索。例如,導(dǎo)入模塊hello.py,需要把下面的命令在腳本的頂部:
#!/usr/bin/python# Import module supportimport support# Now you can call defined function that module as followssupport.print_func("Zara")
當(dāng)執(zhí)行上面的代碼,產(chǎn)生以下結(jié)果:
Hello : Zara
一個(gè)模塊被加載一次,不管導(dǎo)入的次數(shù)。這可防止模塊執(zhí)行發(fā)生多次導(dǎo)入。
from...import 語(yǔ)句
Python的from語(yǔ)句可以從一個(gè)模塊中導(dǎo)入特定的屬性到當(dāng)前的命名空間。from...import 語(yǔ)法如下:
from modname import name1[, name2[, ... nameN]]
例如,從模塊fib導(dǎo)入函數(shù)fibonacci,使用下面的語(yǔ)句:
from fib import fibonacci
此語(yǔ)句不導(dǎo)入整個(gè)模塊fib到當(dāng)前的命名空間;它只是介紹了fibonacci從模塊fib導(dǎo)入模塊的全局符號(hào)表列。
from...import * 語(yǔ)句:
它也可以通過(guò)使用下面的import語(yǔ)句導(dǎo)入從模塊到當(dāng)前的命名空間的所有名稱(chēng):
from modname import *
這提供了導(dǎo)入從模塊到當(dāng)前的命名空間中的所有項(xiàng)目一個(gè)簡(jiǎn)單的方法;不過(guò),這個(gè)語(yǔ)句應(yīng)謹(jǐn)慎使用。
定位模塊:
當(dāng)導(dǎo)入一個(gè)模塊,在下列序列模塊由Python解釋器搜索:
當(dāng)前目錄
如果未找到該模塊,然后Python搜索在shell變量PYTHONPATH每個(gè)目錄
如果這些方法都失敗,Python會(huì)檢查默認(rèn)路徑。在UNIX上,默認(rèn)路徑是正常是/usr/local/lib/python/
模塊搜索路徑被存儲(chǔ)在系統(tǒng)模塊sys作為所述的sys.path變量。在sys.path的變量包含當(dāng)前目錄,PYTHONPATH和相關(guān)的默認(rèn)安裝。
PYTHONPATH變量:
在PYTHONPATH是一個(gè)環(huán)境變量,包括目錄列表中。 PYTHONPATH的語(yǔ)法shell變量PATH相同。
下面是Windows系統(tǒng)的典型PYTHONPATH:
set PYTHONPATH=c:\python20\lib;
這里是UNIX系統(tǒng)的典型PYTHONPATH:
set PYTHONPATH=/usr/local/lib/python
命名空間和作用域:
變量名稱(chēng)(標(biāo)識(shí))映射到對(duì)象。名稱(chēng)空間是變量名(鍵)及其相應(yīng)的對(duì)象(的值)的字典。
Python語(yǔ)句可以在本地命名空間和全局命名空間訪(fǎng)問(wèn)變量。如果局部和全局變量同名,局部變量屏蔽全局變量。
每個(gè)函數(shù)都有自己的命名空間。類(lèi)方法遵循相同的作用域規(guī)則為普通函數(shù)。
Python對(duì)變量是否為局部或全局進(jìn)行假定猜測(cè)。它假定任何變量賦值函數(shù)中的值是局部的。
因此為了使一個(gè)函數(shù)內(nèi)的值賦給一個(gè)全局變量,必須先使用global語(yǔ)句,
電腦資料
《Python中關(guān)于使用模塊的基礎(chǔ)知識(shí)》(http://m.oriental01.com)。聲明 global VarName 告訴Python VarName是一個(gè)全局變量。Python 停止尋找該變量的局部命名空間。
例如,我們?cè)谌置臻g中定義的變量Money 。在該函數(shù)的Money ,我們給定Money 的值,因此Python 假定Money 為局部變量。但是,我們?cè)O(shè)定它,所以一個(gè)UnboundLocalError是結(jié)果之前訪(fǎng)問(wèn)的局部變量Money 的值。取消global語(yǔ)句解決了這個(gè)問(wèn)題。
#!/usr/bin/pythonMoney = 2000def AddMoney(): # Uncomment the following line to fix the code: # global Money Money = Money + 1print MoneyAddMoney()print Money
dir( ) 函數(shù):
使用dir()內(nèi)置函數(shù)返回一個(gè)包含一個(gè)模塊中定義名稱(chēng)的字符串的排序列表。
該列表包含在一個(gè)模塊中定義的所有模塊,變量和函數(shù)的名稱(chēng)。下面是一個(gè)簡(jiǎn)單的例子:
#!/usr/bin/python# Import built-in module mathimport mathcontent = dir(math)print content;當(dāng)執(zhí)行上面的代碼,產(chǎn)生以下結(jié)果:[‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘a(chǎn)cos‘, ‘a(chǎn)sin‘, ‘a(chǎn)tan‘, ‘a(chǎn)tan2‘, ‘ceil‘, ‘cos‘, ‘cosh‘, ‘degrees‘, ‘e‘, ‘exp‘, ‘fabs‘, ‘floor‘, ‘fmod‘, ‘frexp‘, ‘hypot‘, ‘ldexp‘, ‘log‘,‘log10‘, ‘modf‘, ‘pi‘, ‘pow‘, ‘radians‘, ‘sin‘, ‘sinh‘, ‘sqrt‘, ‘tan‘, ‘tanh‘]
在這里,特殊字符串變量__name__是模塊的名稱(chēng),__file__是從中加載的模塊的文件名。
globals()和 locals()函數(shù):
globals() 和 locals() 函數(shù)可用于返回在根據(jù)在它們被稱(chēng)為位置的全局和局部名稱(chēng)空間的名稱(chēng)。
如果locals()被一個(gè)函數(shù)中調(diào)用時(shí),它會(huì)返回所有可以在局部從函數(shù)訪(fǎng)問(wèn)的名稱(chēng)。
如果globals()從一個(gè)函數(shù)中調(diào)用時(shí),它會(huì)返回所有可以從全局函數(shù)進(jìn)行訪(fǎng)問(wèn)的名稱(chēng)。
這兩個(gè)函數(shù)的返回類(lèi)型是字典。因此,名稱(chēng)可以使用keys()函數(shù)提取出來(lái)。
reload()函數(shù):
當(dāng)該模塊被導(dǎo)入到一個(gè)腳本,在一個(gè)模塊的頂層部分的代碼只執(zhí)行一次。
因此,如果你想重新執(zhí)行的頂級(jí)代碼模塊中,可以使用reload()函數(shù)。reload()函數(shù)導(dǎo)入先前導(dǎo)入的模塊了。reload()函數(shù)的語(yǔ)法是這樣的:
reload(module_name)
在這里,module_name是要重裝,不包含模塊名字符串的模塊的名稱(chēng)。例如,要重新加載hello模塊,請(qǐng)執(zhí)行以下操作:
reload(hello)
Python中的包:
包是用于定義由模塊和子包和子子包等的單一的Python應(yīng)用環(huán)境的分層文件目錄結(jié)構(gòu)。
考慮一個(gè)文件Pots.py在Phone目錄中可用。此文件的源代碼如下一行:
#!/usr/bin/pythondef Pots(): print "I‘m Pots Phone"
類(lèi)似的方法,我們具有不同功能的另兩個(gè)文件具有相同的名稱(chēng)如上:
Phone/Isdn.py文件有函數(shù) Isdn()
Phone/G3.py 文件有函數(shù) G3()
現(xiàn)在,創(chuàng)建在Phone目錄中多了一個(gè)文件__init__.py:
Phone/__init__.py
為了讓所有的功能可用,當(dāng)導(dǎo)入Phone,需要把__init__.py明確的import語(yǔ)句如下:
from Pots import Potsfrom Isdn import Isdnfrom G3 import G3
當(dāng)添加完這些行到__init__.py,那么已經(jīng)導(dǎo)入了Phone包所有這些類(lèi)的使用。
#!/usr/bin/python# Now import your Phone Package.import PhonePhone.Pots()Phone.Isdn()Phone.G3()
當(dāng)執(zhí)行上面的代碼,產(chǎn)生以下結(jié)果:
I‘m Pots PhoneI‘m 3G PhoneI‘m ISDN Phone
在上面的例子我們采取示例每個(gè)文件單個(gè)函數(shù),但可以保留文件中多個(gè)函數(shù)。還可以在這些文件定義不同的Python類(lèi),可以在包外創(chuàng)建那些類(lèi)。