這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)什么是Python中的模塊,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了文登免費(fèi)建站歡迎大家使用!
一、python中的模塊
有過C語言編程經(jīng)驗(yàn)的朋友都知道在C語言中如果要引用sqrt函數(shù),必須用語句#include
那么在Python中,如果要引用一些其他的函數(shù),該怎么處理呢?
在Python中有一個(gè)概念叫做模塊(module),這個(gè)和C語言中的頭文件以及Java中的包很類似,比如在Python中要調(diào)用sqrt函數(shù),必須用import關(guān)鍵字引入math這個(gè)模塊,下面就來了解一下Python中的模塊。
說的通俗點(diǎn):模塊就好比是工具包,要想使用這個(gè)工具包中的工具(就好比函數(shù)),就需要導(dǎo)入這個(gè)模塊。
模塊的概念:
1.每一個(gè)以擴(kuò)展名py結(jié)尾的python源代碼文件都是一個(gè)模塊。
2.模塊名同樣也是一個(gè)標(biāo)識(shí)符,需要符合標(biāo)識(shí)符的命名規(guī)范。
3.在模塊中定義的全局變量、函數(shù)、類都是提供給外界直接使用的工具。
4.模塊就好比工具包,要想使用這個(gè)工具包中的工具,就需要先導(dǎo)入這個(gè)模塊。
二、import
在Python中用關(guān)鍵字import來引入某個(gè)模塊,比如要引用模塊math,就可以在文件最開始的地方用import math來引入。
import導(dǎo)入
import 模塊名1,模塊名2 #不推薦
說明:在導(dǎo)入模塊時(shí),每個(gè)導(dǎo)入應(yīng)該獨(dú)占一行(推薦)
import 模塊1 import 模塊2
導(dǎo)入之
通過模塊名使用模塊提供的工具---全局變量、函數(shù)、類。
只用as指定模塊的別名。
如果模塊的名字太長(zhǎng),可以使用as指定模塊的別名,以方便在代碼中的使用。
import 模塊名1 as 模塊別名
注意:模塊別名應(yīng)該符合托峰值命名規(guī)范
為什么要加上模塊名呢?
因?yàn)榭赡艽嬖谶@樣一種情況:在多個(gè)模塊中含有相同名稱的函數(shù),此時(shí)如果只是通過函數(shù)名來調(diào)用,解釋器無法知道到底要調(diào)用哪個(gè)函數(shù)。所以如果像上述這樣引入模塊的時(shí)候,調(diào)用函數(shù)必須加上模塊名。
三、from … import
from...import導(dǎo)入
1.如果想從某一模塊中導(dǎo)入部分工具,就可以使用from...import的方式。
2.import模塊名是一次性把模塊中所有的工具全部導(dǎo)入,并且通過模塊名/別名訪問。
#從模塊中導(dǎo)入某一個(gè)工具 from 模塊名 import 工具名#可以通過as為工具指定別名
導(dǎo)入之后
1.不需要通過模塊名. 的方式使用模塊提供的工具
2.可以直接使用模塊提供的工具 --- 全局變量、函數(shù)、類
注意:
1.如果兩個(gè)模塊,存在同名的函數(shù),name后導(dǎo)入模塊的函數(shù)會(huì)覆蓋先導(dǎo)入的函數(shù)
2.開發(fā)時(shí)import代碼應(yīng)該統(tǒng)一寫在代碼的頂部,更容易及時(shí)發(fā)現(xiàn)沖突
3.如果發(fā)生沖突,可以使用as關(guān)鍵字,給其中一個(gè)工具起一個(gè)別名
from...import * #從模塊中導(dǎo)入所有工具 from 模塊名 import *
注意:
這種法師不推薦使用,因?yàn)楹瘮?shù)重名并沒有任何的提示,出現(xiàn)問題不好排查
案例:
demo.py(自定義的模塊)
#全局變量 title = "模塊1" #函數(shù) def say_hello(): print("我是%s"%title) #類 class Dog(object): pass #類 class Cat(object): pass
test.py中使用demo.py模塊
#導(dǎo)入模塊中的所有工具,同時(shí)為模塊指定別名為myTest import demo as myTest #導(dǎo)入模塊中所有工具,不推薦,工具同名不好排查 #from...import * #from...import導(dǎo)入模塊中的部分工具(Dog類) from demo import Dog #為導(dǎo)入工具Cat類指定別名Test_Cat,防止與其他模塊中工具重名 from demo import Cat as Test_Cat myTest.say_hello() dog=Dog() cat=Test_Cat()
四、python模塊導(dǎo)入的搜索路
程序的主目錄
PTYHONPATH目錄(如果已經(jīng)進(jìn)行了設(shè)置)
標(biāo)準(zhǔn)連接庫目錄(一般在/usr/local/lib/python2.X/)
任何的.pth文件的內(nèi)容(如果存在的話).新功能,允許用戶把有效果的目錄添加到模塊搜索路徑中去 .pth后綴的文本文件中一行一行的地列出目錄。
這四個(gè)組建組合起來就變成了sys.path了,
當(dāng)python import模塊的時(shí)候,就通過sys.path里面的目錄列表下面去查找。
sys.path是python的搜索模塊的路徑集,是一個(gè)list。
查看sys.path方法:
import sys print(sys.path)
['C:\\Users\\Se7eN_HOU\\Desktop\\Tools\\sublimetext3\\Sublime Text Build 3176 x86', 'C:\\Program Files\\Python37\\python37.zip', 'C:\\Program Files\\Python37\\DLLs', 'C:\\Program Files\\Python37\\lib', 'C:\\Program Files\\Python37', 'C:\\Users\\Se7eN_HOU\\AppData\\Roaming\\Python\\Python37\\site-packages', 'C:\\Program Files\\Python37\\lib\\site-packages']
程序執(zhí)行時(shí)導(dǎo)入模塊路徑
import sys #因?yàn)閟ys.path是一個(gè)列表,所以可以在后面追加一個(gè)自定的模塊路徑 sys.path.append("/home/Se7eN_HOU") #通過insert可以將路徑插到前面 sys.path.insert(0,"Home/Se7eN") print(sys.path)
運(yùn)行結(jié)果為:
['Home/Se7eN', 'C:\\Users\\Se7eN_HOU\\Desktop\\Tools\\sublimetext3\\Sublime Text Build 3176 x86', 'C:\\Program Files\\Python37\\python37.zip', 'C:\\Program Files\\Python37\\DLLs', 'C:\\Program Files\\Python37\\lib', 'C:\\Program Files\\Python37', 'C:\\Users\\Se7eN_HOU\\AppData\\Roaming\\Python\\Python37\\site-packages', 'C:\\Program Files\\Python37\\lib\\site-packages', '/home/Se7eN_HOU']
五、模塊制作
1、定義自己的模塊
在Python中,每個(gè)Python文件都可以作為一個(gè)模塊,模塊的名字就是文件的名字。
比如有這樣一個(gè)文件test.py,在test.py中定義了函數(shù)add
def add(a,b): return a+b
2、調(diào)用自己的模塊
那么在demo.py文件中就可以先import test,然后通過test.add(a,b)來調(diào)用了,當(dāng)然也可以通過from test import add來引入
import test result = test.add(1,2) print(result)
運(yùn)行結(jié)果為:3
3、測(cè)試模塊
在實(shí)際開中,當(dāng)一個(gè)開發(fā)人員編寫完一個(gè)模塊后,為了讓模塊能夠在項(xiàng)目中達(dá)到想要的效果,這個(gè)開發(fā)人員會(huì)自行在py文件中添加一些測(cè)試信息,例如:test.py文件
def add(a,b): return a+b #用來測(cè)試 ret = add(11,22) print("in test.py 測(cè)試11+22 = %d"%ret)
如果此時(shí),在demo.py文件中引入了此文件的話,想想看,測(cè)試的那段代碼是否也會(huì)執(zhí)行呢!
import test result = test.add(1,2) print(result)
運(yùn)行結(jié)果為:
in test.py 測(cè)試11+22 = 33 3
至此,可發(fā)現(xiàn)test.py中的測(cè)試代碼,應(yīng)該是單獨(dú)執(zhí)行test.py文件時(shí)才應(yīng)該執(zhí)行的,不應(yīng)該是其他的文件中引用而執(zhí)行。為了解決這個(gè)問題,python在執(zhí)行一個(gè)文件時(shí)有個(gè)變量__name__
test.py文件中:
def add(a,b): return a+b #用來測(cè)試 #ret = add(11,22) #print("in test.py 測(cè)試11+22 = %d"%ret) print("in test.py,__name__ is %s"%__name__)
運(yùn)行結(jié)果為:
in test.py,__name__ is __main__
在demo.py文件中導(dǎo)入test.py模塊運(yùn)行為
import test result = test.add(1,2) print(result)
運(yùn)行結(jié)果為:
in test.py,__name__ is test 3
可以根據(jù)__name__變量的結(jié)果能夠判斷出,是直接執(zhí)行的python腳本還是被引入執(zhí)行的,從而能夠有選擇性的執(zhí)行測(cè)試代碼。
test.py模塊中代碼改為:
def add(a,b): return a+b if __name__ == "__main__": ret = add(11,22) print("in test.py 測(cè)試11+22 = %d"%ret)
在test.py中運(yùn)行結(jié)果為:
in test.py 測(cè)試11+22 = 33
在demo.py中導(dǎo)入test.py模塊
import test result = test.add(1,2) print(result)
運(yùn)行結(jié)果為:3
這樣我們?cè)陂_中測(cè)試的代碼,就不會(huì)在其他模塊中出現(xiàn)了。
六、模塊中的_ _all_ _
1、沒有_ _all_ _
test.py模塊
class Test(object): def test(self): print("---Test類中的test方法---") def test1(): print("---test1方法---") def test2(): print("---test2方法---")
在demo.py中導(dǎo)入test.py模塊
from test import * a = Test() a.test() test1() test2()
運(yùn)行結(jié)果為:
---Test類中的test方法--- ---test1方法--- ---test2方法---
2、模塊中有_ _all_ _
test.py模塊
__all__ = ["Test","test1"] class Test(object): def test(self): print("---Test類中的test方法---") def test1(): print("---test1方法---") def test2(): print("---test2方法---")
demo.py模塊
from test import * a = Test() a.test() test1() test2()
運(yùn)行結(jié)果為:
---Test類中的test方法---Traceback (most recent call last): ---test1方法--- File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 5, intest2() NameError: name 'test2' is not defined
如果一個(gè)文件中有__all__變量,那么也就意味著只有這個(gè)變量中的元素,才會(huì)被from xxx import *時(shí)導(dǎo)入。
七、系統(tǒng)sys模塊介紹
sys是python自帶模塊,常用的函數(shù)有:
sys.argv: 實(shí)現(xiàn)從程序外部向程序傳遞參數(shù)。
sys.exit([arg]): 程序中間的退出,arg=0為正常退出。
sys.getdefaultencoding(): 獲取系統(tǒng)當(dāng)前編碼,一般默認(rèn)為ascii。
sys.setdefaultencoding(): 設(shè)置系統(tǒng)默認(rèn)編碼,執(zhí)行dir(sys)時(shí)不會(huì)看到這個(gè)方法,在解釋器中執(zhí)行不通過,可以先執(zhí)行reload(sys),在執(zhí)行 setdefaultencoding('utf8'),此時(shí)將系統(tǒng)默認(rèn)編碼設(shè)置為utf8。(見設(shè)置系統(tǒng)默認(rèn)編碼 )
sys.getfilesystemencoding(): 獲取文件系統(tǒng)使用編碼方式,Windows下返回'mbcs',mac下返回'utf-8'。
sys.path: 獲取指定模塊搜索路徑的字符串集合,可以將寫好的模塊放在得到的某個(gè)路徑下,就可以在程序中import時(shí)正確找到。
sys.platform: 獲取當(dāng)前系統(tǒng)平臺(tái)。
1、sys.argv[]
sys.argv[]說白了就是一個(gè)從程序外部獲取參數(shù)的橋梁,這個(gè)“外部”很關(guān)鍵。因?yàn)槲覀儚耐獠咳〉玫膮?shù)可以是多個(gè),所以獲得的是一個(gè)列表(list),也就是說sys.argv其實(shí)可以看作是一個(gè)列表,所以才能用[]提取其中的元素。其第一個(gè)元素是程序本身,隨后才依次是外部給予的參數(shù)。
下面我們通過一個(gè)極簡(jiǎn)單的test.py程序的運(yùn)行結(jié)果來說明它的用法。
#test.py import sys a=sys.argv[0] print(a)
將test.py保存在c盤的根目錄下。
在程序中找到 ‘運(yùn)行’->點(diǎn)擊->輸入"cmd"->回車鍵 進(jìn)入控制臺(tái)命令窗口(如下圖),先輸入cd c:\ (作用是將命令路徑改到c盤根目錄),然后輸入test.py運(yùn)行我們剛剛寫的程序:
得到的結(jié)果是C:\test.py,這就是0指代碼(即此.py程序)本身的意思。
然后我們將代碼中0改為1 :
a=sys.argv[1]
保存后,再從控制臺(tái)窗口運(yùn)行,這次我們加上一個(gè)參數(shù),輸入:test.py what
#test.py import sys a=sys.argv[1] print(a)
運(yùn)行結(jié)果是:
得到的結(jié)果就是我們輸入的參數(shù)what,看到這里你是不是開始明白了呢。
那我們?cè)侔汛a修改一下:
a=sys.argv[2:]
保存后,再從控制臺(tái)窗臺(tái)運(yùn)行程序,這次多加幾個(gè)參數(shù),以空格隔開:
test.py a b c d e f
得到的結(jié)果為[‘b’, ’c’, ’d’, ’e’, ’f’]
應(yīng)該大徹大悟了吧。Sys.argv[ ]其實(shí)就是一個(gè)列表,里邊的項(xiàng)為用戶輸入的參數(shù),關(guān)鍵就是要明白這參數(shù)是從程序外部輸入的,而非代碼本身的什么地方,要想看到它的效果就應(yīng)該將程序保存了,從外部來運(yùn)行程序并給出參數(shù)。
2、sys.path已經(jīng)在上面講過了
3、sys.exit()
程序中間的退出, arg=0為正常退出
一般情況下執(zhí)行到主程序末尾,解釋器自動(dòng)退出,但是如果需要中途退出程序,可以調(diào)用sys.exit函數(shù),帶有一個(gè)可選的整數(shù)參數(shù)返回給調(diào)用它的程序,表示你可以在主程序中捕獲對(duì)sys.exit的調(diào)用。(0是正常退出,其他為異常)當(dāng)然也可以用字符串參數(shù),表示錯(cuò)誤不成功的報(bào)錯(cuò)信息。
import sys def exitfunc(value): print (value) sys.exit(0) print("hello") try: sys.exit(90) except SystemExit as value: exitfunc(value) print("come?")
運(yùn)行結(jié)果:
hello 90
程序首先打印hello,在執(zhí)行exit(90),拋異常把90傳給values,values在傳進(jìn)函數(shù)中執(zhí)行,打印90程序退出。后面的”come?”因?yàn)橐呀?jīng)退出所以不會(huì)被打印. 而此時(shí)如果把exitfunc函數(shù)里面的sys.exit(0)去掉,那么程序會(huì)繼續(xù)執(zhí)行到輸出”come?”。
4、sys.modules
sys.modules是一個(gè)全局字典,該字典是python啟動(dòng)后就加載在內(nèi)存中。每當(dāng)程序員導(dǎo)入新的模塊,sys.modules將自動(dòng)記錄該模塊。當(dāng)?shù)诙卧賹?dǎo)入該模塊時(shí),python會(huì)直接到字典中查找,從而加快了程序運(yùn)行的速度。它擁有字典所擁有的一切方法。
import sys print(sys.modules.keys()) print("**************************************************************************") print(sys.modules.values()) print("**************************************************************************") print(sys.modules["os"])
運(yùn)行結(jié)果為:
dict_keys(['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', 'zipimport', '_frozen_importlib_external', '_io', 'marshal', 'nt', 'winreg', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_abc', 'site', 'os', 'stat', '_stat', 'ntpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins']) ************************************************************************** dict_values([, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ]) **************************************************************************
5、sys.stdin, sys.stdout, sys.stderr
stdin,stdout,stderr在Python中都是文件屬性對(duì)象, 他們?cè)趐ython啟動(dòng)時(shí)自動(dòng)與shell環(huán)境中的標(biāo)準(zhǔn)輸入, 輸出, 出錯(cuò)相關(guān). 而python程序在shell中的I/O重定向是有shell來提供的,與python本身沒有關(guān)系.python程序內(nèi)部將stdin, stdout, stderr讀寫操作重定向到一個(gè)內(nèi)部對(duì)象.
#import sys print("Hi, %s!' %input('Please enter your name: ")) #運(yùn)行結(jié)果:Please enter your name: er #Hi, er! #等同于: import sys print('Please enter your name:') name=sys.stdin.readline()[:-1] print('Hi, %s!' %name) #標(biāo)準(zhǔn)輸出 print('Hello World!\n') #等同于: import sys sys.stdout.write('Hello world!\n')
上述就是小編為大家分享的什么是Python中的模塊了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。