Python 3 基礎(chǔ)教程(第3版)(慕課版) 課件 第6章 函數(shù)與模塊_第1頁(yè)
Python 3 基礎(chǔ)教程(第3版)(慕課版) 課件 第6章 函數(shù)與模塊_第2頁(yè)
Python 3 基礎(chǔ)教程(第3版)(慕課版) 課件 第6章 函數(shù)與模塊_第3頁(yè)
Python 3 基礎(chǔ)教程(第3版)(慕課版) 課件 第6章 函數(shù)與模塊_第4頁(yè)
Python 3 基礎(chǔ)教程(第3版)(慕課版) 課件 第6章 函數(shù)與模塊_第5頁(yè)
已閱讀5頁(yè),還剩83頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Python3基礎(chǔ)教程第2版慕課版單元6函數(shù)與模塊任務(wù)6-1:定義個(gè)人綜合所得稅計(jì)算函數(shù)【任務(wù)目標(biāo)】修改任務(wù)5-1中實(shí)現(xiàn)的個(gè)人綜合所得稅計(jì)算程序,定義一個(gè)函數(shù)來(lái)完成個(gè)人綜合所得稅計(jì)算,將月工資及各項(xiàng)扣除費(fèi)用作為參數(shù)傳遞給函數(shù),函數(shù)返回應(yīng)繳納的個(gè)人綜合所得稅。調(diào)用函數(shù),完成表6-1中3名員工的個(gè)人綜合所得稅計(jì)算?!救蝿?wù)實(shí)施】演示過(guò)程……6.1函數(shù)在實(shí)現(xiàn)大型項(xiàng)目時(shí),程序員往往會(huì)將需要重復(fù)使用的代碼提取出來(lái),將其定義為函數(shù),從而減輕編程工作量,也使程序結(jié)構(gòu)簡(jiǎn)化。本節(jié)主要內(nèi)容:定義函數(shù)調(diào)用函數(shù)函數(shù)的參數(shù)函數(shù)嵌套定義lambda函數(shù)遞歸函數(shù)函數(shù)列表程序設(shè)計(jì)方法簡(jiǎn)介6.1.1定義函數(shù)def語(yǔ)句用于定義函數(shù),其基本格式如下。def函數(shù)名(參數(shù)表):

函數(shù)語(yǔ)句

return返回值參數(shù)和返回值都可省略,示例代碼如下。>>>defhello(): #定義函數(shù)...print('Python你好')...>>>hello() #調(diào)用函數(shù)Python你好hello()函數(shù)沒(méi)有參數(shù)和返回值,它調(diào)用print()函數(shù)輸出一個(gè)字符串。為函數(shù)指定參數(shù)時(shí),參數(shù)之間用逗號(hào)分隔。下面的例子為函數(shù)定義兩個(gè)參數(shù),并返回兩個(gè)參數(shù)的和。>>>defadd(a,b): #定義函數(shù)...returna+b...>>>add(1,2) #調(diào)用函數(shù)36.1.2調(diào)用函數(shù)調(diào)用函數(shù)的基本格式如下。函數(shù)名(參數(shù)表)在Python中,所有的語(yǔ)句都是解釋執(zhí)行的,不存在如C/C++中的編譯過(guò)程。def也是一條可執(zhí)行語(yǔ)句,它完成函數(shù)的定義。Python中函數(shù)的調(diào)用必須出現(xiàn)在函數(shù)的定義之后。在Python中,函數(shù)也是對(duì)象(function對(duì)象)。def語(yǔ)句在執(zhí)行時(shí)會(huì)創(chuàng)建一個(gè)函數(shù)對(duì)象。函數(shù)名是一個(gè)變量,它引用def語(yǔ)句創(chuàng)建的函數(shù)對(duì)象??蓪⒑瘮?shù)名賦值給變量,使變量引用同一個(gè)函數(shù)>>>defadd(a,b): #定義函數(shù)...returna+b...>>>add #直接用函數(shù)名,可返回函數(shù)對(duì)象的內(nèi)存地址<functionaddat0x00D41078>>>>add(10,20) #調(diào)用函數(shù)30>>>x=add #將函數(shù)名賦值給變量>>>x(1,2) #通過(guò)變量調(diào)用函數(shù)36.1.3函數(shù)的參數(shù)在函數(shù)定義的參數(shù)表中的參數(shù)稱為形式參數(shù),簡(jiǎn)稱形參。調(diào)用函數(shù)時(shí),參數(shù)表中提供的參數(shù)稱為實(shí)際參數(shù),簡(jiǎn)稱實(shí)參。實(shí)參可以是常量、表達(dá)式或變量。實(shí)參是常量或表達(dá)式時(shí),直接將常量或表達(dá)式計(jì)算結(jié)果傳遞給形參。在Python中,變量保存的是對(duì)象的引用,實(shí)參為變量時(shí),參數(shù)傳遞會(huì)將實(shí)參對(duì)對(duì)象的引用賦值給形參。1.參數(shù)的多態(tài)性多態(tài)是面向?qū)ο蟮囊粋€(gè)特點(diǎn),指不同對(duì)象執(zhí)行同一個(gè)行為可能會(huì)得到不同的結(jié)果。同一個(gè)函數(shù),傳遞的實(shí)際參數(shù)類型不同時(shí),可獲得不同的結(jié)果,體現(xiàn)了多態(tài)性。>>>defadd(a,b): ...returna+b #兩個(gè)參數(shù)執(zhí)行加法運(yùn)算...>>>add(1,2) #執(zhí)行數(shù)字加法3>>>add('abc','def') #執(zhí)行字符串連接'abcdef'>>>add((1,2),(3,4)) #執(zhí)行元組合并(1,2,3,4)>>>add([1,2],[3,4]) #執(zhí)行列表合并[1,2,3,4]2.參數(shù)賦值傳遞調(diào)用函數(shù)時(shí)會(huì)按參數(shù)的先后順序,依次將實(shí)參傳遞給形參。例如,調(diào)用add(1,2)時(shí),1傳遞給a,2傳遞給b。Python允許以形參賦值的方式,將實(shí)參傳遞給指定形參。>>>defadd(a,b):...returna+b...>>>add(a='ab',b='cd') #通過(guò)賦值來(lái)傳遞參數(shù)'abcd'>>>add(b='ab',a='cd') #通過(guò)賦值來(lái)傳遞參數(shù)'cdab'采用參數(shù)賦值傳遞時(shí),因?yàn)橹该髁诵螀⒚Q,所以參數(shù)的先后順序已無(wú)關(guān)緊要。參數(shù)賦值傳遞的方式稱為關(guān)鍵字傳遞,此時(shí)可將形參稱為關(guān)鍵字。3.參數(shù)傳遞與共享引用>>>deff(x):...x=100...>>>a=10>>>f(a) >>>a10從結(jié)果可以看出,將實(shí)參a傳遞給形參x后,在函數(shù)中重新賦值x,并不會(huì)影響到實(shí)參a。這是因?yàn)镻ython中的賦值是建立變量到對(duì)象的引用。重新賦值時(shí),意味著形參引用了新的對(duì)象。當(dāng)實(shí)參引用的是可變對(duì)象,如列表、字典等時(shí),若在函數(shù)中修改形參,通過(guò)共享引用,實(shí)參也引用修改后的對(duì)象,示例代碼如下。>>>deff(a):...a[0]='abc' #修改對(duì)象的第一個(gè)元素值...>>>x=[1,2]>>>f(x) #調(diào)用函數(shù),傳遞列表對(duì)象的引用>>>x #變量x引用的列表對(duì)象在函數(shù)中被修改['abc',2]如果不希望函數(shù)內(nèi)的修改影響函數(shù)外的數(shù)據(jù),應(yīng)注意避免傳遞可變對(duì)象的引用。如果要避免列表在函數(shù)中被修改,可使用列表的副本作為實(shí)參,示例代碼如下。>>>deff(a):...a[0]='abc' #修改對(duì)象的第一個(gè)元素值...>>>x=[1,2]>>>f(x[:]) #傳遞列表的副本>>>x #結(jié)果顯示原列表不變[1,2]還可以在函數(shù)中對(duì)列表進(jìn)行復(fù)制,調(diào)用函數(shù)時(shí)實(shí)參使用引用列表的變量,示例代碼如下。>>>deff(a):...a=a[:] #復(fù)制列表...a[0]='abc' #修改列表的副本...>>>x=[1,2]>>>f(x) #調(diào)用函數(shù)>>>x #結(jié)果顯示原列表不變[1,2]4.有默認(rèn)值的可選參數(shù)在定義函數(shù)時(shí),可以為參數(shù)設(shè)置默認(rèn)值。調(diào)用函數(shù)時(shí)如果未提供實(shí)參,則形參取默認(rèn)值,示例代碼如下。>>>defadd(a,b=-100): #參數(shù)b默認(rèn)值為-100...returna+b...>>>add(1,2) #傳遞指定參數(shù)3>>>add(1) #形參b取默認(rèn)值-99應(yīng)注意,帶默認(rèn)值的參數(shù)為可選參數(shù),在定義函數(shù)時(shí),應(yīng)放在參數(shù)表的末尾。5.接受任意個(gè)數(shù)的參數(shù)在定義函數(shù)時(shí),如果在參數(shù)名前面使用星號(hào)“*”,表示形參是一個(gè)元組,可接受任意個(gè)數(shù)的參數(shù)。調(diào)用函數(shù)時(shí),可以不為帶星號(hào)的形參提供數(shù)據(jù)示例代碼如下。>>>defadd(a,*b):...s=a...forxinb: #用循環(huán)迭代元組b中的對(duì)象...s+=x #累加...returns #返回累加結(jié)果...>>>add(1)#不為帶星號(hào)的形參提供數(shù)據(jù),此時(shí)形參b為空元組1>>>add(1,2) #求兩個(gè)數(shù)的和,此時(shí)形參b為元組(2,)3>>>add(1,2,3) #求3個(gè)數(shù)的和,此時(shí)形參b為元組(2,3)6>>>add(1,2,3,4,5) #求5個(gè)數(shù)的和,此時(shí)形參b為元組(2,3,4,5)156.必須通過(guò)賦值傳遞的參數(shù)Python允許使用必須通過(guò)賦值傳遞的參數(shù)。在定義函數(shù)時(shí),帶星號(hào)參數(shù)之后的參數(shù)必須通過(guò)賦值傳遞示例代碼如下。>>>defadd(a,*b,c):...s=a+c...forxinb:...s+=x...returns...>>>add(1,2,3) #形參c未使用賦值傳遞,出錯(cuò)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:add()missing1requiredkeyword-onlyargument:'c'>>>add(1,2,c=3) #形參c使用賦值傳遞6>>>add(1,c=3) #帶星號(hào)參數(shù)可以省略4在定義函數(shù)時(shí),也可單獨(dú)使用星號(hào),其后的參數(shù)必須通過(guò)賦值傳遞示例代碼如下。>>>deff(a,*,b,c): #參數(shù)b和c必需通過(guò)賦值傳遞...returna+b+c...>>>f(1,b=2,c=3)66.1.4函數(shù)嵌套定義Python允許在函數(shù)內(nèi)部定義函數(shù),示例代碼如下。>>>defadd(a,b): ...defgetsum(x): #在函數(shù)內(nèi)部定義的函數(shù),將字符串轉(zhuǎn)換為Unicode碼求和...s=0...forninx:...s+=ord(n)...returns...returngetsum(a)+getsum(b) #調(diào)用內(nèi)部定義的函數(shù)getsum...>>>add('12','34') #調(diào)用函數(shù)202注意,內(nèi)部函數(shù)只能在函數(shù)內(nèi)部使用。6.1.5lambda函數(shù)lambda函數(shù)也稱表達(dá)式函數(shù),用于定義匿名函數(shù)??蓪ambda函數(shù)賦值給變量,通過(guò)變量調(diào)用函數(shù)。lambda函數(shù)定義的基本格式如下。lambda參數(shù)表:表達(dá)式示例代碼如下。>>>add=lambdaa,b:a+b #定義表達(dá)式函數(shù),賦值給變量>>>add(1,2) #函數(shù)調(diào)用格式不變3>>>add('ab','ad')'abad'lambda函數(shù)非常適合定義簡(jiǎn)單的函數(shù)與def不同,lambda的函數(shù)體只能是一個(gè)表達(dá)式可在表達(dá)式中調(diào)用其他的函數(shù),但不能使用其他的語(yǔ)句示例代碼如下。>>>add=lambdaa,b:ord(a)+ord(b) #在lambda表達(dá)式中調(diào)用其他的函數(shù)>>>add('1','2')996.1.6遞歸函數(shù)遞歸函數(shù)是指在函數(shù)體內(nèi)調(diào)用函數(shù)本身。例如,下面的函數(shù)fac()實(shí)現(xiàn)計(jì)算階乘。>>>deffac(n): #定義函數(shù)...ifn==0: #遞歸調(diào)用的終止條件...return1...else:...returnn*fac(n-1) #遞歸調(diào)用函數(shù)本身...>>>fac(5)120注意,遞歸函數(shù)必須在函數(shù)體中設(shè)置遞歸調(diào)用的終止條件。如果沒(méi)有設(shè)置遞歸調(diào)用終止條件,程序會(huì)在超過(guò)Python允許的最大遞歸調(diào)用深度后,產(chǎn)生RecursionError異常(遞歸調(diào)用錯(cuò)誤)。6.1.7函數(shù)列表因?yàn)楹瘮?shù)是一種對(duì)象,所以可將其作為列表元素使用,然后通過(guò)列表索引來(lái)調(diào)用函數(shù)示例代碼如下。>>>d=[lambdaa,b:a+b,lambdaa,b:a*b] #使用lambda函數(shù)建立列表>>>d[0](1,3) #調(diào)用第一個(gè)函數(shù)4>>>d[1](1,3) #調(diào)用第二個(gè)函數(shù)3也可使用def定義的函數(shù)來(lái)創(chuàng)建列表,示例代碼如下。>>>defadd(a,b): #定義求和函數(shù)...returna+b...>>>deffac(n): #定義求階乘函數(shù)...ifn==0:...return1...else:...returnn*fac(n-1)>>>d=[add,fac] #建立函數(shù)列表>>>d[0](1,2) #調(diào)用求和函數(shù)3>>>d[1](5) #調(diào)用求階乘函數(shù)120>>>d=(add,fac) #建立包含函數(shù)列表的元組對(duì)象>>>d[0](2,3) #調(diào)用求和函數(shù)5>>>d[1](5) #調(diào)用求階乘函數(shù)120Python還允許使用字典來(lái)建立函數(shù)映射,示例如下。>>>d={'求和':add,'求階乘':fac}#用函數(shù)add和fac建立函數(shù)映射>>>d['求和'](1,2) #調(diào)用求和函數(shù)3>>>d['求階乘'](5) #調(diào)用求階乘函數(shù)1206.1.8程序設(shè)計(jì)方法簡(jiǎn)介程序設(shè)計(jì)方法是思考、設(shè)計(jì)、編寫(xiě)程序的方法,也可稱為編程范式。編程范式主要分為兩大范式:命令式編程范式、聲明式編程范式。這兩大范式衍生出最基本的面向過(guò)程范式、面向?qū)ο蠓妒?、函?shù)式范式和邏輯式范式4種子編程范式。面向過(guò)程范式和面向?qū)ο蠓妒綄儆诿钍骄幊谭妒?,函?shù)式范式和邏輯式范式屬于聲明式編程范式。Python支持面向過(guò)程范式、面向?qū)ο蠓妒健⒑瘮?shù)式范式等多種子編程范式。1.面向過(guò)程范式面向過(guò)程范式也稱過(guò)程式編程,是一種基于計(jì)算過(guò)程或運(yùn)算流程的編程范式。過(guò)程式編程將計(jì)算任務(wù)描述為操作流程或步驟,逐步實(shí)現(xiàn)操作流程或步驟所要求的計(jì)算功能。面向過(guò)程程序是由多個(gè)過(guò)程組合而成的,其中包含順序、分支和循環(huán)等程序控制結(jié)構(gòu)。2.面向?qū)ο蠓妒矫嫦驅(qū)ο蠓妒接妙悂?lái)表示實(shí)體,對(duì)象是類的實(shí)例。數(shù)據(jù)和操作被封裝在對(duì)象中,數(shù)據(jù)是對(duì)象的數(shù)據(jù)成員,操作是對(duì)象的方法成員。執(zhí)行方法時(shí),對(duì)象根據(jù)來(lái)自方法的消息執(zhí)行相應(yīng)的計(jì)算,以實(shí)現(xiàn)交互并完成任務(wù)。3.函數(shù)式范式函數(shù)式范式是一種基于遞歸函數(shù)計(jì)算理論的范式,其程序由一系列函數(shù)組成,執(zhí)行程序便是計(jì)算這些函數(shù)并對(duì)表達(dá)式求值。例如,Python中的list(map(lambdax:x*2,range(4))表達(dá)式通過(guò)多個(gè)函數(shù)調(diào)用生成列表[0,2,4,6]。Python還支持一種新的編程范式——生態(tài)式編程。Python通過(guò)數(shù)量龐大的第三方庫(kù),構(gòu)成了一個(gè)覆蓋眾多應(yīng)用領(lǐng)域的計(jì)算生態(tài)。在程序中,通過(guò)使用第三方庫(kù),只需要簡(jiǎn)單的程序代碼即可實(shí)現(xiàn)功能復(fù)雜的應(yīng)用程序。任務(wù)6-2:測(cè)試變量作用域【任務(wù)目標(biāo)】運(yùn)行下面的程序,關(guān)注程序中全局變量和本地變量的值。#test6_07.py:測(cè)試變量作用域a=10#賦值,創(chuàng)建全局變量defshow():a=100#賦值,創(chuàng)建本地變量print('inshow():a=',a)#輸出本地變量ashow()print('全局變量:a=',a)#輸出全局變量a【任務(wù)實(shí)施】演示過(guò)程……6.2變量的作用域變量的作用域是變量的可使用范圍,也稱為變量的命名空間。在第一次給變量賦值時(shí),Python創(chuàng)建變量,變量創(chuàng)建的位置決定了變量的作用域。本節(jié)主要內(nèi)容:作用域分類global語(yǔ)句nonlocal語(yǔ)句6.2.1作用域分類Python中變量的作用域可分為4種:本地作用域、函數(shù)嵌套作用域、文件作用域和內(nèi)置作用域,如圖所示本地作用域:沒(méi)有內(nèi)部函數(shù)時(shí),函數(shù)體為本地作用域。函數(shù)內(nèi)通過(guò)賦值創(chuàng)建的變量、函數(shù)參數(shù)的作用域都為本地作用域。函數(shù)嵌套作用域:包含內(nèi)部函數(shù)時(shí),函數(shù)體為函數(shù)嵌套作用域。文件作用域:程序文件(也稱模塊文件)的內(nèi)部為文件作用域。內(nèi)置作用域:Python運(yùn)行時(shí)的環(huán)境為內(nèi)置作用域,它包含Python的各種內(nèi)置的變量和函數(shù)。內(nèi)置作用域和文件作用域可稱為全局作用域。根據(jù)作用域范圍大小,通常將變量分為兩種:全局變量和本地變量。在內(nèi)置作用域和文件作用域內(nèi)定義的變量都屬于全局變量(函數(shù)則可稱為全局函數(shù))。在函數(shù)嵌套作用域和本地作用域內(nèi)定義的變量都屬于本地變量,本地變量也可稱為局部變量(函數(shù)則可成為本地函數(shù)或局部函數(shù))。考察下面的代碼:#文件作用域a=10 #a是全局變量defadd(b): #參數(shù)b是函數(shù)add內(nèi)的本地變量

c=a+b #c是函數(shù)add內(nèi)的本地變量,a是函數(shù)外部的全局變量

returncprint(add(5)) #調(diào)用函數(shù)該程序在運(yùn)行過(guò)程中,會(huì)創(chuàng)建4個(gè)變量:a、b、c和add,a和add是文件作用域內(nèi)的全局變量,b和c是函數(shù)add內(nèi)部的本地變量。另外該程序還用到了print這個(gè)內(nèi)置函數(shù),它是內(nèi)置作用域中的全局變量。作用域外的變量與作用域內(nèi)的變量名稱相同時(shí),以“本地”優(yōu)先原則,此時(shí)外部的變量被屏蔽——稱為作用域隔離原則。>>>a=10 #賦值,創(chuàng)建全局變量a>>>defshow():...a=100 #賦值,創(chuàng)建本地變量a...print('inshow():a=',a) #輸出本地變量a...>>>show()inshow():a=100>>>a #輸出全局變量a106.2.2global語(yǔ)句在函數(shù)內(nèi)部給變量賦值時(shí),默認(rèn)情況下該變量為本地變量。為了在函數(shù)內(nèi)部給全局變量賦值,Python提供了global語(yǔ)句,用于在函數(shù)內(nèi)部聲明全局變量示例代碼如下。>>>defshow():...globala #聲明a是全局變量...print('a=',a) #輸出全局變量a...a=100 #給全局變量a賦值...print('a=',a)>>>a=10>>>show()a=10a=100>>>a1006.2.3nonlocal語(yǔ)句作用域隔離原則同樣適用于嵌套函數(shù)。在嵌套函數(shù)內(nèi)使用與外層函數(shù)同名的變量時(shí),若該變量在嵌套函數(shù)內(nèi)沒(méi)有被賦值,則該變量就是外層函數(shù)的本地變量示例代碼如下。>>>deftest():...a=10 #創(chuàng)建test函數(shù)的本地變量a...defshow():...print('inshow(),a=',a) #使用test函數(shù)的本地變量a...show()...print('intest(),a=',a) #使用test函數(shù)的本地變量a...>>>test()inshow(),a=10intest(),a=10修改上面的代碼,在嵌套函數(shù)show()內(nèi)為a賦值,代碼如下。>>>deftest():...a=10 #創(chuàng)建test函數(shù)的本地變量a...defshow():...a=100 #創(chuàng)建show函數(shù)的本地變量a...print('inshow(),a=‘,a) #使用show函數(shù)的本地變量a...show()...print('intest(),a=',a) #使用test函數(shù)的本地變量a...>>>test()inshow(),a=100intest(),a=10如果要在嵌套函數(shù)內(nèi)部為外層函數(shù)的本地變量賦值,Python提供了nonlocal語(yǔ)句。nonlocal語(yǔ)句與global語(yǔ)句類似,它聲明變量是外層函數(shù)的本地變量,示例代碼如下。>>>deftest():...a=10 #創(chuàng)建test函數(shù)的本地變量a...defshow():...nonlocala #聲明a是test函數(shù)的本地變量...a=100 #為test函數(shù)的本地變量a賦值...print('inshow(),a=',a)#使用test函數(shù)的本地變量a...show()...print('intest(),a=',a) #使用test函數(shù)的本地變量a...>>>test()inshow(),a=100intest(),a=100任務(wù)6-3:調(diào)用模塊中的唐詩(shī)檢索函數(shù)【任務(wù)目標(biāo)】參考任務(wù)5-2中的唐詩(shī)檢索程序,編寫(xiě)一個(gè)唐詩(shī)檢索函數(shù),用文件名和唐詩(shī)名稱作為參數(shù),在文件中檢索唐詩(shī)。如果檢索到則返回唐詩(shī)內(nèi)容,否則返回空字符串。將唐詩(shī)檢索函數(shù)保存在一個(gè)程序文件中,將該文件作為模塊使用,調(diào)用其中的唐詩(shī)檢索函數(shù)檢索指定的唐詩(shī)?!救蝿?wù)實(shí)施】演示過(guò)程……6.3模塊模塊也可稱為庫(kù),是一個(gè)包含變量、函數(shù)或類的程序文件。模塊中也可以包含其他各種Python語(yǔ)句。大型系統(tǒng)往往將系統(tǒng)功能劃分為模塊來(lái)實(shí)現(xiàn),或者將常用功能集中在一個(gè)或多個(gè)模塊文件中,然后在程序文件中導(dǎo)入并使用模塊。Python也提供了大量?jī)?nèi)置模塊,并可集成各種擴(kuò)展模塊。本節(jié)主要內(nèi)容:導(dǎo)入模塊導(dǎo)入時(shí)執(zhí)行模塊用import還是from重新載入模塊模塊搜索路徑嵌套導(dǎo)入模塊查看模塊對(duì)象屬性__name__屬性和命令行參數(shù)隱藏模塊變量6.3.1導(dǎo)入模塊模塊需要先導(dǎo)入,然后才能使用其中的變量、函數(shù)或者類等??墒褂胕mport或from語(yǔ)句導(dǎo)入模塊,基本格式如下。import模塊名稱import模塊名稱as新名稱from模塊名稱import導(dǎo)入對(duì)象名稱from模塊名稱import導(dǎo)入對(duì)象名稱as新名稱from模塊名稱import*1.import語(yǔ)句import語(yǔ)句用于導(dǎo)入整個(gè)模塊,可用as為導(dǎo)入的模塊指定一個(gè)新名稱。導(dǎo)入模塊后,使用“模塊名稱.對(duì)象名稱”格式來(lái)引用模塊中的對(duì)象。>>>importmath #導(dǎo)入模塊>>>math.fabs(-5) #調(diào)用模塊中的函數(shù)5.0>>>math.e #使用模塊中的常量2.718281828459045>>>fabs(-5) #試圖直接使用模塊中的函數(shù),出錯(cuò)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>NameError:name'fabs'isnotdefined>>>importmathasm #導(dǎo)入模塊并指定新名稱>>>m.fabs(-5) #通過(guò)新名稱調(diào)用模塊函數(shù)5.0>>>m.e #通過(guò)新名稱使用模塊常量2.7182818284590452.from語(yǔ)句from語(yǔ)句用于導(dǎo)入模塊中的指定對(duì)象,導(dǎo)入的對(duì)象可直接使用,不需要使用模塊名稱作為限定符,示例代碼如下。>>>frommathimportfabs #從模塊導(dǎo)入指定函數(shù)>>>fabs(-5)5.0>>>frommathimporte #從模塊導(dǎo)入指定常量>>>e2.718281828459045>>>frommathimportfabsasf1 #導(dǎo)入時(shí)指定新名稱>>>f1(-10)10.03.from…import*語(yǔ)句使用星號(hào)時(shí),可導(dǎo)入模塊頂層的所有全局變量和函數(shù)示例代碼如下。>>>frommathimport* #導(dǎo)入模塊頂層的全局變量和函數(shù)>>>fabs(-5) #直接使用導(dǎo)入的函數(shù)5.0>>>e #直接使用導(dǎo)入的常量2.7182818284590456.3.2導(dǎo)入時(shí)執(zhí)行模塊import和from語(yǔ)句在執(zhí)行導(dǎo)入操作時(shí),會(huì)執(zhí)行導(dǎo)入模塊中的全部語(yǔ)句。只有執(zhí)行了模塊,模塊中的變量和函數(shù)才會(huì)被創(chuàng)建,才能在當(dāng)前模塊中使用。只有在第一次執(zhí)行導(dǎo)入操作時(shí),才會(huì)執(zhí)行模塊。再次導(dǎo)入模塊時(shí),并不會(huì)重新執(zhí)行模塊。import和from語(yǔ)句是隱性的賦值語(yǔ)句,兩者的區(qū)別如下。Python執(zhí)行import語(yǔ)句時(shí):會(huì)創(chuàng)建一個(gè)模塊對(duì)象和一個(gè)與模塊文件同名的變量,并建立變量和模塊對(duì)象的引用關(guān)系。模塊中的全局對(duì)象作為模塊對(duì)象的屬性或方法使用。再次導(dǎo)入模塊時(shí),不會(huì)改變模塊對(duì)象屬性的當(dāng)前值。Python執(zhí)行from語(yǔ)句時(shí):會(huì)同時(shí)在當(dāng)前模塊和被導(dǎo)入模塊中創(chuàng)建同名變量,這兩個(gè)變量引用同一個(gè)對(duì)象。再次導(dǎo)入模塊時(shí),會(huì)重新將被導(dǎo)入模塊中變量的引用重新賦值給當(dāng)前模塊的變量。再次導(dǎo)入時(shí),會(huì)將被導(dǎo)入模塊的變量的初始值賦值給前模塊的變量。示例代碼如下。首先,創(chuàng)建模塊文件test.py,其代碼如下。x=100 #賦值,創(chuàng)建變量xprint('這是模塊test.py中的輸出!') #輸出字符串defshow(): #定義函數(shù),執(zhí)行時(shí)創(chuàng)建函數(shù)對(duì)象

print('這是模塊test.py中的show()函數(shù)中的輸出!')可將test.py放在系統(tǒng)D盤根目錄中,然后進(jìn)入系統(tǒng)命令提示符窗口,在D盤根目錄中執(zhí)行python.exe進(jìn)入Python交互環(huán)境D:\>python……>>>importtest #導(dǎo)入模塊,下面的輸出說(shuō)明模塊在導(dǎo)入時(shí)被執(zhí)行這是模塊test.py中的輸出!>>>test.x #使用模塊變量100>>>test.x=200 #為模塊變量賦值>>>importtest #重新導(dǎo)入模塊>>>test.x #使用模塊變量,輸出結(jié)果顯示重新導(dǎo)入未影響變量的值200>>>test.show() #調(diào)用模塊函數(shù)這是模塊test.py中的show()函數(shù)中的輸出!>>>abc=test #將模塊變量賦值給另一個(gè)變量>>>abc.x #使用模塊變量200>>>abc.show() #調(diào)用模塊函數(shù)這是模塊test.py中的show()函數(shù)中的輸出!下面的代碼使用from語(yǔ)句導(dǎo)入test模塊。>>>fromtestimportx,show #導(dǎo)入模塊的變量x、show這是模塊test.py中的輸出!>>>x #輸出模塊的變量的初始值100>>>show() #調(diào)用模塊函數(shù)這是模塊test.py中的show()函數(shù)中的輸出!>>>x=200 #這里是為當(dāng)前模塊的變量賦值>>>fromtestimportx,show #重新導(dǎo)入>>>x #x的值為模塊的變量的初始值100在執(zhí)行from語(yǔ)句時(shí),test模塊的所有語(yǔ)句均被執(zhí)行。from語(yǔ)句將test模塊的變量x和show賦值給當(dāng)前模塊的變量x和show。語(yǔ)句“x=200”為當(dāng)前模塊的變量x賦值,不會(huì)影響test模塊的變量x。在重新導(dǎo)入時(shí),當(dāng)前模塊變量x被重新賦值為test模塊的變量x的值。6.3.3用import還是from在使用import語(yǔ)句導(dǎo)入模塊時(shí),模塊的變量使用“模塊名.”作為限定符,所以不存在歧義,即使導(dǎo)入模塊的變量與其他模塊的變量同名也沒(méi)有關(guān)系。在使用from語(yǔ)句導(dǎo)入模塊時(shí),就需要注意多個(gè)模塊中是否存在同名變量的情況。1.使用模塊內(nèi)的可修改對(duì)象使用from導(dǎo)入模塊時(shí),可以直接使用變量引用模塊中的對(duì)象,從而避免輸入“模塊名.”作為限定詞。這種便利有時(shí)也會(huì)遇到麻煩。在下面的模塊test3.py中,變量x引用了整數(shù)對(duì)象100(100是不可修改對(duì)象),y引用了一個(gè)可修改的列表對(duì)象。x=100 #賦值,創(chuàng)建整數(shù)對(duì)象100和變量x,變量x引用整數(shù)對(duì)象100y=[10,20] #賦值,創(chuàng)建列表對(duì)象[10,20]和變量y,變量y引用列表對(duì)象下面的代碼使用from導(dǎo)入模塊test3。>>>x=10 #創(chuàng)建當(dāng)前模塊的變量x>>>y=[1,2] #創(chuàng)建當(dāng)前模塊的變量y>>>fromtest3import* #引用模塊中的x和y>>>x,y #輸出結(jié)果顯示確實(shí)引用了模塊中的對(duì)象(100,[10,20])>>>x=200 #賦值,使當(dāng)前模塊的變量x引用整數(shù)對(duì)象200>>>y[0]=['abc'] #修改第一個(gè)列表元素,此時(shí)會(huì)修改模塊中的列表對(duì)象>>>importtest3 #再次導(dǎo)入模塊>>>test3.x,test3.y #輸出結(jié)果顯示模塊中的列表對(duì)象已被修改(100,[['abc'],20])2.使用from導(dǎo)入兩個(gè)模塊中的同名變量在下面的兩個(gè)模塊test4.py和test5.py中包含了同名的變量。#test4.pydefshow():print('outintest4.py’)#test5.pydefshow():print('outintest5.py')當(dāng)兩個(gè)模塊存在同名變量時(shí),使用from語(yǔ)句導(dǎo)入模塊會(huì)導(dǎo)致變量名沖突,示例代碼如下。>>>fromtest4importshow>>>fromtest5importshow>>>show()outintest5.py>>>fromtest5importshow>>>fromtest4importshow>>>show()outintest4.py當(dāng)兩個(gè)模塊存在同名變量時(shí),應(yīng)使用import語(yǔ)句導(dǎo)入模塊,示例代碼如下。>>>importtest4>>>importtest5>>>test4.show()outintest4.py>>>test5.show()outintest5.py6.3.4重新載入模塊再次使用import或from語(yǔ)句導(dǎo)入模塊時(shí),不會(huì)重新執(zhí)行模塊代碼,所以不會(huì)改變模塊中變量的值。Python在importlib模塊中提供的reload()函數(shù),它可重新載入模塊(即執(zhí)行模塊代碼),從而改模塊中變量的值。reload()函數(shù)用模塊名稱作為參數(shù),所以只能重新載入使用import語(yǔ)句導(dǎo)入的模塊。如果要重新載入的模塊還沒(méi)有導(dǎo)入,執(zhí)行reload()函數(shù)會(huì)出錯(cuò)>>>importtest #導(dǎo)入模塊,模塊代碼被執(zhí)行這是模塊test.py中的輸出!>>>test.x100>>>test.x=200>>>importtest #再次導(dǎo)入>>>test.x #再次導(dǎo)入沒(méi)有改變當(dāng)前值200>>>fromimpimportreload #導(dǎo)入reload函數(shù)>>>reload(test) #重載模塊,可以看到模塊代碼被再次執(zhí)行這是模塊test.py中的輸出!<module'test'from'D:\\Python35\\test.py'>>>>test.x #因?yàn)槟K代碼再次執(zhí)行,x恢復(fù)為初始值1006.3.5模塊搜索路徑在導(dǎo)入模塊時(shí),Python會(huì)執(zhí)行下列3個(gè)步驟。(1)搜索模塊文件:在導(dǎo)入模塊時(shí),Python按特定的路徑搜索模塊文件。(2)必要時(shí)編譯模塊:找到模塊文件后,Python會(huì)檢查文件的時(shí)間戳。如果字節(jié)碼文件比源代碼文件舊(即源代碼文件作了修改),Python就會(huì)執(zhí)行編譯操作,生成最新的字節(jié)碼文件。如果字節(jié)碼文件是最新的,則跳過(guò)編譯環(huán)節(jié)。如果在搜索路徑中只發(fā)現(xiàn)了字節(jié)碼,而沒(méi)有發(fā)現(xiàn)源代碼文件,則直接加載字節(jié)碼文件。如果只有源代碼文件,Python會(huì)執(zhí)行編譯操作,生成字節(jié)碼文件。(3)執(zhí)行模塊:執(zhí)行模塊的字節(jié)碼文件。在導(dǎo)入模塊時(shí),不能在import或from語(yǔ)句中指定模塊文件的路徑,只能依賴于Python搜索路徑??墒褂脴?biāo)準(zhǔn)模塊sys的path屬性來(lái)查看當(dāng)前搜索路徑設(shè)置,示例代碼如下。>>>importsys>>>sys.path['','D:\\Python35\\python35.zip','D:\\Python35\\DLLs','D:\\Python35\\lib','D:\\Python35','D:\\Python35\\lib\\site-packages']第一個(gè)空字符串表示Python當(dāng)前工作目錄。Python按照先后順序依次搜索path列表中的路徑。如果在path列表的所有路徑中均未找到模塊,則導(dǎo)入操作失敗。通常,sys.path由4部分設(shè)置組成。(1)Python的當(dāng)前工作目錄(可用os模塊中的getcwd()函數(shù)查看當(dāng)前目錄名稱)。(2)操作系統(tǒng)的環(huán)境變量PYTHONPATH中包含的目錄(如果存在)。(3)Python標(biāo)準(zhǔn)庫(kù)目錄。(4)任何pth文件包含的目錄(如果有存在)。Python按照上面的順序搜索各個(gè)目錄。pth文件通常放在Python安裝目錄中,文件名可以任意,例如searchpath.pth。在pth文件中,每個(gè)目錄占一行,可包含多個(gè)目錄,示例代碼如下。C:\myapp\helloD:\pytemp\src在Windows10系統(tǒng)中配置環(huán)境變量PYTHONPATH。演示:sys.path列表在程序啟動(dòng)時(shí),自動(dòng)進(jìn)行初始化??稍诖a中對(duì)sys.path列表執(zhí)行添加或刪除操作>>>fromsysimportpath #導(dǎo)入path變量>>>path #顯示當(dāng)前搜索路徑列表……>>>delpath[1] #刪除第二個(gè)搜索路徑>>>path……>>>path.append(r'D:\temp') #添加一條搜索路徑>>>path……6.3.6嵌套導(dǎo)入模塊Python允許任

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論