python——模块
把定義存放在文件中,為一些腳本或者交互式的解釋器實例使用,這個文件被稱為模塊,也就是說通過利用模塊可以快速運用已經(jīng)設(shè)置好的函數(shù),類似于c中的導(dǎo)入頭文件,運用里面的函數(shù)。
模塊是一個包含所有你定義的函數(shù)和變量的文件,其后綴名是.py。模塊可以被別的程序引入,以使用該模塊中的函數(shù)等功能。這也是使用 python 標(biāo)準(zhǔn)庫的方法。
舉個例子:
#!/usr/bin/python3 # 文件名: using_sys.pyimport sys print('命令行參數(shù)如下:') for i in sys.argv:print(i) print('\n\nPython 路徑為:', sys.path, '\n')輸出: $ python using_sys.py 參數(shù)1 參數(shù)2 命令行參數(shù)如下: using_sys.py 參數(shù)1 參數(shù)2Python 路徑為: ['/root', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']注:
1、import sys 引入 python 標(biāo)準(zhǔn)庫中的 sys.py 模塊;這是引入某一模塊的方法。詳情見導(dǎo)入模塊
2、sys.argv 是一個包含命令行參數(shù)的列表。
3、sys.path 包含了一個 Python 解釋器自動查找所需模塊的路徑的列表。
import 語句
詳情見導(dǎo)入模塊
一個模塊只會被導(dǎo)入一次,不管你執(zhí)行了多少次import。這樣可以防止導(dǎo)入模塊被一遍又一遍地執(zhí)行。
Python的搜索路徑是由一系列目錄名組成的,Python解釋器就依次從這些目錄中去尋找所引入的模塊。事實上,也可以通過定義環(huán)境變量的方式來確定搜索路徑。
搜索路徑是在Python編譯或安裝的時候確定的,安裝新的庫應(yīng)該也會修改。
深入模塊
模塊除了方法定義,還可以包括可執(zhí)行的代碼。這些代碼一般用來初始化這個模塊。這些代碼只有在第一次被導(dǎo)入時才會被執(zhí)行。
每個模塊有各自獨立的符號表,在模塊內(nèi)部為所有的函數(shù)當(dāng)作全局符號表來使用。
所以在模塊內(nèi)部使用這些全局變量,不用擔(dān)心把其他用戶的全局變量搞混。
模塊是可以導(dǎo)入其他模塊的。在一個模塊(或者腳本,或者其他地方)的最前面使用 import 來導(dǎo)入一個模塊,當(dāng)然這只是一個慣例,而不是強制的。被導(dǎo)入的模塊的名稱將被放入當(dāng)前操作的模塊的符號表中。
__name__屬性
一個模塊被另一個程序第一次引入時,其主程序?qū)⑦\行。如果我們想在模塊被引入時,模塊中的某一程序塊不執(zhí)行,我們可以用__name__屬性來使該程序塊僅在該模塊自身運行時執(zhí)行。
#!/usr/bin/python3 # Filename: using_name.pyif __name__ == '__main__':print('程序自身在運行') else:print('我來自另一模塊') $ python using_name.py 程序自身在運行 $ python >>> import using_name 我來自另一模塊 >>>每個模塊都有一個__name__屬性,當(dāng)其值是’main’時,表明該模塊自身在運行,否則是被引入。
說明:name 與 main 底下是雙下劃線,也就是說__name__ 其實有4根下劃線,name左右各2根。 _ _ 是__去掉中間的那個空格后的樣子。
dir() 函數(shù)
內(nèi)置的函數(shù) dir() 可以找到模塊內(nèi)定義的所有名稱。以一個字符串列表的形式返回。
如果沒有給定參數(shù),那么 dir() 函數(shù)會羅列出當(dāng)前定義的所有名稱。
>>> a = [1, 2, 3, 4, 5] >>> import fibo >>> fib = fibo.fib >>> dir() # 得到一個當(dāng)前模塊中定義的屬性列表 ['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys'] >>> a = 5 # 建立一個新的變量 'a' >>> dir() ['__builtins__', '__doc__', '__name__', 'a', 'sys'] >>> >>> del a # 刪除變量名a >>> >>> dir() ['__builtins__', '__doc__', '__name__', 'sys'] >>>標(biāo)準(zhǔn)模塊
有些模塊直接被構(gòu)建在解析器里,這些雖然不是一些語言內(nèi)置的功能,但是他卻能很高效的使用,甚至是系統(tǒng)級調(diào)用也沒問題。
這些組件會根據(jù)不同的操作系統(tǒng)進(jìn)行不同形式的配置,比如 winreg 這個模塊就只會提供給 Windows 系統(tǒng)。
應(yīng)該注意到這有一個特別的模塊 sys ,它內(nèi)置在每一個 Python 解析器中。變量 sys.ps1 和 sys.ps2 定義了主提示符和副提示符所對應(yīng)的字符串。
包
包是一種管理 Python 模塊命名空間的形式,采用"點模塊名稱"。
比如一個模塊的名稱是 A.B, 那么他表示一個包 A中的子模塊 B 。
就好像使用模塊的時候,你不用擔(dān)心不同模塊之間的全局變量相互影響一樣,采用點模塊名稱這種形式也不用擔(dān)心不同庫之間的模塊重名的情況。
這樣不同的作者都可以提供 NumPy 模塊,或者是 Python 圖形庫。
不妨假設(shè)你想設(shè)計一套統(tǒng)一處理聲音文件和數(shù)據(jù)的模塊(或者稱之為一個"包")。
現(xiàn)存很多種不同的音頻文件格式(基本上都是通過后綴名區(qū)分的,例如: .wav,:file:.aiff,:file:.au,),所以你需要有一組不斷增加的模塊,用來在不同的格式之間轉(zhuǎn)換。
并且針對這些音頻數(shù)據(jù),還有很多不同的操作(比如混音,添加回聲,增加均衡器功能,創(chuàng)建人造立體聲效果),所以你還需要一組怎么也寫不完的模塊來處理這些操作。
這里給出了一種可能的包結(jié)構(gòu)(在分層的文件系統(tǒng)中):
sound/ 頂層包__init__.py 初始化 sound 包formats/ 文件格式轉(zhuǎn)換子包__init__.pywavread.pywavwrite.pyaiffread.pyaiffwrite.pyauread.pyauwrite.py...effects/ 聲音效果子包__init__.pyecho.pysurround.pyreverse.py...filters/ filters 子包__init__.pyequalizer.pyvocoder.pykaraoke.py...在導(dǎo)入一個包的時候,Python 會根據(jù) sys.path 中的目錄來尋找這個包中包含的子目錄。
目錄只有包含一個叫做 init.py 的文件才會被認(rèn)作是一個包,主要是為了避免一些濫俗的名字(比如叫做 string)不小心的影響搜索路徑中的有效模塊。
最簡單的情況,放一個空的 :file:init.py就可以了。當(dāng)然這個文件中也可以包含一些初始化代碼或者為(將在后面介紹的) __all__變量賦值。
用戶可以每次只導(dǎo)入一個包里面的特定模塊,比如:
import sound.effects.echo這將會導(dǎo)入子模塊:sound.effects.echo。 他必須使用全名去訪問:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)還有一種導(dǎo)入子模塊的方法是:
from sound.effects import echo這同樣會導(dǎo)入子模塊: echo,并且他不需要那些冗長的前綴,所以他可以這樣使用:
echo.echofilter(input, output, delay=0.7, atten=4)還有一種變化就是直接導(dǎo)入一個函數(shù)或者變量:
from sound.effects.echo import echofilter同樣的,這種方法會導(dǎo)入子模塊: echo,并且可以直接使用他的 echofilter() 函數(shù):
echofilter(input, output, delay=0.7, atten=4)注意當(dāng)使用 from package import item 這種形式的時候,對應(yīng)的 item 既可以是包里面的子模塊(子包),或者包里面定義的其他名稱,比如函數(shù),類或者變量。
import 語法會首先把 item 當(dāng)作一個包定義的名稱,如果沒找到,再試圖按照一個模塊去導(dǎo)入。如果還沒找到,拋出一個 :exc:ImportError 異常。
反之,如果使用形如 import item.subitem.subsubitem 這種導(dǎo)入形式,除了最后一項,都必須是包,而最后一項則可以是模塊或者是包,但是不可以是類,函數(shù)或者變量的名字。
總結(jié)
以上是生活随笔為你收集整理的python——模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二分搜索之x平方根(保留整数)
- 下一篇: websocket python爬虫_p