Python 標(biāo)準(zhǔn)庫系列之模塊介紹

Python的模塊其實(shí)就是封裝了一個(gè)或者多個(gè)功能的代碼集合,以便于重用,模塊可以是一個(gè)文件也可以是一個(gè)目錄,目錄的形式稱作包。

模塊分類

內(nèi)置模塊

內(nèi)置模塊可以理解成當(dāng)你安裝好python環(huán)境之后,直接可以使用import導(dǎo)入的就是內(nèi)置模塊,默認(rèn)模塊路徑為:C:Python35lib,你也可以通過以下方式獲取內(nèi)置模塊的路徑:

# 導(dǎo)入sys模塊

>>>importsys

# 最后一個(gè)目錄就是內(nèi)置模塊的路徑

>>>forninsys.path:

...print(n)

...

C:Python35libsite-packagespip-8.1.1-py3.5.egg

C:Python35python35.zip

C:Python35DLLs

C:Python35lib

C:Python35

C:Python35libsite-packages

第三方模塊

第三方模塊通常是開發(fā)者自己編寫的模塊,然后提交到python官方的庫中,這樣我們就可以下載安裝使用了,默認(rèn)安裝目錄為C:Python35libsite-packages,

自定義模塊

自己編寫的模塊

模塊的導(dǎo)入方式

把一個(gè)模塊當(dāng)做成一個(gè)整體來進(jìn)行導(dǎo)入

import sys

從一個(gè)模塊中導(dǎo)入特定的變量或者是方法

from sys import path

調(diào)用的時(shí)候直接使用方法名path

>>>path

['','C:\Python35\lib\site-packages\pip-8.1.1-py3.5.egg','C:\Python35\python35.zip','C:\Python35\DLLs','C:\Python35\lib','C:\Python35','C:\Python35\lib\site-packages']

給導(dǎo)入的模塊或者方法起一個(gè)別名

from sys import path as path_alias

調(diào)用的時(shí)候使用別名path_alias

>>>path_alias

['','C:\Python35\lib\site-packages\pip-8.1.1-py3.5.egg','C:\Python35\python35.zip','C:\Python35\DLLs','C:\Python35\lib','C:\Python35','C:\Python35\lib\site-packages']

添加默認(rèn)的環(huán)境變量,當(dāng)前生效

sys.path.append("PATH_NAME")

可以使用imp模塊中的reload方法重新載入某個(gè)模塊的方法,例如下面的實(shí)例:

$catsimple.py

#!/use/bin/env python

print('Hello, World!')

spam=1

>>>import simple

Hello,World!

>>>simple.spam

1

>>>simple.spam+=1

>>>importsimple

>>>simple.spam

2

>>>importimp

>>>imp.reload(simple)

Hello,World!

>>>simple.spam

1

模塊導(dǎo)入順序

先在當(dāng)前腳本目錄尋找有沒有與導(dǎo)入模塊名稱相同的文件,如果有就把這個(gè)文件當(dāng)作模塊導(dǎo)入(據(jù)不完全統(tǒng)計(jì),這是個(gè)坑,測(cè)試re模塊沒有問題,但是測(cè)試sys模塊就有問題了)

查找模塊路徑下面有沒有對(duì)應(yīng)的模塊名

如果沒有找到模塊名就報(bào)錯(cuò)

import是如何工作的?

模塊在被導(dǎo)入的時(shí)候會(huì)執(zhí)行以下三個(gè)步驟:

通過環(huán)境變量找到模塊文件;

編譯成字節(jié)碼文件,如果有字節(jié)碼文件則導(dǎo)入字節(jié)碼文件;

執(zhí)行模塊中的代碼來創(chuàng)建所定義的對(duì)象;

以上的三個(gè)步驟只有在程序運(yùn)行時(shí),模塊被第一次導(dǎo)入時(shí)才會(huì)進(jìn)行。如果已經(jīng)導(dǎo)入了這個(gè)模塊然后再次導(dǎo)入的時(shí)候會(huì)跳過上面的三個(gè)步驟,它會(huì)直接提取內(nèi)存中已經(jīng)加載的模塊對(duì)象。Python已經(jīng)導(dǎo)入的模塊會(huì)保存在sys.modules字典中。

_X與__all__

在模塊中的所有變量以_開頭的都不會(huì)被from *所導(dǎo)入

$catsimple.py

#!/use/bin/env python

_spam1=1

spam2=1

>>>from simple import *

>>>dir()

# _spam1沒有被導(dǎo)入

['__builtins__','__doc__','__name__','__package__','spam2']

相反的__all__列表里面的變量則會(huì)被from *所導(dǎo)入,沒有在__all__列表里面的變量則不會(huì)被導(dǎo)入

$catsimple.py

#!/use/bin/env python

__all__=['spam2']

spam1=1

spam2=1

>>>from simple import *

>>>dir()

# spam1沒有被導(dǎo)入

['__builtins__','__doc__','__name__','__package__','spam2']

注意事項(xiàng)

據(jù)不完全統(tǒng)計(jì),如果導(dǎo)入的模塊的名稱在當(dāng)前目錄下有這個(gè)文件,那么只會(huì)把當(dāng)前目錄下的這個(gè)文件當(dāng)作模塊,如下演示:

創(chuàng)建一個(gè)腳本文件,名稱為scripts

[root@iZ28i253je0Z ~]# touch scripts.py

內(nèi)容為

#!/usr/bin/env python

# _*_ coding:utf-8 _*_

# 導(dǎo)入一個(gè)模塊re

importre

# 輸出匹配到的字符串a(chǎn)bc

print(re.match('w+',"abc").group())

執(zhí)行腳本

[root@iZ28i253je0Z~]# python scripts.py

# 把匹配到的結(jié)果abc輸出出來

abc

創(chuàng)建一個(gè).py文件,名稱為re.py

[root@iZ28i253je0Z ~]# touch re.py

內(nèi)容為

#!/usr/bin/env python

# _*_ coding:utf-8 _*_

# 輸出內(nèi)容modus

print("Hello Word")

再次執(zhí)行scripts.py腳本

[root@iZ28i253je0Z~]# python scripts.py

# 先輸出Hello Word

HelloWord

# 然后再報(bào)錯(cuò)沒有match這個(gè)方法

Traceback(most recent calllast):

File"scripts.py",line6,in

print(re.match('w+',"abc").group())

AttributeError:'module'objecthas noattribute'match'

這是為什么呢?因?yàn)閜ython把re.py當(dāng)成模塊re了,繼續(xù)往下看:

更改scripts.py文件內(nèi)容如下

[root@iZ28i253je0Z~]# cat scripts.py

#!/usr/bin/env python

# _*_ coding:utf-8 _*_

importre

re.py文件內(nèi)容不變,然后我們?cè)趫?zhí)行腳本scripts.py

[root@iZ28i253je0Z~]# python scripts.py

HelloWord

看到了吧,他會(huì)把re.py文件內(nèi)的代碼拿到scripts.py文件中去執(zhí)行,這是個(gè)坑,最好別踩。

導(dǎo)入當(dāng)前目錄下子目錄下的文件

[root@ansheng~]# tree ./

./

├──modules

│├──__init__.py

│├──lib01.py

│└──lib02.py

└──scripts.py

1directory,4files

[root@ansheng~]# cat scripts.py

#!/usr/bin/env python

# 導(dǎo)入modules包下面的lib01模塊

from modules importlib01

# 導(dǎo)入modules包下面的lib02模塊

from modules importlib02

[root@ansheng~]# cat modules/__init__.py

#!/usr/bin/env python

[root@ansheng~]# cat modules/lib01.py

#!/usr/bin/env python

# lib01.py文件會(huì)輸出"Hello lib01"

print("Hello lib01")

[root@ansheng~]# cat modules/lib02.py

#!/usr/bin/env python

# lib02.py文件會(huì)輸出"Hello lib02"

print("Hello lib02")

執(zhí)行結(jié)果

[root@ansheng~]# python scripts.py

# 會(huì)執(zhí)行modules/lib02.py與modules/lib01.py文件內(nèi)容

Hello lib01

Hellolib02

包含目錄下的文件時(shí)需要在目錄下聲明一個(gè)__init__.py文件,即使這個(gè)文件是空的也可以。學(xué)好python你需要一個(gè)良好的環(huán)境,一個(gè)優(yōu)質(zhì)的開發(fā)交流群,群里都是那種相互幫助的人才是可以的,我有建立一個(gè)python學(xué)習(xí)交流群,在群里我們相互幫助,相互關(guān)心,相互分享內(nèi)容,這樣出問題幫助你的人就比較多,群號(hào)是301,還有056,最后是051,這樣就可以找到大神聚合的群,如果你只愿意別人幫助你,不愿意分享或者幫助別人,那就請(qǐng)不要加了,你把你會(huì)的告訴別人這是一種分享。如果你看了覺得還可以的麻煩給我點(diǎn)個(gè)贊謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,579評(píng)論 6 427
  • 在Python中有一個(gè)概念叫做模塊(module),這個(gè)和C語言中的頭文件以及Java中的包很類似,比如在Pyth...
    一只寫程序的猿閱讀 4,018評(píng)論 0 3
  • 本文來自 我的博客。博客的文章保持更新,此文可能不是最新狀態(tài)。 下載、解壓 python 源代碼 從 python...
    jeromesun閱讀 69,874評(píng)論 0 5
  • 本節(jié)內(nèi)容 Python介紹 發(fā)展史 Python 2 or 3? 安裝 Hello World程序 變量 用戶輸入...
    小小不懂11閱讀 3,448評(píng)論 2 30
  • 今天早上起來吃完早飯后和寶貝打掃除,寶貝開心的不得了,幫我掃地,拖地,澆花,忙的不亦樂乎,一會(huì)小臉熱的就紅紅的了,...
    王藝靜媽媽閱讀 94評(píng)論 0 0