1.python模塊是:
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供南關(guān)網(wǎng)站建設(shè)、南關(guān)做網(wǎng)站、南關(guān)網(wǎng)站設(shè)計、南關(guān)網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、南關(guān)企業(yè)網(wǎng)站模板建站服務(wù),十余年南關(guān)做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
python模塊:包含并且有組織的代碼片段為模塊。
表現(xiàn)形式為:寫的代碼保存為文件。這個文件就是一個模塊。sample.py 其中文件名smaple為模塊名字。
關(guān)系圖:
2.python包是:
包是一個有層次的文件目錄結(jié)構(gòu),它定義了由n個模塊或n個子包組成的python應(yīng)用程序執(zhí)行環(huán)境。
通俗一點:包是一個包含__init__.py 文件的目錄,該目錄下一定得有這個__init__.py文件和其它模塊或子包。
常見問題:
引入某一特定路徑下的模塊
使用sys.path.append(yourmodulepath)
將一個路徑加入到python系統(tǒng)路徑下,避免每次通過代碼指定路徑
利用系統(tǒng)環(huán)境變量?export PYTHONPATH=$PYTHONPATH:yourmodulepath,
直接將這個路徑鏈接到類似/Library/Python/2.7/site-packages目錄下
好的建議:
經(jīng)常使用if __name__ == '__main__',保證寫包既可以import又可以獨立運行,用于test。
多次import不會多次執(zhí)行模塊,只會執(zhí)行一次??梢允褂胷eload來強(qiáng)制運行模塊,但不提倡。
常見的包結(jié)構(gòu)如下:
package_a
├── __init__.py
├── module_a1.py
└── module_a2.py
package_b
├── __init__.py
├── module_b1.py
└── module_b2.py
main.py
如果main.py想要引用packagea中的模塊modulea1,可以使用:
from package_a import module_a1
import package_a.module_a1
如果packagea中的modulea1需要引用packageb,那么默認(rèn)情況下,python是找不到packageb。我們可以使用sys.path.append('../'),可以在packagea中的__init__.py添加這句話,然后該包下得所有module都添加*?import __init_即可。
關(guān)系圖:
3.庫(library)
庫的概念是具有相關(guān)功能模塊的集合。這也是Python的一大特色之一,即具有強(qiáng)大的標(biāo)準(zhǔn)庫、第三方庫以及自定義模塊。
在操作文件的時候,我們肯定是要使用到 os 模塊的,但是 os 模塊里面還有 path 模塊,這個模塊主要是用來獲取文件的屬性的。這篇博客來分享一下 path 模塊的函數(shù),希望對學(xué)習(xí) Python 的小伙伴有所幫助。
返回絕對路徑:
返回文件名:
返回list(多個路徑)中,所有path共有的最長的路徑:
返回文件路徑:
路徑存在則返回True,路徑損壞返回False:
路徑存在則返回True,路徑損壞也返回True:
把path中包含的" "和" user"轉(zhuǎn)換成用戶目錄:
根據(jù)環(huán)境變量的值替換path中包含的" {name}":
返回最近訪問時間(浮點型秒數(shù)):
返回最近文件修改時間:
返回文件 path 創(chuàng)建時間:
返回文件大小,如果文件不存在就返回錯誤:
判斷是否為絕對路徑:
判斷路徑是否為文件:
判斷路徑是否為目錄:
判斷路徑是否為鏈接:
判斷路徑是否為掛載點:
把目錄和文件名合成一個路徑:
轉(zhuǎn)換path的大小寫和斜杠:
規(guī)范path字符串形式:
返回path的真實路徑:
從start開始計算相對路徑:
判斷目錄或文件是否相同:
判斷fp1和fp2是否指向同一文件:
判斷stat tuple stat1和stat2是否指向同一個文件:
把路徑分割成 dirname 和 basename,返回一個元組:
一般用在 windows 下,返回驅(qū)動器名和路徑組成的元組:
分割路徑中的文件名與拓展名:
把路徑分割為加載點與文件:
遍歷path,進(jìn)入每個目錄都調(diào)用visit函數(shù),visit函數(shù)必須有3個參數(shù)(arg, dirname, names),dirname表示當(dāng)前目錄的目錄名,names代表當(dāng)前目錄下的所有文件名,args則為walk的第三個參數(shù):
設(shè)置是否支持unicode路徑名:
隨著使用python的時間越來越長,安裝的python模塊也越來越多,有的模塊不常用,也漸漸會忘了里面有哪些函數(shù);或者,一個新的python模塊,沒有官方文檔,要想知道調(diào)用哪些函數(shù),怎么調(diào)用那些函數(shù),于是乎就需要查看一下自己安裝的python模塊里有哪些函數(shù),現(xiàn)將查看方法總結(jié)如下
在命令行下運行如下命令即可查看
在交互式解釋器中輸入如下命令即可,效果跟在命令行下輸入 $ pydoc modules 是一樣的。
python的sys模塊也是可以用來查看模塊信息的
如果你使用的是 pip 來作為你的 python 包管理器的話,可以在命令行下直接運行 $ pip freeze/code 或者 code$ pip list 來查看安裝包的信息,當(dāng)然其它的包管理器也有類似的功能,同時,你也可以在python交互式解釋器中導(dǎo)入pip模塊來查看包信息。
如果你安裝過 yolk 的話可以使用 yolk 命令來查看包信息,你可以使用 $ pip install yolk 來安裝它 yolk 使用簡單,只需在命令行下操作即可。
一 .module
通常模塊為一個文件,直接使用import來導(dǎo)入就好了。可以作為module的文件類型有".py"、".pyo"、".pyc"、".pyd"、".so"、".dll"。
二. package
通常包總是一個目錄,可以使用import導(dǎo)入包,或者from + import來導(dǎo)入包中的部分模塊。包目錄下為首的一個文件便是 __init__.py。然后是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那么它就是這個包的子包了。
一.模塊你可以使用import語句將一個源代碼文件作為模塊導(dǎo)入.例如:
[python]?view plain?copy
#?file?:?spam.py
a?=?37????????????????????#?一個變量
def?foo:??????????????????#?一個函數(shù)
print?"I'm?foo"
class?bar:????????????????#?一個類
def?grok(self):
print?"I'm?bar.grok"
b?=?bar()?????????????????#?創(chuàng)建一個實例
使用import spam 語句就可以將這個文件作為模塊導(dǎo)入。系統(tǒng)在導(dǎo)入模塊時,要做以下三件事:
1.為源代碼文件中定義的對象創(chuàng)建一個名字空間,通過這個名字空間可以訪問到模塊中定義的函數(shù)及變量。
2.在新創(chuàng)建的名字空間里執(zhí)行源代碼文件.
3.創(chuàng)建一個名為源代碼文件的對象,該對象引用模塊的名字空間,這樣就可以通過這個對象訪問模塊中的函數(shù)及變量,如: ?
[python]?view plain?copy
import?spam???????????#?導(dǎo)入并運行模塊?spam
print?spam.a??????????#?訪問模塊?spam?的屬性
spam.foo()
c?=?spam.bar()
用逗號分割模塊名稱就可以同時導(dǎo)入多個模塊:
[python]?view plain?copy
import?socket,?os,?regex
模塊導(dǎo)入時可以使用 as 關(guān)鍵字來改變模塊的引用對象名字:
[python]?view plain?copy
import?os?as?system
import?socket?as?net,?thread?as?threads
system.chdir("..")
net.gethostname()
使用from語句可以將模塊中的對象直接導(dǎo)入到當(dāng)前的名字空間. from語句不創(chuàng)建一個到模塊名字空間的引用對象,而是把被導(dǎo)入模塊的一個或多個對象直接放入當(dāng)前的名字空間:
[python]?view plain?copy
from?socket?import?gethostname?#?將gethostname放如當(dāng)前名字空間
print?gethostname()????????????#?直接調(diào)用
socket.gethostname()???????????#?引發(fā)異常NameError:?socket
from語句支持逗號分割的對象,也可以使用星號(*)代表模塊中除下劃線開頭的所有對象:
[python]?view plain?copy
from?socket?import?gethostname,?socket
from?socket?import?*???#?載入所有對象到當(dāng)前名字空間
不過,如果一個模塊如果定義有列表__all__,則from module import * 語句只能導(dǎo)入__all__列表中存在的對象。
[python]?view plain?copy
#?module:?foo.py
__all__?=?[?'bar',?'spam'?]?????#?定義使用?`*`?可以導(dǎo)入的對象
另外, as 也可以和 from 聯(lián)合使用:
[python]?view plain?copy
from?socket?import?gethostname?as?hostname
h?=?hostname()
import 語句可以在程序的任何位置使用,你可以在程序中多次導(dǎo)入同一個模塊,但模塊中的代碼*僅僅*在該模塊被首次導(dǎo)入時執(zhí)行。后面的import語句只是簡單的創(chuàng)建一個到模塊名字空間的引用而已。sys.modules字典中保存著所有被導(dǎo)入模塊的模塊名到模塊對象的映射。這個字典用來決定是否需要使用import語句來導(dǎo)入一個模塊的最新拷貝.
from module import * 語句只能用于一個模塊的最頂層.*特別注意*:由于存在作用域沖突,不允許在函數(shù)中使用from 語句。?
每個模塊都擁有 __name__ 屬性,它是一個內(nèi)容為模塊名字的字符串。最頂層的模塊名稱是 __main__ .命令行或是交互模式下程序都運行在__main__ 模塊內(nèi)部. 利用__name__屬性,我們可以讓同一個程序在不同的場合(單獨執(zhí)行或被導(dǎo)入)具有不同的行為,象下面這樣做:
[python]?view plain?copy
#?檢查是單獨執(zhí)行還是被導(dǎo)入
if?__name__?==?'__main__':
#?Yes
statements
else:
#?No?(可能被作為模塊導(dǎo)入)
statements
模塊搜索路徑
導(dǎo)入模塊時,解釋器會搜索sys.path列表,這個列表中保存著一系列目錄。一個典型的sys.path 列表的值:
Linux:
['', '/usr/local/lib/python2.0',
'/usr/local/lib/python2.0/plat-sunos5',
'/usr/local/lib/python2.0/lib-tk',
'/usr/local/lib/python2.0/lib-dynload',
'/usr/local/lib/python2.0/site-packages']
Windows:
['', 'C:\\WINDOWS\\system32\\python24.zip', 'C:\\Documents and Settings\\weizhong', 'C:\\Python24\\DLLs', 'C:\\Python24\\lib', 'C:\\Python24\\lib\\plat-win', 'C:\\Python24\\lib\\lib-tk', 'C:\\Python24\\Lib\\site-packages\\pythonwin', 'C:\\Python24', 'C:\\Python24\\lib\\site-packages', 'C:\\Python24\\lib\\site-packages\\win32', 'C:\\Python24\\lib\\site-packages\\win32\\lib', 'C:\\Python24\\lib\\site-packages\\wx-2.6-msw-unicode']
空字符串 代表當(dāng)前目錄. 要加入新的搜索路徑,只需要將這個路徑加入到這個列表.?
模塊導(dǎo)入和匯編
到現(xiàn)在為止,本章介紹的模塊都是包含Python源代碼的文本文件. 不過模塊不限于此,可以被 import 語句導(dǎo)入的模塊共有以下四類:?
?使用Python寫的程序( .py文件)
?C或C++擴(kuò)展(已編譯為共享庫或DLL文件)
?包(包含多個模塊)
?內(nèi)建模塊(使用C編寫并已鏈接到Python解釋器內(nèi))
當(dāng)查詢模塊 foo 時,解釋器按照 sys.path 列表中目錄順序來查找以下文件(目錄也是文件的一種):?
1.定義為一個包的目錄 foo
2.foo.so, foomodule.so, foomodule.sl,或 foomodule.dll (已編譯擴(kuò)展)
3.foo.pyo (只在使用 -O 或 -OO 選項時)
4.foo.pyc
5.foo.py
對于.py文件,當(dāng)一個模塊第一次被導(dǎo)入時,它就被匯編為字節(jié)代碼,并將字節(jié)碼寫入一個同名的 .pyc文件.后來的導(dǎo)入操作會直接讀取.pyc文件而不是.py文件.(除非.py文件的修改日期更新,這種情況會重新生成.pyc文件) 在解釋器使用 -O 選項時,擴(kuò)展名為.pyo的同名文件被使用. pyo文件的內(nèi)容雖去掉行號,斷言,及其他調(diào)試信息的字節(jié)碼,體積更小,運行速度更快.如果使用-OO選項代替-O,則文檔字符串也會在創(chuàng)建.pyo文件時也被忽略.
如果在sys.path提供的所有路徑均查找失敗,解釋器會繼續(xù)在內(nèi)建模塊中尋找,如果再次失敗,則引發(fā) ImportError 異常.?
.pyc和.pyo文件的匯編,當(dāng)且僅當(dāng)import 語句執(zhí)行時進(jìn)行.?
當(dāng) import 語句搜索文件時,文件名是大小寫敏感的。即使在文件系統(tǒng)大小寫不敏感的系統(tǒng)上也是如此(Windows等). 這樣, import foo 只會導(dǎo)入文件foo.py而不會是FOO.PY.
重新導(dǎo)入模塊
如果更新了一個已經(jīng)用import語句導(dǎo)入的模塊,內(nèi)建函數(shù)reload()可以重新導(dǎo)入并運行更新后的模塊代碼.它需要一個模塊對象做為參數(shù).例如:?
import foo
... some code ...
reload(foo)????????? # 重新導(dǎo)入 foo
在reload()運行之后的針對模塊的操作都會使用新導(dǎo)入代碼,不過reload()并不會更新使用舊模塊創(chuàng)建的對象,因此有可能出現(xiàn)新舊版本對象共存的情況。 *注意* 使用C或C++編譯的模塊不能通過 reload() 函數(shù)來重新導(dǎo)入。記住一個原則,除非是在調(diào)試和開發(fā)過程中,否則不要使用reload()函數(shù).
函數(shù)是組織好,可重復(fù)使用的,用來實現(xiàn)相關(guān)功能的代碼段
函數(shù)提高了代碼的重復(fù)利用率和應(yīng)用的模塊性。
除Python自帶的函數(shù)之外,也可以自己創(chuàng)建函數(shù),叫做自定義函數(shù)
語法:
函數(shù)代碼塊以 def 開頭
參數(shù)為 輸入值 ,放于函數(shù)名后口號里面,
函數(shù)內(nèi)容以冒號:開始,函數(shù)體縮進(jìn), return 返回 輸出值
函數(shù)調(diào)用使用關(guān)鍵字參數(shù)來確定傳入的參數(shù)值,此時,如果多個函數(shù)則不需要按照指定順序。
在定義函數(shù)時,指定參數(shù)默認(rèn)值。調(diào)用時如果不傳入?yún)?shù),則使用默認(rèn)值
不定長部分如果沒有指定參數(shù),傳入是一個空元組
加了 兩個星號 ** 的參數(shù)會以字典的形式導(dǎo)入
/ 用來指明函數(shù)形參必須使用指定位置參數(shù),不能使用關(guān)鍵字參數(shù)的形式。
3.8版本之后的才能使用
不使用 def 定義函數(shù),沒有函數(shù)名
lamdba主體時一個表達(dá)式,而不是代碼塊,函數(shù)體比def簡單很多
定義在函數(shù)內(nèi)部的為局部變量,僅能在函數(shù)內(nèi)部使用
定義在函數(shù)外部的為全局變量,可在全局使用
模塊是將包含所有定義的函數(shù)和變量的文件,一般將同類功能的函數(shù)組和在一起稱為模塊。
模塊需要導(dǎo)入后,在調(diào)用相應(yīng)函數(shù)進(jìn)行使用
模塊導(dǎo)入的方法:
從模塊中導(dǎo)入一個指定的部分
把一個模塊的所有內(nèi)容全都導(dǎo)入