版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
學(xué)院系部名稱主講:授課教師姓名Python基礎(chǔ)教程第6章代碼復(fù)用—模塊學(xué)院系部名稱主講:授課教師姓名Python基礎(chǔ)教程第Python中,庫Library、包Package、模塊Module,統(tǒng)稱為模塊。Python自帶了功能豐富的標(biāo)準(zhǔn)庫,另外還有數(shù)量龐大的各種第三方庫。使用這些功能的基本方法就是使用模塊。通過函數(shù),可以在程序中重用自己的代碼;通過模塊,則可以重用別的程序中的代碼。本章的目標(biāo)是掌握模塊的使用。第6章代碼復(fù)用—模塊Python中,庫Library、包Package、?!窘虒W(xué)導(dǎo)航】學(xué)習(xí)目標(biāo)1.了解模塊的的概念2.掌握模塊的使用3.了解包的概念4.掌握常用模塊的操作教學(xué)重點(diǎn)模塊的使用、常用模塊的操作教學(xué)方式案例教學(xué)法、分組討論法、自主學(xué)習(xí)法、探究式訓(xùn)練法課時(shí)建議6課時(shí)【教學(xué)導(dǎo)航】學(xué)習(xí)目標(biāo)1.了解模塊的的概念教學(xué)重點(diǎn)模塊的使用、本章主要內(nèi)容Python中的包模塊概述模塊的使用123常用模塊介紹4實(shí)訓(xùn)65本章主要內(nèi)容Python中的包模塊概述模塊的使用123常用第6章代碼復(fù)用—模塊模塊是一個(gè)保存了Python代碼的文件。模塊能定義函數(shù)、類和變量。模塊中也能包含可執(zhí)行的代碼。模塊分為三種:自定義模塊、內(nèi)置標(biāo)準(zhǔn)模塊、開源模塊(第三方)。
[學(xué)習(xí)目標(biāo)]1.了解模塊的定義2.了解命名空間與模塊的關(guān)系第6章代碼復(fù)用—模塊模塊是一個(gè)保存了Python代6.1.1模塊定義模塊(Module)是用來組織Python程序代碼的一種方法。當(dāng)程序的代碼量比較大時(shí),可以將代碼分成多個(gè)彼此聯(lián)系又相互獨(dú)立的代碼段,而每個(gè)代碼段可能包含數(shù)據(jù)成員和方法的類(“數(shù)據(jù)成員和方法的類”是面向?qū)ο蟪绦蛟O(shè)計(jì)的說法,在沒有面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ)時(shí),可以理解為數(shù)據(jù)和程序代碼的總和)。這樣的代碼段是共享的,所以可將代碼段通過導(dǎo)入(Import)的手段加入到正在編寫的程序中,讓程序使用模塊中這些可共享的代碼段。這樣看來,模塊是一個(gè)包含諸多可共享的代碼段的組織單位。還有一個(gè)更大的單位,稱為包,它是用來組織模塊的。6.1.1模塊定義模塊(Module)是用來組織6.1.1模塊定義模塊的概念是站在邏輯結(jié)構(gòu)層面建立的概念,它在磁盤中的存在形式仍然是文件。模塊的文件名就是模塊名加上擴(kuò)展名.py。模塊文件名應(yīng)盡量使用小寫命名,首字母保持小寫,盡量不要用下畫線(除非多個(gè)單詞,且數(shù)量不多的情況)模塊可以理解為是一個(gè)包含了函數(shù)和變量的py文件。在你的程序中引入了某個(gè)模塊,就可以使用其中的函數(shù)和變量。
模塊也是Python對(duì)象,具有隨機(jī)的名字屬性用來綁定或引用。簡(jiǎn)單地說,模塊就是一個(gè)保存了Python代碼的文件。模塊中能定義函數(shù)、類和變量。模塊也能包含可執(zhí)行的代碼。6.1.1模塊定義模塊的概念是站在邏輯結(jié)構(gòu)層面建6.1.1模塊定義庫:具有相關(guān)功能模塊的集合。這也是Python的一大特色,即具有強(qiáng)大的標(biāo)準(zhǔn)庫、第三方庫及自定義模塊。標(biāo)準(zhǔn)庫:就是下載安裝的Python中那些自帶的模塊,要注意的是,里面有一些模塊是看不到的,比如像sys模塊,這與Linux下看不到cd命令是一樣的。
第三方庫:就是由其他的第三方機(jī)構(gòu)發(fā)布的具有特定功能的模塊。
自定義模塊:用戶可以自行編寫模塊,然后使用。6.1.1模塊定義庫:具有相關(guān)功能模塊的集合。這6.1.2命名空間
命名空間是名稱(標(biāo)識(shí)符)到對(duì)象的映射。模塊有自己唯一的命名空間。變量作用域就是變量的使用范圍。確定一個(gè)變量的作用域,首先要確定變量是否在其局部命名空間,不在其局部命名空間時(shí),再查找是否在全局命名空間,最后在內(nèi)置命名空間中查找。因此,變量作用域與命名空間是有關(guān)聯(lián)的。如果用戶自己創(chuàng)建了一個(gè)模塊mymodule,并且用戶要在程序中使用模塊mymodule中的函數(shù)(方法)fun(),則需要使用mymodule.fun()形式,這實(shí)際上是指定了模塊的命名空間。即使在不同的模塊中有相同的函數(shù)(方法),因?yàn)槭褂昧嗣臻g,也不至于產(chǎn)生使用上的沖突。Python系統(tǒng)提供了幾個(gè)內(nèi)置函數(shù)用于支持模塊。它們是:__import__()函數(shù),它能實(shí)現(xiàn)與import語句相同的功能;globals()和locals()函數(shù),分別返回調(diào)用者的全局命名空間或局部命名空間。6.1.2命名空間命名空間是名稱(標(biāo)識(shí)符)到對(duì)象的映
6.2模塊的使用在Python解釋器上不能直接使用函數(shù)庫中的函數(shù),因?yàn)檫@些函數(shù)都封裝在某一函數(shù)庫中,要使用庫中的某一函數(shù),先要導(dǎo)入相應(yīng)的函數(shù)庫,或者稱導(dǎo)入模塊。[學(xué)習(xí)目標(biāo)]1.了解模塊的導(dǎo)入2.掌握模塊多種導(dǎo)入方式3.了解模塊的定位4.掌握模塊的查找5.了解自定義模塊時(shí)外層代碼的處理6.2模塊的使用在Python解釋器上不能直接使用函數(shù)6.2.1模塊導(dǎo)入模塊使用前需要導(dǎo)入,導(dǎo)入后才能執(zhí)行。所謂執(zhí)行,就是被導(dǎo)入的模塊中定義的全局變量被賦值、類及函數(shù)的聲明將被執(zhí)行。導(dǎo)入模塊使用import語句和from…import語句。導(dǎo)入方法有以下三種。方法1:import<庫名>方法2:import<庫名>as<新名字>方法3:from<庫名>import<函數(shù)名>|*6.2.1模塊導(dǎo)入模塊使用前需要導(dǎo)入,導(dǎo)入后才能6.2.1模塊導(dǎo)入對(duì)于第(1)種方法,使用函數(shù)時(shí)要寫成:<庫名>.<函數(shù)名>;對(duì)于第(2)種方法,使用函數(shù)時(shí)要寫成:<新名字>.<函數(shù)名>;對(duì)于第(3)種方法,直接寫函數(shù)名就行。1.import語句想使用Python源文件,只需在另一個(gè)源文件中執(zhí)行import語句,語法如下: import<庫名>使用import語句可以導(dǎo)入整個(gè)模塊。例如: importsys這是導(dǎo)入Python標(biāo)準(zhǔn)庫的sys模塊。sys模塊提供了許多函數(shù)和變量來處理Python運(yùn)行時(shí)環(huán)境的不同部分。6.2.1模塊導(dǎo)入對(duì)于第(1)種方法,使用函數(shù)時(shí)要寫成:6.2.1模塊導(dǎo)入import語句執(zhí)行的過程是:在搜索路徑中找到指定的模塊,然后加載該模塊。如果在一個(gè)程序的頂層導(dǎo)入指定模塊,則所指定模塊的作用域是全局的;如果在函數(shù)中導(dǎo)入,那么它的作用域是局部的。搜索路徑是一個(gè)解釋器會(huì)先進(jìn)行搜索的所有目錄的列表。如想要導(dǎo)入模塊hello.py,需要把命令放在腳本的頂端。當(dāng)解釋器遇到import語句,如果模塊在當(dāng)前的搜索路徑中就會(huì)被導(dǎo)入,如例6-2-1所示。6.2.1模塊導(dǎo)入import語句執(zhí)行的過程是:6.2.1模塊導(dǎo)入以上實(shí)例輸出結(jié)果如下: 1.4142135623730951導(dǎo)入模塊后,必須要通過“模塊名.函數(shù)名”調(diào)用模塊中的函數(shù),不能直接使用模塊中的函數(shù)名,否則會(huì)報(bào)錯(cuò),如上例中,直接使用“print(sqrt(2))”語句,將報(bào)“name'sqrt'isnotdefined”錯(cuò)誤。因?yàn)樵诋?dāng)前命名空間下,不包括sqrt()函數(shù)的定義。不管執(zhí)行了多少次import。一個(gè)模塊只會(huì)被導(dǎo)入一次,這樣可以防止導(dǎo)入模塊被一遍又一遍地執(zhí)行。6.2.1模塊導(dǎo)入以上實(shí)例輸出結(jié)果如下:6.2.1模塊導(dǎo)入2.import…as…語句在例6-2-1中,使用importmath導(dǎo)入數(shù)學(xué)模塊,此時(shí)調(diào)用函數(shù)時(shí),函數(shù)前面需要添加模塊名,如math.sqrt()。如果模塊名字比較長(zhǎng)或名稱可能重復(fù),或不想直接使用模塊名進(jìn)行調(diào)用,這時(shí)可以使用import…as…語句,語法如下:import<庫名>as<新名字>使用as創(chuàng)建別名,然后再通過別名進(jìn)行模塊內(nèi)函數(shù)調(diào)用,調(diào)用格式為“別名.函數(shù)名”。操作如例6-2-2所示。例6-2-2導(dǎo)入數(shù)學(xué)模塊。6.2.1模塊導(dǎo)入2.import…as…語句6.2.1模塊導(dǎo)入以上實(shí)例輸出結(jié)果如下:3.from…import語句有時(shí)候,需要在默認(rèn)空間下直接使用某模塊的相關(guān)函數(shù),此時(shí)可以使用from…import語句。Python的from語句從模塊中導(dǎo)入一個(gè)指定的部分到當(dāng)前命名空間中。語法如下: from<庫名>import<函數(shù)名>例如,要導(dǎo)入數(shù)學(xué)模塊math的sqrt函數(shù),使用如下語句: frommathimportsqrt
6.2.1模塊導(dǎo)入以上實(shí)例輸出結(jié)果如下:6.2.1模塊導(dǎo)入這個(gè)聲明不會(huì)把整個(gè)math模塊導(dǎo)入到當(dāng)前的命名空間中,它會(huì)將math中的sqrt單個(gè)引入到執(zhí)行這個(gè)聲明的模塊的全局符號(hào)表,此時(shí),不可使用“模塊名.函數(shù)名”進(jìn)行調(diào)用,需直接使用從模塊中導(dǎo)入的函數(shù)名。實(shí)例如例6-2-3所示例6-2-3導(dǎo)入數(shù)學(xué)模塊中的單個(gè)函數(shù)到當(dāng)前命名空間。以上實(shí)例輸出結(jié)果如下:4.from…import*語句from…import*語句的語法格式如下: from模塊名import*from…import*語句可以導(dǎo)入模塊的某些屬性,也可以使用“frommoduleimport*”導(dǎo)入所有屬性。6.2.1模塊導(dǎo)入這個(gè)聲明不會(huì)把整個(gè)math6.2.1模塊導(dǎo)入
把一個(gè)模塊的所有內(nèi)容全都導(dǎo)入到當(dāng)前的命名空間也是可行的,如導(dǎo)入math模塊的全部?jī)?nèi)容,只需使用如下聲明: frommathimport*這提供了一個(gè)簡(jiǎn)單的方法來導(dǎo)入一個(gè)模塊中的所有項(xiàng)目。使用這種導(dǎo)入方法和第三種方式相似,也不可使用“模塊名.函數(shù)名”進(jìn)行調(diào)用,需直接使用模塊中的函數(shù)名。然而這種聲明不該被過多地使用,否則內(nèi)存消耗比較大。6.2.1模塊導(dǎo)入6.2.2模塊定位查找1.定位模塊當(dāng)導(dǎo)入一個(gè)模塊,Python解釋器對(duì)模塊位置的搜索順序是:●當(dāng)前目錄。●如果不在當(dāng)前目錄,Python則搜索在shell變量PYTHONPATH下的每個(gè)目錄。●如果還找不到,Python會(huì)查看默認(rèn)路徑。Windows下,默認(rèn)路徑一般是Python安裝路徑。UNIX下,默認(rèn)路徑一般為/usr/local/lib/python/。模塊搜索路徑存儲(chǔ)在system模塊的sys.path變量中。變量中包含當(dāng)前目錄、PYTHONPATH和由安裝過程決定的默認(rèn)目錄。6.2.2模塊定位查找1.定位模塊6.2.2模塊定位查找2.模塊的查找當(dāng)用戶需要導(dǎo)入一個(gè)模塊時(shí),用戶會(huì)使用import命令在搜索路徑中查找指定模塊的文件名。搜索路徑是一個(gè)特定目錄的集合,Python系統(tǒng)只在這些特定的搜索路徑中查找模塊文件名。這個(gè)特定的目錄是Python系統(tǒng)安裝時(shí)確定的默認(rèn)搜索路徑。默認(rèn)搜索路徑被保存在sys模塊的sys.path變量中,用戶可以使用命令查看。實(shí)例如例6-2-4所示。例6-2-4查看Python默認(rèn)搜索路徑。6.2.2模塊定位查找2.模塊的查找6.2.2模塊定位查找以上實(shí)例輸出結(jié)果如下:這是前面頁命令產(chǎn)生的結(jié)果,是一個(gè)列表??梢酝ㄟ^append()方法向sys.path變量中增加一個(gè)目錄: sys.path.append('要增加的目錄路徑’)如果是用戶自己建立的模塊,應(yīng)該將模塊的文件(例如前面說的mymodule.py)存放在指定的目錄中。6.2.2模塊定位查找以上實(shí)例輸出結(jié)果如下:6.2.2模塊定位查找當(dāng)Python系統(tǒng)解釋器在標(biāo)準(zhǔn)模式下啟動(dòng)時(shí),一些模塊會(huì)被解釋器自動(dòng)導(dǎo)入,它們是與系統(tǒng)操作相關(guān)聯(lián)的模塊,如:builtins模塊。Python中有些內(nèi)置函數(shù),不需要導(dǎo)入模塊,就可以直接使用,例如abs()。6.2.2模塊定位查找當(dāng)Python系統(tǒng)解釋6.2.3自定義模塊調(diào)用在規(guī)范的代碼中,通常都會(huì)有一句“if__name__=="__main__":”作為程序的入口,但到目前為止,發(fā)現(xiàn)沒有這么一句代碼,程序也能正常運(yùn)行。Python文件有兩種使用的方法,第一是直接作為腳本執(zhí)行,第二是import到其他的Python腳本中被調(diào)用(模塊重用)執(zhí)行。之前,所有的任務(wù)練習(xí)都采用第一種方法,直接作為腳本執(zhí)行。但實(shí)際上,模塊就是一個(gè)普通的Python程序文件,任何一個(gè)普通的Python文件都可以作為模塊導(dǎo)入。在Python文件作為模塊導(dǎo)入的時(shí)候,有些代碼不能被執(zhí)行,否則會(huì)出問題。
采用“if__name__="__main__":”寫法,表示如果是外部文件調(diào)用,不執(zhí)行此處代碼。__name__是指示當(dāng)前py文件調(diào)用方式的方法。如果它等于“__main__”就表示直接執(zhí)行,如果不是,則用來被別的文件調(diào)用,這個(gè)時(shí)候if判斷結(jié)果就為False,那么就不執(zhí)行外層的代碼。6.2.3自定義模塊調(diào)用在規(guī)范的代碼中,通常都6.2.3自定義模塊調(diào)用“if__name__=='main':”的作用就是控制這兩種情況執(zhí)行代碼的過程,在“if__name__=='main':”下的代碼只有在第一種情況下(即文件作為腳本直接執(zhí)行)才會(huì)被執(zhí)行,而import到其他腳本中是不會(huì)被執(zhí)行的。操作實(shí)例如例6-2-5所示。
例6-2-5創(chuàng)建stu.py文件,代碼如下:以上實(shí)例輸出結(jié)果如下:6.2.3自定義模塊調(diào)用“if__name__=6.2.3自定義模塊調(diào)用
直接執(zhí)行stu.py,結(jié)果如上,輸出列表原始數(shù)據(jù)和學(xué)生信息兩行字符串。即,“if__name__=="__main__":”語句之前和之后的代碼都被執(zhí)行。
然后在同一文件夾新建名稱為import_stu.py的腳本中,輸入如下代碼:
importstu執(zhí)行import_stu.py腳本,輸出結(jié)果如下:[{'stu_age':18,'stu_id':1,'stu_name':'張三’}]結(jié)果中只輸出了列表數(shù)據(jù)。即,“if__name__=="__main__":”之前的語句被執(zhí)行,之后的沒有被執(zhí)行。6.2.3自定義模塊調(diào)用 直接執(zhí)行stu.py,結(jié)果如6.2.3自定義模塊調(diào)用每個(gè)Python模塊(Python文件,也就是此處的stu.py和import_stu.py)都包含內(nèi)置的變量__name__。當(dāng)運(yùn)行模塊被執(zhí)行時(shí),__name__等于文件名(包含了后綴.py);如果import到其他模塊中,則__name__等于模塊名稱(不包含后綴.py)。而“__main__”等于當(dāng)前執(zhí)行文件的名稱(包含了后綴.py),進(jìn)而當(dāng)模塊被直接執(zhí)行時(shí),“__name__=='main'”的結(jié)果為真。示例如下。復(fù)制stu.py代碼,保存為stu1.py,在stu1.py程序的“if__name__=="__main__":”之前加入“print(__name__)”,即將__name__打印出來。文件內(nèi)容和結(jié)果如下:可以看出,此時(shí)變量__name__的值為“__main__”,然后在同一文件夾中新建名稱為import_stu1.py的腳本,輸入如下代碼:6.2.3自定義模塊調(diào)用每個(gè)Python模塊(Pyt6.2.3自定義模塊調(diào)用importstu1執(zhí)行import_stu1.py腳本,輸出結(jié)果如下:[{'stu_name':'張三','stu_id':1,'stu_age':18}]stu1然后在同一文件夾中新建名稱為import_stu.py的腳本,只輸入如下代碼:importstu執(zhí)行import_stu.py腳本,輸出結(jié)果如下:[{'stu_age':18,'stu_name':'張三','stu_id':1}]此時(shí),test.py中的__name__變量值為stu1,不滿足__name__=="__main__"的條件,因此,無法執(zhí)行其后的代碼,不能輸出“stul”6.2.3自定義模塊調(diào)用importstu16.3 Python中的包變量的作用域是Python學(xué)習(xí)中一個(gè)必須理解和掌握的知識(shí)。本節(jié)從局部變量和全局變量開始全面解析Python中的變量作用域。[學(xué)習(xí)目標(biāo)]1.了解包的概念2.掌握包的使用6.3 Python中的包變量的作用域是Python6.3.1包的概念包是在模塊之上的概念,為了方便管理而將文件進(jìn)行打包。包目錄下第一個(gè)文件便是__init__.py,然后是一些模塊文件和子目錄,假如子目錄中也有__init__.py,那么它就是這個(gè)包的子包了。常見的包結(jié)構(gòu)如圖6-3-1所示。包結(jié)構(gòu)是一個(gè)分層次的文件目錄結(jié)構(gòu),它定義了一個(gè)由模塊及子包和子包下的子包等組成的Python的應(yīng)用環(huán)境。包是模塊更上一層的概念,一個(gè)包可以包含多個(gè)模塊。包能夠幫助用戶將有聯(lián)系的模塊組織在一個(gè)包內(nèi);同時(shí)還可以解決模塊名沖突。圖6-3-1常見的包結(jié)構(gòu)6.3.1包的概念包是在模塊之上的概念,為了方便管理6.3.1包的概念當(dāng)模塊名或者包名過長(zhǎng)時(shí),為了后面的程序編寫,可以給其取別名,格式如下import包名as別名建立包的方法為:在Python的工作目錄下的LIB子目錄中建立一個(gè)目錄,這個(gè)建立的目錄名就是包的名字,將模塊置入包(目錄)內(nèi)。
有些包中有內(nèi)置函數(shù),導(dǎo)入包名之后,可以直接通過“包名.函數(shù)名”來調(diào)用函數(shù)。我們知道包是模塊的合集,如果使用到了包中的某些模塊,一般情況下需要通過“包名.模塊名.函數(shù)名”來調(diào)用相應(yīng)的函數(shù),為了方便編寫程序,可以通過“from包名import模塊名”直接導(dǎo)入模塊,這樣就不需要再寫包名了。
如果包中還有子包的話,同樣為了方便程序編寫,可以通過“from包名.子包名import模塊名”導(dǎo)入模塊。6.3.1包的概念當(dāng)模塊名或者包名過長(zhǎng)時(shí),為了后面的程序編寫6.3.2包使用實(shí)例(1)創(chuàng)建一個(gè)目錄web,在web目錄中寫入stu.py、tea.py、admin.py三個(gè)文件。stu.py這個(gè)文件有如下源代碼: defStu(): print("I'mastudent")同樣的,另外兩個(gè)文件中的函數(shù)如下(2)tea.py含有函數(shù)Tea(),代碼如下: defTea(): print("I'mateacher”)(3)admin.py含有函數(shù)Admin(),代碼如下: defAdmin(): print("I'maadministrator")(4)在web目錄下創(chuàng)建空文件,命名為__init__.py。6.3.2包使用實(shí)例(1)創(chuàng)建一個(gè)目錄web,在web目錄中6.3.2包使用實(shí)例
在不使用包的方式下,直接在web目錄下新建Python文件,可以直接使用stu.py、tea.py、admin.py這三個(gè)文件內(nèi)容。●第一種方式,新建py文件作啟動(dòng)文件,文件名可任意取,保存在web目錄下,如例6-3-1所示。例6-3-1使用from...import...導(dǎo)入文件模塊實(shí)例。上述實(shí)例輸出結(jié)果如下: I'mastudent I'mateacher I'maadministrator6.3.2包使用實(shí)例在不使用包的方式下,直接在we6.3.2 包使用實(shí)例●第二種方式,新建py文件作啟動(dòng)文件,文件名可任意取,保存在web目錄下,如例6-3-2所示。例6-3-2使用import導(dǎo)入文件模塊實(shí)例。例6-3-2和例6-3-1實(shí)例輸出相同,輸出結(jié)果如下:如上,為了舉例,我們?cè)诿總€(gè)文件中只放置了一個(gè)函數(shù),但其實(shí)可以放置多個(gè)函數(shù)。也可以在這些文件中定義Python的類,然后為這些類創(chuàng)建一個(gè)包。6.3.2 包使用實(shí)例●第二種方式,新建py文件作啟6.4常用模塊介紹本節(jié)介紹time和calendar標(biāo)準(zhǔn)庫、數(shù)學(xué)函數(shù)math及json模塊,而random這個(gè)庫是全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)Python語言程序設(shè)計(jì)考試大綱(2018年版)中第七部分—Python計(jì)算生態(tài)中第1點(diǎn)(標(biāo)準(zhǔn)庫)中必考的一個(gè)庫。time標(biāo)準(zhǔn)庫是選考的一個(gè)庫。[學(xué)習(xí)目標(biāo)]1.了解并掌握time標(biāo)準(zhǔn)庫的使用2.了解并掌握calendar標(biāo)準(zhǔn)庫的使用
3.了解并掌握math模塊的使用4.了解并掌握json數(shù)據(jù)的使用6.4常用模塊介紹本節(jié)介紹time和calendar標(biāo)準(zhǔn)庫、6.4.1時(shí)間與日期在數(shù)據(jù)的統(tǒng)計(jì)分析方面,時(shí)間是一個(gè)很重要的因素。很多時(shí)候,只考慮一定時(shí)期內(nèi)的數(shù)據(jù),時(shí)間對(duì)數(shù)據(jù)的有效性有很大影響。在數(shù)據(jù)分析時(shí),Python需要對(duì)數(shù)據(jù)的時(shí)效性有準(zhǔn)確的把握。在程序中,Python能用很多方式處理日期和時(shí)間數(shù)據(jù)。Python提供了一個(gè)time和calendar模塊用來處理日期和時(shí)間。
1.time模塊 time模塊包含了以下內(nèi)置函數(shù),既有與時(shí)間處理相關(guān)的,也有用于轉(zhuǎn)換時(shí)間格式的,如表6-4-1所示。序號(hào)函數(shù)及描述1time.altzone返回格林威治西部的夏令時(shí)地區(qū)的偏移秒數(shù)。如果該地區(qū)在格林威治的東部會(huì)返回負(fù)值(如西歐,包括英國(guó))。它對(duì)夏令時(shí)啟用地區(qū)才能使用2time.asctime([tupletime])接受時(shí)間元組并返回一個(gè)可讀的形式為“SatJul1310:34:092019”(2019年7月13日周六18時(shí)07分14秒)的24個(gè)字符的字符串6.4.1時(shí)間與日期在數(shù)據(jù)的統(tǒng)計(jì)分析方面,時(shí)間是一個(gè)6.4.1時(shí)間與日期序號(hào)函數(shù)及描述3time.clock()用以浮點(diǎn)數(shù)計(jì)算的秒數(shù)返回當(dāng)前的CPU時(shí)間。用來衡量不同程序的耗時(shí),它比time.time()更有用4time.ctime([secs])作用相當(dāng)于asctime(localtime(secs)),未給參數(shù)相當(dāng)于asctime()5time.gmtime([secs])接收時(shí)間輟(1970紀(jì)元后經(jīng)過的浮點(diǎn)秒數(shù))并返回格林威治天文時(shí)間下的時(shí)間元組t。注:t.tm_isdst始終為06time.localtime([secs])接收時(shí)間輟(1970紀(jì)元后經(jīng)過的浮點(diǎn)秒數(shù))并返回當(dāng)?shù)貢r(shí)間下的時(shí)間元組t(t.tm_isdst可取0或1,取決于當(dāng)?shù)禺?dāng)時(shí)是不是夏令時(shí))7time.mktime(tupletime)接受時(shí)間元組并返回時(shí)間輟(1970紀(jì)元后經(jīng)過的浮點(diǎn)秒數(shù))8time.sleep(secs)推遲調(diào)用線程的運(yùn)行,secs指秒數(shù)9time.strftime(fmt[,tupletime])接收時(shí)間元組,并返回以可讀字符串表示的當(dāng)?shù)貢r(shí)間,格式由fmt決定6.4.1時(shí)間與日期序號(hào)函數(shù)及描述3time.clock()6.4.1時(shí)間與日期time模塊包含了以下2個(gè)非常重要的屬性如表6-4-2所示。
表6-4-2time模塊屬性值一覽表序號(hào)函數(shù)及描述10time.strptime(str,fmt='%a%b%d%H:%M:%S%Y')根據(jù)fmt的格式把一個(gè)時(shí)間字符串解析為時(shí)間元組11time.time()返回當(dāng)前時(shí)間的時(shí)間戳(1970紀(jì)元后經(jīng)過的浮點(diǎn)秒數(shù)12time.tzset()根據(jù)環(huán)境變量TZ重新初始化時(shí)間相關(guān)設(shè)置序號(hào)屬性及描述1time.timezone屬性time.timezone是當(dāng)?shù)貢r(shí)區(qū)(未啟動(dòng)夏令時(shí))距離格林威治的偏移秒數(shù)(>0,美洲;<=0大部分的歐洲、亞洲、非洲)2time.tzname屬性time.tzname包含一對(duì)根據(jù)情況的不同而不同的字符串,分別是帶夏令時(shí)的本地時(shí)區(qū)名稱,和不帶夏令時(shí)的6.4.1時(shí)間與日期序號(hào)函數(shù)及描述10time.strpti6.4.1時(shí)間與日期2.ticks計(jì)時(shí)單位時(shí)間間隔是以秒為單位的浮點(diǎn)小數(shù)。每個(gè)時(shí)間戳都以自從1970年1月1日午夜(歷元)經(jīng)過了多長(zhǎng)時(shí)間來表示。Python附帶的受歡迎的time模塊下有很多函數(shù)可以轉(zhuǎn)換常見日期格式。如函數(shù)time.time()用ticks計(jì)時(shí)單位返回從12:00am,January1,1970(epoch)開始記錄的當(dāng)前操作系統(tǒng)時(shí)間,如例6-4-1所示。例6-4-1時(shí)間戳實(shí)例。
以上實(shí)例輸出結(jié)果如下 importtime; 當(dāng)前時(shí)間戳是: #引用time模塊 1556120860.6987607 ticks=time.time() print("當(dāng)前時(shí)間戳是:",ticks)ticks計(jì)時(shí)單位最適于日期運(yùn)算,但是1970年之前的日期就無法以此表示。目前,UNIX和Windows只支持到2038年。
6.4.1時(shí)間與日期2.ticks計(jì)時(shí)單位6.4.1時(shí)間與日期3.時(shí)間元組使用localtime可以獲取當(dāng)前時(shí)間,獲取的時(shí)間使用時(shí)間元組方式展示。從返回浮點(diǎn)數(shù)的時(shí)間戳方式向時(shí)間元組轉(zhuǎn)換,只要將浮點(diǎn)數(shù)傳遞給如localtime之類的函數(shù)。
例6-4-2獲取當(dāng)前時(shí)間實(shí)例
以上實(shí)例輸出結(jié)果如下
importtime;
當(dāng)前時(shí)間是:localtime=time.localtime(time.time()) time.struct_time(tm_year=2019,print("當(dāng)前時(shí)間是:",localtime) tm_mon=4,tm_mday=28, tm_hour=8,tm_min=39,tm_sec=42, tm_wday=6,tm_yday=118, tm_isdst=0)localtime將時(shí)間展示為元組方式,很多Python函數(shù)用一個(gè)元組裝起來的9組數(shù)字處理時(shí)間,如表6-4-3所示。6.4.1時(shí)間與日期3.時(shí)間元組6.4.1時(shí)間與日期
上述元組也就是struct_time元組序號(hào)字段屬性值04位數(shù)年tm_year如20191月tm_mon1到122日tm_may1到313小時(shí)tm_hour0到234分鐘tm_min0到595秒tm_sec0到61(60或61是閏秒)6一周的第幾日tm_wday0到6(0是周一)7一年的第幾日tm_yday1到3668夏令時(shí)tm_isdst-1,0,1,-1用于決定是否為夏令時(shí)6.4.1時(shí)間與日期序號(hào)字段屬性值04位數(shù)年tm_year如6.4.1時(shí)間與日期4.獲取格式化的時(shí)間用戶可以根據(jù)需求選取各種格式,但是最簡(jiǎn)單地獲取可讀的時(shí)間模式的函數(shù)是asctime(),如例6-4-3所示。例6-4-3獲取格式化時(shí)間實(shí)例。importtime;localtime=time.asctime(time.localtime(time.time()))print("當(dāng)前時(shí)間是:",localtime) 以上實(shí)例輸出結(jié)果如下:當(dāng)前時(shí)間是:SunApr2808:59:2920195.獲取某月日歷calendar模塊有很多的方法用來處理年歷和月歷數(shù)據(jù),如例6-4-4所示。例6-4-4獲取日歷實(shí)例importcalendarcal=calendar.month(2019,9)print("選擇查看的日歷如下:")print(cal)6.4.1時(shí)間與日期4.獲取格式化的時(shí)間6.4.1時(shí)間與日期以上實(shí)例輸出結(jié)果如下:選擇查看的日歷如下:6.4.1時(shí)間與日期以上實(shí)例輸出結(jié)果如下:6.4.2math庫Python系統(tǒng)構(gòu)造了許多的函數(shù)庫,其中用戶用得最多的是數(shù)學(xué)類函數(shù)庫math。math庫中包含了數(shù)學(xué)公式,在使用數(shù)學(xué)公式前需要導(dǎo)入math庫。1.Python數(shù)學(xué)函數(shù)
Python數(shù)學(xué)函數(shù)如表6-4-4所示。
表6-4-4Python數(shù)學(xué)函數(shù)一覽表函數(shù)返回值(描述)abs(x)返回x數(shù)字的絕對(duì)值,如abs(-10)返回10ceil(x)返回x數(shù)字的上入整數(shù),如math.ceil(4.1)返回5cmp(x,y)如果x<y返回-1,如果x==y返回0,如果x>y返回1exp(x)返回e的x次冪(ex),如math.exp(1)返回2.718281828459045fabs(x)返回x數(shù)字的絕對(duì)值,如math.fabs(-10)返回10.0floor(x)返回x數(shù)字的下舍整數(shù),如math.floor(4.9)返回4log(x)如math.log(math.e)返回1.0,math.log(100,10)返回2.0log10(x)返回以10為基數(shù)的x的對(duì)數(shù),如math.log10(100)返回2.06.4.2math庫Python系統(tǒng)構(gòu)造了許多的函數(shù)庫,其中6.4.2math庫函數(shù)返回值(描述)max(x1,x2,...)返回給定參數(shù)的最大值,參數(shù)可以為序列min(x1,x2,...)返回給定參數(shù)的最小值,參數(shù)可以為序列modf(x)返回x的整數(shù)部分與小數(shù)部分,兩部分的數(shù)值符號(hào)與x相同,整數(shù)部分以浮點(diǎn)型表示pow(x,y)x**y運(yùn)算后的值round(x[,n])返回浮點(diǎn)數(shù)x的四舍五入值,如給出n值,則代表舍入到小數(shù)點(diǎn)后的位數(shù)sqrt(x)返回?cái)?shù)字x的平方根,數(shù)字可以為負(fù)數(shù),返回類型為實(shí)數(shù),如math.sqrt(4)返回2+0j6.4.2math庫函數(shù)返回值(描述)max(x1,x2,.6.4.2math庫2.Python三角函數(shù)Python包括的三角函數(shù)如表6-4-5所示。
表6-4-5Python三角函數(shù)一覽表函數(shù)描述acos(x)返回x的反余弦弧度值asin(x)返回x的反正弦弧度值atan(x)返回x的反正切弧度值atan2(y,x)返回給定的x及y坐標(biāo)值的反正切值cos(x)返回x的弧度的余弦hypot(x,y)返回歐幾里得范數(shù)sqrt(x*x+y*y)sin(x)返回的x弧度的正弦值tan(x)返回x弧度的正切值degrees(x)將弧度轉(zhuǎn)換為角度,如degrees(math.pi/2),返回90.0radians(x)將x角度轉(zhuǎn)換為弧度6.4.2math庫2.Python三角函數(shù)函數(shù)描述acos6.4.2math庫3.Python數(shù)學(xué)常量Python數(shù)學(xué)常量如表6-4-6所示
表6-4-6Python數(shù)學(xué)常量一覽表4.常用數(shù)學(xué)函數(shù)(1)ceil(x)函數(shù)。返回大于x的最小整數(shù),如例6-4-5所示。例6-4-5ceil()函數(shù)實(shí)例。
以上實(shí)例輸出結(jié)果如下: frommathimport* 2 print(ceil(1.7)) -1 print(ceil(?1.7))
常量描述pi數(shù)學(xué)常量pi(圓周率,一般以π來表示)e數(shù)學(xué)常量e,e即自然常數(shù)(自然常數(shù))6.4.2math庫3.Python數(shù)學(xué)常量常量描述pi數(shù)學(xué)6.4.2math庫(2)factorial(x)函數(shù)。當(dāng)x是正整數(shù)時(shí),返回x的階乘,否則提示錯(cuò)誤信息,如例6-4-6所示。
例6-4-6factorial()函數(shù)實(shí)例。
以上實(shí)例輸出結(jié)果如下:Frommathimport*
3628800print(factorial(10))
其他如sin(x)、cos(x)、exp(x)、sqrt(x)、log(x[,base])、log10(x)、log2(x)等數(shù)學(xué)函數(shù),和數(shù)學(xué)中的函數(shù)含義相同,直接使用即可,也可通過查Python的幫助信息進(jìn)行操作(3)isinf()函數(shù)。inf、-inf函數(shù)表示正負(fù)無窮大的數(shù)。當(dāng)x為正負(fù)無窮大數(shù)時(shí),返回True;否則返回False。當(dāng)x為整數(shù)時(shí),返回False。而對(duì)浮點(diǎn)數(shù)來說,Python系統(tǒng)使用64位存儲(chǔ),表示整數(shù)范圍為?1.7e308~1.7e308,當(dāng)測(cè)試數(shù)據(jù)在這個(gè)范圍之外,isinf()函數(shù)返回True,否則返回False,如例6-4-7所示。6.4.2math庫(2)factorial(x)函數(shù)。當(dāng)x6.4.2math庫例6-4-7isinf()函數(shù)實(shí)例frommathimport*print(("值為整數(shù)時(shí),isinf函數(shù)結(jié)果是:",isinf(100))print(("值的范圍介于-1.7e308~1.7e308時(shí),isinf函數(shù)結(jié)果是",isinf(1.7e308))print(("值大于1.7e308時(shí),isinf函數(shù)結(jié)果是:",isinf(1.7e309))print(("值小于-1.7e308時(shí),isinf函數(shù)結(jié)果是:",isinf(-1.7e309))以上實(shí)例輸出結(jié)果如下:值為整數(shù)時(shí),isinf函數(shù)結(jié)果是:False值的范圍介于?1.7e308~1.7e308時(shí),isinf函數(shù)結(jié)果是:False值大于1.7e308時(shí),isinf函數(shù)結(jié)果是:True值小于?1.7e308時(shí),isinf函數(shù)結(jié)果是:True(4)isnan()函數(shù)。當(dāng)x不是數(shù)字時(shí),isnan(x)函數(shù)返回True;否則返回False。6.4.2math庫例6-4-7isinf()函數(shù)實(shí)例6.4.2math庫在Python系統(tǒng)中,“x不是數(shù)字”是指NaN(NotaNumber)。NaN是IEEE754標(biāo)準(zhǔn)中定義的某種運(yùn)算結(jié)果,如一個(gè)無窮大的數(shù)乘0,兩個(gè)無窮大的數(shù)及所有與NaN有關(guān)的操作結(jié)果。NaN實(shí)際上是浮點(diǎn)數(shù)運(yùn)算過程中產(chǎn)生的不確定數(shù),兩個(gè)NaN是無法比較的,如例6-4-8所示。例6-4-8isnan()函數(shù)實(shí)例。frommathimport*x=1.7e309y=1.2e309print("x=",x)print("isnan(x)值是=",isnan(x))print("y=",y)print("isnan(y)值是=",isnan(y))z1=x/y#只有運(yùn)算才會(huì)產(chǎn)生isnan()為True的結(jié)果print("z1值是=",z1)z2=float('nan')print("z1,z2比較結(jié)果:",z1==z2)#兩個(gè)NaN是無法比較的6.4.2math庫在Python系統(tǒng)中,“x不是數(shù)字”是指6.4.2math庫以上實(shí)例輸出結(jié)果如下:x=infisnan(x)值是=Falsey=infisnan(y)值是=Falsez1值是=nanz1,z2比較結(jié)果:False(5)trunc(x)函數(shù)。返回與x最近的、靠近數(shù)字0一方的整數(shù),如例6-4-9所示。例6-4-9trunc(x)函數(shù)實(shí)例。
以上實(shí)例輸出結(jié)果如下:frommathimport* print(trunc(1.7)) 1print(trunc(?1.7)) -16.4.2math庫以上實(shí)例輸出結(jié)果如下:6.4.3json模塊json(JavaScriptObjectNotation,JS對(duì)象標(biāo)記)是一種輕量級(jí)的數(shù)據(jù)交換格式。它使得人們很容易地進(jìn)行閱讀和編寫,同時(shí)也方便了機(jī)器進(jìn)行解析和生成,適用于進(jìn)行數(shù)據(jù)交互的場(chǎng)景,比如網(wǎng)站前臺(tái)與后臺(tái)之間的數(shù)據(jù)交互。json格式的字符串,一種用來進(jìn)行數(shù)據(jù)交互的格式,看起來像Python類型的字符串就是json字符串。在Python中json里面可以包含用方括號(hào)括起來的數(shù)組,也就是Python中的列表json類型轉(zhuǎn)換到Python的類型對(duì)照表如表6-4-7所示
表6-4-7json類型轉(zhuǎn)換到Python的類型對(duì)照表json類型Python類型ObjectdictArraylistStringunicodenumber(int)int,long6.4.3json模塊json(JavaScriptO6.4.3json模塊json模塊的方法: json.loads()#把json字符串轉(zhuǎn)化為Python類型 json.dumps(python類型,ensure_ascii=False,indent=2)#把Python類型轉(zhuǎn)化為json字符串,ensure_ascii=False能夠保證寫入文件的時(shí)候?yàn)橹形?,indent控制寫入的換行和空格 json字符串的注意點(diǎn):json字符串中的鍵值對(duì)需要使用雙引號(hào)。json類型Python類型number(real)floatTrueTrueFalseFalseNullNone6.4.3json模塊json類型Python類型numbe6.4.3json模塊通過json我們能夠?qū)崿F(xiàn)json字符串和Python數(shù)據(jù)類型的相互轉(zhuǎn)化,如圖6-4-1所示。
圖6-4-1json字符串與Python類型轉(zhuǎn)換1.字典轉(zhuǎn)化為json字符串json.dump/json.dumps方法:dump的第一個(gè)參數(shù)是對(duì)象字典,第二個(gè)參數(shù)是文件對(duì)象,可以直接將轉(zhuǎn)換后的json數(shù)據(jù)寫入文件,dumps的第一個(gè)參數(shù)是對(duì)象字典,其余都是可選參數(shù)。dump和dumps的可選參數(shù)相同,這些參數(shù)都相當(dāng)實(shí)用,現(xiàn)將用到的參數(shù)記錄如下。ensure_ascii默認(rèn)為True,保證轉(zhuǎn)換后的json字符串中全部是ASCII字符,非ASCII字符都會(huì)被轉(zhuǎn)義。如果數(shù)據(jù)中存在中文或其他非ASCII字符,最好將ensure_ascii設(shè)置為False,保證輸出結(jié)果正常。6.4.3json模塊通過json我們能夠?qū)崿F(xiàn)json字符串6.4.3json模塊
indent縮進(jìn),默認(rèn)為None,沒有縮進(jìn),設(shè)置為正整數(shù)時(shí),輸出的格式將按照indent指定的半角空格數(shù)縮進(jìn),相當(dāng)實(shí)用。 separators設(shè)置分隔符,默認(rèn)的分隔符是(',',':'),如果需要自定義json中的分隔符,例如調(diào)整冒號(hào)前后的空格數(shù),可以按照(item_separator,key_separator)的形式設(shè)置。 sort_keys默認(rèn)為False,設(shè)為True時(shí),輸出結(jié)果將按照字典中的key排序,如例6-4-10所示。
例6-4-10Python類型轉(zhuǎn)化為json字符串操作實(shí)例。以上實(shí)例輸出結(jié)果如下:注意:在Python類型中,是區(qū)分大小寫的,True中的T需要大寫。json類型中,true為小寫6.4.3json模塊 indent縮進(jìn),默認(rèn)為None,沒6.4.3json模塊2.json字符串轉(zhuǎn)為字典使用json.load/json.loads方法來轉(zhuǎn)換。兩個(gè)方法功能類似,可選參數(shù)也相同,最大的區(qū)別在于,json.load方法接受的輸入,即第一個(gè)參數(shù),是包含json數(shù)據(jù)的文件對(duì)象,如open方法的返回對(duì)象,json.loads接受的輸入是json字符串,而非文件對(duì)象。從輸入類型的區(qū)別也可以看出兩者的使用場(chǎng)合??蛇x參數(shù)包括是否需要轉(zhuǎn)換整型、浮點(diǎn)型等數(shù)值的參數(shù)。json字符串轉(zhuǎn)化為Python類型操作示例如例6-4-11所示。
例6-4-11json字符串轉(zhuǎn)化為Python類型操作實(shí)例。
以上實(shí)例輸出結(jié)果如下:6.4.3json模塊2.json字符實(shí)訓(xùn)6:使用模塊編寫學(xué)生信息管理系統(tǒng)面向?qū)ο缶幊倘筇匦允欠庋b、繼承和多態(tài)。實(shí)現(xiàn)多態(tài)的技術(shù)基礎(chǔ)除了繼承,還有方法重寫。本節(jié)的目標(biāo)是了解并掌握方法重寫與運(yùn)算符重載?!救蝿?wù)描述】
在教材第5章的實(shí)訓(xùn)5中,建立了一個(gè)學(xué)生信息管理系統(tǒng),使用列表中嵌套字典保存學(xué)生數(shù)據(jù),初始數(shù)據(jù)如下: stu_list=[{"stu_name":"張三","stu_id":1,"stu_age":18}]實(shí)訓(xùn)6:使用模塊編寫學(xué)生信息管理系統(tǒng)面向?qū)ο缶幊倘筇匦詫?shí)訓(xùn)6:使用模塊編寫學(xué)生信息管理系統(tǒng)
使用函數(shù)實(shí)現(xiàn)操作信息提示,提示內(nèi)容為如下所示:歡迎訪問學(xué)生信息管理系統(tǒng),請(qǐng)按提示輸入操作! 1.添加學(xué)生信息 2.刪除學(xué)生信息 3.修改學(xué)生信息 4.查詢學(xué)生信息 5.瀏覽學(xué)生信息 6.退出系統(tǒng)
請(qǐng)輸入要操作的序號(hào):實(shí)訓(xùn)6:使用模塊編寫學(xué)生信息管理系統(tǒng)使用函數(shù)實(shí)訓(xùn)6:使用模塊編寫學(xué)生信息管理系統(tǒng)
用戶輸入相關(guān)的操作序號(hào)后,能調(diào)用相應(yīng)的方法函數(shù),實(shí)現(xiàn)相應(yīng)的操作?,F(xiàn)將其代碼進(jìn)行修改,改為模塊的方式進(jìn)行操作。
使用模塊裝項(xiàng)目進(jìn)行封裝,要求:
(1)創(chuàng)建包:stu_system_manage。
(2)按功能封裝兩個(gè)模塊:stu_info_manage.py和stu_edit_manage.py,均保存到stu_system_manage中。
(3)創(chuàng)建模塊:system_untils.py,模塊中封裝系統(tǒng)功能顯示函數(shù)。實(shí)訓(xùn)6:使用模塊編寫學(xué)生信息管理系統(tǒng)用戶輸實(shí)訓(xùn)6:使用模塊編寫學(xué)生信息管理系統(tǒng)【操作提示】
使用包來管理模塊,就是創(chuàng)建名為stu_system_manage的文件夾來保存Python文件。使用包時(shí),為了讓其他使用者能正確調(diào)用,需要在文件夾下添加“__init__.py”文件。
注意:在其他文件中調(diào)用包中的內(nèi)容,需要帶包名導(dǎo)入模塊。實(shí)訓(xùn)6:使用模塊編寫學(xué)生信息管理系統(tǒng)快樂學(xué)習(xí)、高效學(xué)習(xí)快樂學(xué)習(xí)、高效學(xué)習(xí)學(xué)院系部名稱主講:授課教師姓名Python基礎(chǔ)教程第6章代碼復(fù)用—模塊學(xué)院系部名稱主講:授課教師姓名Python基礎(chǔ)教程第Python中,庫Library、包Package、模塊Module,統(tǒng)稱為模塊。Python自帶了功能豐富的標(biāo)準(zhǔn)庫,另外還有數(shù)量龐大的各種第三方庫。使用這些功能的基本方法就是使用模塊。通過函數(shù),可以在程序中重用自己的代碼;通過模塊,則可以重用別的程序中的代碼。本章的目標(biāo)是掌握模塊的使用。第6章代碼復(fù)用—模塊Python中,庫Library、包Package、模【教學(xué)導(dǎo)航】學(xué)習(xí)目標(biāo)1.了解模塊的的概念2.掌握模塊的使用3.了解包的概念4.掌握常用模塊的操作教學(xué)重點(diǎn)模塊的使用、常用模塊的操作教學(xué)方式案例教學(xué)法、分組討論法、自主學(xué)習(xí)法、探究式訓(xùn)練法課時(shí)建議6課時(shí)【教學(xué)導(dǎo)航】學(xué)習(xí)目標(biāo)1.了解模塊的的概念教學(xué)重點(diǎn)模塊的使用、本章主要內(nèi)容Python中的包模塊概述模塊的使用123常用模塊介紹4實(shí)訓(xùn)65本章主要內(nèi)容Python中的包模塊概述模塊的使用123常用第6章代碼復(fù)用—模塊模塊是一個(gè)保存了Python代碼的文件。模塊能定義函數(shù)、類和變量。模塊中也能包含可執(zhí)行的代碼。模塊分為三種:自定義模塊、內(nèi)置標(biāo)準(zhǔn)模塊、開源模塊(第三方)。
[學(xué)習(xí)目標(biāo)]1.了解模塊的定義2.了解命名空間與模塊的關(guān)系第6章代碼復(fù)用—模塊模塊是一個(gè)保存了Python代6.1.1模塊定義模塊(Module)是用來組織Python程序代碼的一種方法。當(dāng)程序的代碼量比較大時(shí),可以將代碼分成多個(gè)彼此聯(lián)系又相互獨(dú)立的代碼段,而每個(gè)代碼段可能包含數(shù)據(jù)成員和方法的類(“數(shù)據(jù)成員和方法的類”是面向?qū)ο蟪绦蛟O(shè)計(jì)的說法,在沒有面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ)時(shí),可以理解為數(shù)據(jù)和程序代碼的總和)。這樣的代碼段是共享的,所以可將代碼段通過導(dǎo)入(Import)的手段加入到正在編寫的程序中,讓程序使用模塊中這些可共享的代碼段。這樣看來,模塊是一個(gè)包含諸多可共享的代碼段的組織單位。還有一個(gè)更大的單位,稱為包,它是用來組織模塊的。6.1.1模塊定義模塊(Module)是用來組織6.1.1模塊定義模塊的概念是站在邏輯結(jié)構(gòu)層面建立的概念,它在磁盤中的存在形式仍然是文件。模塊的文件名就是模塊名加上擴(kuò)展名.py。模塊文件名應(yīng)盡量使用小寫命名,首字母保持小寫,盡量不要用下畫線(除非多個(gè)單詞,且數(shù)量不多的情況)模塊可以理解為是一個(gè)包含了函數(shù)和變量的py文件。在你的程序中引入了某個(gè)模塊,就可以使用其中的函數(shù)和變量。
模塊也是Python對(duì)象,具有隨機(jī)的名字屬性用來綁定或引用。簡(jiǎn)單地說,模塊就是一個(gè)保存了Python代碼的文件。模塊中能定義函數(shù)、類和變量。模塊也能包含可執(zhí)行的代碼。6.1.1模塊定義模塊的概念是站在邏輯結(jié)構(gòu)層面建6.1.1模塊定義庫:具有相關(guān)功能模塊的集合。這也是Python的一大特色,即具有強(qiáng)大的標(biāo)準(zhǔn)庫、第三方庫及自定義模塊。標(biāo)準(zhǔn)庫:就是下載安裝的Python中那些自帶的模塊,要注意的是,里面有一些模塊是看不到的,比如像sys模塊,這與Linux下看不到cd命令是一樣的。
第三方庫:就是由其他的第三方機(jī)構(gòu)發(fā)布的具有特定功能的模塊。
自定義模塊:用戶可以自行編寫模塊,然后使用。6.1.1模塊定義庫:具有相關(guān)功能模塊的集合。這6.1.2命名空間
命名空間是名稱(標(biāo)識(shí)符)到對(duì)象的映射。模塊有自己唯一的命名空間。變量作用域就是變量的使用范圍。確定一個(gè)變量的作用域,首先要確定變量是否在其局部命名空間,不在其局部命名空間時(shí),再查找是否在全局命名空間,最后在內(nèi)置命名空間中查找。因此,變量作用域與命名空間是有關(guān)聯(lián)的。如果用戶自己創(chuàng)建了一個(gè)模塊mymodule,并且用戶要在程序中使用模塊mymodule中的函數(shù)(方法)fun(),則需要使用mymodule.fun()形式,這實(shí)際上是指定了模塊的命名空間。即使在不同的模塊中有相同的函數(shù)(方法),因?yàn)槭褂昧嗣臻g,也不至于產(chǎn)生使用上的沖突。Python系統(tǒng)提供了幾個(gè)內(nèi)置函數(shù)用于支持模塊。它們是:__import__()函數(shù),它能實(shí)現(xiàn)與import語句相同的功能;globals()和locals()函數(shù),分別返回調(diào)用者的全局命名空間或局部命名空間。6.1.2命名空間命名空間是名稱(標(biāo)識(shí)符)到對(duì)象的映
6.2模塊的使用在Python解釋器上不能直接使用函數(shù)庫中的函數(shù),因?yàn)檫@些函數(shù)都封裝在某一函數(shù)庫中,要使用庫中的某一函數(shù),先要導(dǎo)入相應(yīng)的函數(shù)庫,或者稱導(dǎo)入模塊。[學(xué)習(xí)目標(biāo)]1.了解模塊的導(dǎo)入2.掌握模塊多種導(dǎo)入方式3.了解模塊的定位4.掌握模塊的查找5.了解自定義模塊時(shí)外層代碼的處理6.2模塊的使用在Python解釋器上不能直接使用函數(shù)6.2.1模塊導(dǎo)入模塊使用前需要導(dǎo)入,導(dǎo)入后才能執(zhí)行。所謂執(zhí)行,就是被導(dǎo)入的模塊中定義的全局變量被賦值、類及函數(shù)的聲明將被執(zhí)行。導(dǎo)入模塊使用import語句和from…import語句。導(dǎo)入方法有以下三種。方法1:import<庫名>方法2:import<庫名>as<新名字>方法3:from<庫名>import<函數(shù)名>|*6.2.1模塊導(dǎo)入模塊使用前需要導(dǎo)入,導(dǎo)入后才能6.2.1模塊導(dǎo)入對(duì)于第(1)種方法,使用函數(shù)時(shí)要寫成:<庫名>.<函數(shù)名>;對(duì)于第(2)種方法,使用函數(shù)時(shí)要寫成:<新名字>.<函數(shù)名>;對(duì)于第(3)種方法,直接寫函數(shù)名就行。1.import語句想使用Python源文件,只需在另一個(gè)源文件中執(zhí)行import語句,語法如下: import<庫名>使用import語句可以導(dǎo)入整個(gè)模塊。例如: importsys這是導(dǎo)入Python標(biāo)準(zhǔn)庫的sys模塊。sys模塊提供了許多函數(shù)和變量來處理Python運(yùn)行時(shí)環(huán)境的不同部分。6.2.1模塊導(dǎo)入對(duì)于第(1)種方法,使用函數(shù)時(shí)要寫成:6.2.1模塊導(dǎo)入import語句執(zhí)行的過程是:在搜索路徑中找到指定的模塊,然后加載該模塊。如果在一個(gè)程序的頂層導(dǎo)入指定模塊,則所指定模塊的作用域是全局的;如果在函數(shù)中導(dǎo)入,那么它的作用域是局部的。搜索路徑是一個(gè)解釋器會(huì)先進(jìn)行搜索的所有目錄的列表。如想要導(dǎo)入模塊hello.py,需要把命令放在腳本的頂端。當(dāng)解釋器遇到import語句,如果模塊在當(dāng)前的搜索路徑中就會(huì)被導(dǎo)入,如例6-2-1所示。6.2.1模塊導(dǎo)入import語句執(zhí)行的過程是:6.2.1模塊導(dǎo)入以上實(shí)例輸出結(jié)果如下: 1.4142135623730951導(dǎo)入模塊后,必須要通過“模塊名.函數(shù)名”調(diào)用模塊中的函數(shù),不能直接使用模塊中的函數(shù)名,否則會(huì)報(bào)錯(cuò),如上例中,直接使用“print(sqrt(2))”語句,將報(bào)“name'sqrt'isnotdefined”錯(cuò)誤。因?yàn)樵诋?dāng)前命名空間下,不包括sqrt()函數(shù)的定義。不管執(zhí)行了多少次import。一個(gè)模塊只會(huì)被導(dǎo)入一次,這樣可以防止導(dǎo)入模塊被一遍又一遍地執(zhí)行。6.2.1模塊導(dǎo)入以上實(shí)例輸出結(jié)果如下:6.2.1模塊導(dǎo)入2.import…as…語句在例6-2-1中,使用importmath導(dǎo)入數(shù)學(xué)模塊,此時(shí)調(diào)用函數(shù)時(shí),函數(shù)前面需要添加模塊名,如math.sqrt()。如果模塊名字比較長(zhǎng)或名稱可能重復(fù),或不想直接使用模塊名進(jìn)行調(diào)用,這時(shí)可以使用import…as…語句,語法如下:import<庫名>as<新名字>使用as創(chuàng)建別名,然后再通過別名進(jìn)行模塊內(nèi)函數(shù)調(diào)用,調(diào)用格式為“別名.函數(shù)名”。操作如例6-2-2所示。例6-2-2導(dǎo)入數(shù)學(xué)模塊。6.2.1模塊導(dǎo)入2.import…as…語句6.2.1模塊導(dǎo)入以上實(shí)例輸出結(jié)果如下:3.from…import語句有時(shí)候,需要在默認(rèn)空間下直接使用某模塊的相關(guān)函數(shù),此時(shí)可以使用from…import語句。Python的from語句從模塊中導(dǎo)入一個(gè)指定的部分到當(dāng)前命名空間中。語法如下: from<庫名>import<函數(shù)名>例如,要導(dǎo)入數(shù)學(xué)模塊math的sqrt函數(shù),使用如下語句: frommathimportsqrt
6.2.1模塊導(dǎo)入以上實(shí)例輸出結(jié)果如下:6.2.1模塊導(dǎo)入這個(gè)聲明不會(huì)把整個(gè)math模塊導(dǎo)入到當(dāng)前的命名空間中,它會(huì)將math中的sqrt單個(gè)引入到執(zhí)行這個(gè)聲明的模塊的全局符號(hào)表,此時(shí),不可使用“模塊名.函數(shù)名”進(jìn)行調(diào)用,需直接使用從模塊中導(dǎo)入的函數(shù)名。實(shí)例如例6-2-3所示例6-2-3導(dǎo)入數(shù)學(xué)模塊中的單個(gè)函數(shù)到當(dāng)前命名空間。以上實(shí)例輸出結(jié)果如下:4.from…import*語句from…import*語句的語法格式如下: from模塊名import*from…import*語句可以導(dǎo)入模塊的某些屬性,也可以使用“frommoduleimport*”導(dǎo)入所有屬性。6.2.1模塊導(dǎo)入這個(gè)聲明不會(huì)把整個(gè)math6.2.1模塊導(dǎo)入
把一個(gè)模塊的所有內(nèi)容全都導(dǎo)入到當(dāng)前的命名空間也是可行的,如導(dǎo)入math模塊的全部?jī)?nèi)容,只需使用如下聲明: frommathimport*這提供了一個(gè)簡(jiǎn)單的方法來導(dǎo)入一個(gè)模塊中的所有項(xiàng)目。使用這種導(dǎo)入方法和第三種方式相似,也不可使用“模塊名.函數(shù)名”進(jìn)行調(diào)用,需直接使用模塊中的函數(shù)名。然而這種聲明不該被過多地使用,否則內(nèi)存消耗比較大。6.2.1模塊導(dǎo)入6.2.2模塊定位查找1.定位模塊當(dāng)導(dǎo)入一個(gè)模塊,Python解釋器對(duì)模塊位置的搜索順序是:●當(dāng)前目錄?!袢绻辉诋?dāng)前目錄,Python則搜索在shell變量PYTHONPATH下的每個(gè)目錄?!袢绻€找不到,Python會(huì)查看默認(rèn)路徑。Windows下,默認(rèn)路徑一般是Python安裝路徑。UNIX下,默認(rèn)路徑一般為/usr/local/lib/python/。模塊搜索路徑存儲(chǔ)在system模塊的sys.path變量中。變量中包含當(dāng)前目錄、PYTHONPATH和由安裝過程決定的默認(rèn)目錄。6.2.2模塊定位查找1.定位模塊6.2.2模塊定位查找2.模塊的查找當(dāng)用戶需要導(dǎo)入一個(gè)模塊時(shí),用戶會(huì)使用import命令在搜索路徑中查找指定模塊的文件名。搜索路徑是一個(gè)特定目錄的集合,Python系統(tǒng)只在這些特定的搜索路徑中查找模塊文件名。這個(gè)特定的目錄是Python系統(tǒng)安裝時(shí)確定的默認(rèn)搜索路徑。默認(rèn)搜索路徑被保存在sys模塊的sys.path變量中,用戶可以使用命令查看。實(shí)例如例6-2-4所示。例6-2-4查看Python默認(rèn)搜索路徑。6.2.2模塊定位查找2.模塊的查找6.2.2模塊定位查找以上實(shí)例輸出結(jié)果如下:這是前面頁命令產(chǎn)生的結(jié)果,是一個(gè)列表??梢酝ㄟ^append()方法向sys.path變量中增加一個(gè)目錄: sys.path.append('要增加的目錄路徑’)如果是用戶自己建立的模塊,應(yīng)該將模塊的文件(例如前面說的mymodule.py)存放在指定的目錄中。6.2.2模塊定位查找以上實(shí)例輸出結(jié)果如下:6.2.2模塊定位查找當(dāng)Python系統(tǒng)解釋器在標(biāo)準(zhǔn)模式下啟動(dòng)時(shí),一些模塊會(huì)被解釋器自動(dòng)導(dǎo)入,它們是與系統(tǒng)操作相關(guān)聯(lián)的模塊,如:builtins模塊。Python中有些內(nèi)置函數(shù),不需要導(dǎo)入模塊,就可以直接使用,例如abs()。6.2.2模塊定位查找當(dāng)Python系統(tǒng)解釋6.2.3自定義模塊調(diào)用在規(guī)范的代碼中,通常都會(huì)有一句“if__name__=="__main__":”作為程序的入口,但到目前為止,發(fā)現(xiàn)沒有這么一句代碼,程序也能正常運(yùn)行。Python文件有兩種使用的方法,第一是直接作為腳本執(zhí)行,第二是import到其他的Python腳本中被調(diào)用(模塊重用)執(zhí)行。之前,所有的任務(wù)練習(xí)都采用第一種方法,直接作為腳本執(zhí)行。但實(shí)際上,模塊就是一個(gè)普通的Python程序文件,任何一個(gè)普通的Python文件都可以作為模塊導(dǎo)入。在Python文件作為模塊導(dǎo)入的時(shí)候,有些代碼不能被執(zhí)行,否則會(huì)出問題。
采用“if__name__="__main__":”寫法,表示如果是外部文件調(diào)用,不執(zhí)行此處代碼。__name__是指示當(dāng)前py文件調(diào)用方式的方法。如果它等于“__main__”就表示直接執(zhí)行,如果不是,則用來被別的文件調(diào)用,這個(gè)時(shí)候if判斷結(jié)果就為False,那么就不執(zhí)行外層的代碼。6.2.3自定義模塊調(diào)用在規(guī)范的代碼中,通常都6.2.3自定義模塊調(diào)用“if__name__=='main':”的作用就是控制這兩種情況執(zhí)行代碼的過程,在“if__name__=='main':”下的代碼只有在第一種情況下(即文件作為腳本直接執(zhí)行)才會(huì)被執(zhí)行,而import到其他腳本中是不會(huì)被執(zhí)行的。操作實(shí)例如例6-2-5所示。
例6-2-5創(chuàng)建stu.py文件,代碼如下:以上實(shí)例輸出結(jié)果如下:6.2.3自定義模塊調(diào)用“if__name__=6.2.3自定義模塊調(diào)用
直接執(zhí)行stu.py,結(jié)果如上,輸出列表原始數(shù)據(jù)和學(xué)生信息兩行字符串。即,“if__name__=="__main__":”語句之前和之后的代碼都被執(zhí)行。
然后在同一文件夾新建名稱為import_stu.py的腳本中,輸入如下代碼:
importstu執(zhí)行import_stu.py腳本,輸出結(jié)果如下:[{'stu_age':18,'stu_id':1,'stu_name':'張三’}]結(jié)果中只輸出了列表數(shù)據(jù)。即,“if__name__=="__main__":”之前的語句被執(zhí)行,之后的沒有被執(zhí)行。6.2.3自定義模塊調(diào)用 直接執(zhí)行stu.py,結(jié)果如6.2.3自定義模塊調(diào)用每個(gè)Python模塊(Python文件,也就是此處的stu.py和import_stu.py)都包含內(nèi)置的變量__name__。當(dāng)運(yùn)行模塊被執(zhí)行時(shí),__name__等于文件名(包含了后綴.py);如果import到其他模塊中,則__name__等于模塊名稱(不包含后綴.py)。而“__main__”等于當(dāng)前執(zhí)行文件的名稱(包含了后綴.py),進(jìn)而當(dāng)模塊被直接執(zhí)行時(shí),“__name__=='main'”的結(jié)果為真。示例如下。復(fù)制stu.py代碼,保存為stu1.py,在stu1.py程序的“if__name__=="__main__":”之前加入“print(__name__)”,即將__name__打印出來。文件內(nèi)容和結(jié)果如下:可以看出,此時(shí)變量__name__的值為“__main__”,然后在同一文件夾中新建名稱為import_stu1.py的腳本,輸入如下代碼:6.2.3自定義模塊調(diào)用每個(gè)Python模塊(Pyt6.2.3自定義模塊調(diào)用importstu1執(zhí)行import_stu1.py腳本,輸出結(jié)果如下:[{'stu_name':'張三','stu_id':1,'stu_age':18}]stu1然后在同一文件夾中新建名稱為import_stu.py的腳本,只輸入如下代碼:importstu執(zhí)行import_stu.py腳本,輸出結(jié)果如下:[{'stu_age':18,'stu_name':'張三','stu_id':1}]此時(shí),test.py中的__name__變量值為stu1,不滿足__name__=="__main__"的條件,因此,無法執(zhí)行其后的代碼,不能輸出“stul”6.2.3自定義模塊調(diào)用importstu16.3 Python中的包變量的作用域是Python學(xué)習(xí)中一個(gè)必須理解和掌握的知識(shí)。本節(jié)從局部變量和全局變量開始全面解析Python中的變量作用域。[學(xué)習(xí)目標(biāo)]1.了解包的概念2.掌握包的使用6.3 Python中的包變量的作用域是Python6.3.1包的概念包是在模塊之
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 糖尿病該如何監(jiān)測(cè)血糖
- 2023年茂名高州市市屬國(guó)有企業(yè)招聘企業(yè)人員考試真題
- 白酒原漿酒采購(gòu)方案
- 白蟻防治設(shè)備安裝方案
- 白蘿卜收獲的課程設(shè)計(jì)
- 甲狀腺疾病的預(yù)防與治療
- 2024年電能計(jì)量配套產(chǎn)品項(xiàng)目規(guī)劃申請(qǐng)報(bào)告
- 2024年光伏封裝材料項(xiàng)目規(guī)劃申請(qǐng)報(bào)告
- 班級(jí)疫情防控方案
- 2024年新能源環(huán)衛(wèi)裝備項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告
- 電子天平校準(zhǔn)規(guī)范 JJF1847-2020 (高清-現(xiàn)行)
- 中國(guó)古代服飾演變PPT
- T∕CSAE 237-2021 重型汽車實(shí)際行駛污染物排放測(cè)試技術(shù)規(guī)范
- 腔隙性腦梗塞診療臨床路徑
- 幼兒園繪本故事:《感謝的味道》 PPT課件
- 《工作周報(bào)管理制度管理辦法》
- 消防設(shè)施設(shè)備及器材
- 胎心監(jiān)護(hù)專家共識(shí)
- 環(huán)境工程專業(yè)英語翻譯理論P(yáng)PT選編課件
- 金融企業(yè)詳細(xì)劃分標(biāo)準(zhǔn)出臺(tái)-共分大中小微四類型
- 好書推薦——《三毛流浪記》PPT通用課件
評(píng)論
0/150
提交評(píng)論