Python程序設(shè)計(jì)項(xiàng)目化教程(AI助學(xué))(微課版)(第2版)- 課件 任務(wù)5 學(xué)生基本信息管理模塊實(shí)現(xiàn)_第1頁
Python程序設(shè)計(jì)項(xiàng)目化教程(AI助學(xué))(微課版)(第2版)- 課件 任務(wù)5 學(xué)生基本信息管理模塊實(shí)現(xiàn)_第2頁
Python程序設(shè)計(jì)項(xiàng)目化教程(AI助學(xué))(微課版)(第2版)- 課件 任務(wù)5 學(xué)生基本信息管理模塊實(shí)現(xiàn)_第3頁
Python程序設(shè)計(jì)項(xiàng)目化教程(AI助學(xué))(微課版)(第2版)- 課件 任務(wù)5 學(xué)生基本信息管理模塊實(shí)現(xiàn)_第4頁
Python程序設(shè)計(jì)項(xiàng)目化教程(AI助學(xué))(微課版)(第2版)- 課件 任務(wù)5 學(xué)生基本信息管理模塊實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

任務(wù)5:學(xué)生基本信息管理模塊實(shí)現(xiàn)Python程序設(shè)計(jì)1、任務(wù)描述目錄2、技術(shù)準(zhǔn)備Python程序設(shè)計(jì)3、任務(wù)實(shí)施1、任務(wù)描述本任務(wù)主要完成學(xué)生基本信息管理模塊中學(xué)生信息的添加、刪除、修改和顯示功能。要求每個(gè)功能利用單獨(dú)的函數(shù)來實(shí)現(xiàn)。要完成本任務(wù)需要了解和掌握Python中自定義函數(shù)和常用系統(tǒng)函數(shù)的使用。2.1函數(shù)的定義與調(diào)用技術(shù)準(zhǔn)備2.2函數(shù)參數(shù)Python程序設(shè)計(jì)2.3匿名函數(shù)2.4函數(shù)的嵌套與遞歸2.5變量作用域2.6常用系統(tǒng)函數(shù)2.7函數(shù)應(yīng)用示例2.8模塊與包2.1函數(shù)的定義與調(diào)用函數(shù)是組織好的、可重復(fù)使用的、用來實(shí)現(xiàn)某一功能的代碼段。軟件開發(fā)過程中,經(jīng)常有很多操作是完全相同或者相似的,僅僅是處理的數(shù)據(jù)不同而已,此時(shí)就可將這些需要反復(fù)執(zhí)行的代碼封裝成函數(shù),然后在需要該功能的地方調(diào)用封裝好的函數(shù)即可。通過使用函數(shù)不僅可提高代碼的重用度,同時(shí)也方便代碼的維護(hù)。函數(shù)分為兩大類,一類是系統(tǒng)提供的函數(shù),如input()、print()等,這些函數(shù)功能是由系統(tǒng)已經(jīng)事先定義好了,用戶可直接調(diào)用。還有一類函數(shù)是用戶自定義函數(shù),也即用戶可以根據(jù)自己的需要自行定義函數(shù),然后通過調(diào)用函數(shù)來實(shí)現(xiàn)相應(yīng)的功能。2.1函數(shù)的定義與調(diào)用1、函數(shù)的定義def函數(shù)名([形參表]):

函數(shù)體(1)函數(shù)代碼塊以def關(guān)鍵字開頭,后跟函數(shù)名、圓括號(hào)和冒號(hào),然后是函數(shù)體,函數(shù)體相對(duì)于def關(guān)鍵字有一定的縮進(jìn)。(2)函數(shù)的命名規(guī)則與變量命名規(guī)則相同。(3)[形參表]為可選項(xiàng),也即函數(shù)可以有參數(shù),也可以沒有參數(shù)。即使沒有參數(shù),函數(shù)名后面的圓括號(hào)也不能省略。(4)函數(shù)體中可利用return[表達(dá)式]

返回值給調(diào)用方,不帶表達(dá)式的return或沒有return語句系統(tǒng)自動(dòng)返回None。(5)在定義函數(shù)時(shí),為提高代碼可讀性,可以在函數(shù)體開頭加上注釋來說明函數(shù)的功能。2、函數(shù)的調(diào)用格式:函數(shù)名([實(shí)參表])2.1函數(shù)的定義與調(diào)用【例5?1】利用自定義函數(shù)求兩個(gè)數(shù)的平均值。方法一:函數(shù)的定義和調(diào)用都在一個(gè)文件中defavg(n1,n2):'''求兩個(gè)數(shù)的平均值'''return(n1+n2)/2

print(avg(3,4))#函數(shù)調(diào)用2.1函數(shù)的定義與調(diào)用方法二:交互模式下進(jìn)行函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用既可以寫在程序文件中,也可以直接在交互模式中進(jìn)行。在交互模式下函數(shù)定義完須按兩次“Enter”鍵才執(zhí)行該語句。>>>defavg(n1,n2): return(n1+n2)/2

>>>avg(3,4)3.52.1函數(shù)的定義與調(diào)用方法三:將函數(shù)定義寫在文件中,在交互模式下進(jìn)行函數(shù)的調(diào)用。defavg(n1,n2):'''求兩個(gè)數(shù)的平均值'''return(n1+n2)/2將上述代碼保存運(yùn)行后,在交互模式下進(jìn)行函數(shù)的調(diào)用:>>>avg(3,4)3.5>>>avg(2,4)3.02.1函數(shù)的定義與調(diào)用【例5?2】利用自定義函數(shù)輸出如下信息:********************厚德博學(xué),強(qiáng)能善技!********************參考代碼(定義與調(diào)用都在一個(gè)文件中):defprint_head():print('*'*20)print('厚德博學(xué),強(qiáng)能善技!')print('*'*20)

print_head()#函數(shù)調(diào)用2.1函數(shù)的定義與調(diào)用Python中函數(shù)可以有返回值,也可以沒有返回值。當(dāng)有返回值時(shí),返回值可以是一個(gè),也可以是多個(gè)。當(dāng)返回值有多個(gè)時(shí),調(diào)用時(shí)如果要將其返回值賦給變量時(shí),則要么賦給一個(gè)變量(此變量相當(dāng)于一個(gè)元組),要么賦給若干個(gè)變量(個(gè)數(shù)須與返回值個(gè)數(shù)相對(duì)應(yīng)),系統(tǒng)自動(dòng)將其依次賦值給每個(gè)變量。2.1函數(shù)的定義與調(diào)用【例5?3】利用自定義函數(shù)求一個(gè)數(shù)的平方、3次方和4次方。函數(shù)定義部分代碼如下:deffun_demo(n):returnn**2,n**3,n**4交互模式下進(jìn)行函數(shù)調(diào)用:>>>fun_demo(2)(4,8,16)>>>x=fun_demo(2)#將返回值賦值給一個(gè)變量>>>x(4,8,16)>>>x1,x2,x3=fun_demo(2)#將返回值賦值給多個(gè)變量>>>x14>>>x28>>>x3162.2函數(shù)參數(shù)1、參數(shù)傳遞在Python中,函數(shù)調(diào)用時(shí),實(shí)參向形參的數(shù)據(jù)傳遞是單向傳遞,也即實(shí)參數(shù)據(jù)傳遞給形參,而不能由形參傳回給實(shí)參。當(dāng)函數(shù)獲得實(shí)參后,如果函數(shù)體內(nèi)部有對(duì)形參的改變,函數(shù)體內(nèi)對(duì)形參的改變會(huì)不會(huì)影響到實(shí)參,這取決于傳遞的參數(shù)類型。在python中,像字符串、元組、數(shù)字等是不可更改的對(duì)象,稱之為不可變類型,而列表、字典等則是可以修改的對(duì)象,稱之為可變類型。如果傳遞的數(shù)據(jù)是不可變類型時(shí),那么在函數(shù)體內(nèi)對(duì)形參的修改不會(huì)影響到實(shí)參;如果傳遞的是可變類型時(shí),那么在函數(shù)體內(nèi)對(duì)形參的修改可能會(huì)影響到實(shí)參。2.2函數(shù)參數(shù)例1、傳不可變數(shù)據(jù)>>>deffun_test1(n):n=10>>>m=5#m為不可變類型>>>fun_test1(m)>>>m#函數(shù)調(diào)用后其值沒有改變5

2.2函數(shù)參數(shù)例2、傳可變數(shù)據(jù)>>>deffun_test2(n): n.append(5)>>>m=[1,2,3]#m為可變類型對(duì)象>>>fun_test2(m)>>>m#函數(shù)調(diào)用后其值發(fā)生了改變[1,2,3,5]2.2函數(shù)參數(shù)2、參數(shù)形式Python中函數(shù)的參數(shù)形式有位置參數(shù)、關(guān)鍵字參數(shù)、默認(rèn)參數(shù)和不定長參數(shù)4種。(1)位置參數(shù)位置參數(shù)是較常用的一種,也稱為必需參數(shù),函數(shù)調(diào)用時(shí)實(shí)參須以正確的順序傳給形參。實(shí)參數(shù)量必須和形參數(shù)量一樣。>>>deffunc_demo1(n1,n2): print('n1=%d,n2=%d'%(n1,n2))

>>>func_demo1(3,4)n1=3,n2=4>>>func_demo1(4,3)n1=4,n2=3>>>func_demo1(3)Traceback(mostrecentcalllast):File"<pyshell#145>",line1,in<module>func_demo1(3)TypeError:func_demo1()missing1requiredpositionalargument:'n2'2.2函數(shù)參數(shù)(2)關(guān)鍵字參數(shù)函數(shù)調(diào)用使用關(guān)鍵字參數(shù)來確定傳入的參數(shù)值。使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時(shí)參數(shù)的順序與聲明時(shí)不一致,因?yàn)镻ython解釋器能夠用參數(shù)名匹配參數(shù)值。>>>deffunc_demo2(name,score): print('name:%s,score:%d'%(name,score))

>>>func_demo2('李軍',80)#使用位置參數(shù)調(diào)用name:李軍,score:80>>>func_demo2(name='李軍',score=80)#使用關(guān)鍵字參數(shù)調(diào)用name:李軍,score:80>>>func_demo2(score=80,name='李軍')#使用關(guān)鍵字參數(shù)調(diào)用,次序任意name:李軍,score:802.2函數(shù)參數(shù)(3)默認(rèn)值參數(shù)在定義函數(shù)時(shí),可以給參數(shù)賦一個(gè)默認(rèn)值。函數(shù)調(diào)用時(shí),如果該參數(shù)沒有被傳遞值,將使用該默認(rèn)值。默認(rèn)值參數(shù)必須出現(xiàn)在函數(shù)參數(shù)列表的最右端。>>>deffunc_demo3(name,score=60): print('name:%s,score:%d'%(name,score))

>>>func_demo3('李軍')#使用默認(rèn)值參數(shù)調(diào)用name:李軍,score:60>>>func_demo3('李軍',80)#使用位置參數(shù)調(diào)用name:李軍,score:80>>>func_demo3(score=90,name='李軍')#使用關(guān)鍵字參數(shù)調(diào)用name:李軍,score:902.2函數(shù)參數(shù)(4)不定長參數(shù)當(dāng)需要一個(gè)函數(shù)能處理比當(dāng)初聲明時(shí)更多的參數(shù)時(shí),就可用不定長參數(shù)(或叫可變長度參數(shù))。不定長參數(shù)在函數(shù)定義時(shí)主要有兩種形式,即“*變量名”和“**變量名”,用以接收不定長參數(shù)?!?變量名”用于接收任意多個(gè)實(shí)參并將其放在一個(gè)元組中?!?*變量名”接收類似于關(guān)鍵字參數(shù)一樣顯式賦值形式的多個(gè)實(shí)參并將其放于一個(gè)字典中。2.2函數(shù)參數(shù)>>>deffunc_demo4(arg1,*arg2):#第一個(gè)參數(shù)為位置參數(shù),第二個(gè)為不定長參數(shù) print('arg1={},arg2={}'.format(arg1,arg2))

>>>func_demo4(3)#只給出位置參數(shù)arg1=3,arg2=()>>>func_demo4(3,4,5,6,'a')#傳遞4個(gè)數(shù)據(jù)給不定長參數(shù)arg1=3,arg2=(4,5,6,'a')>>>func_demo4(3,4)#傳遞1個(gè)數(shù)據(jù)給不定長參數(shù)arg1=3,arg2=(4,)>>>func_demo4()#位置參數(shù)必須給出,否則拋出異常Traceback(mostrecentcalllast):File"<pyshell#157>",line1,in<module>func_demo4()TypeError:func_demo4()missing1requiredpositionalargument:'arg1'2.2函數(shù)參數(shù)如果函數(shù)調(diào)用時(shí)希望以類似關(guān)鍵字參數(shù)形式來傳參,參數(shù)個(gè)數(shù)任意,則可用雙星號(hào)“**”形式的不定長參數(shù)。函數(shù)調(diào)用時(shí)關(guān)鍵字參數(shù)名可自由指定。>>>deffunc_demo5(arg,**kwargs):#接收的不定長參數(shù)放于字典中 print('arg={},kwargs={}'.format(arg,kwargs))>>>func_demo5(3)#只給出位置參數(shù)arg=3,kwargs={}>>>func_demo5(3,x=5,y=6)#傳遞2個(gè)關(guān)鍵字參數(shù),參數(shù)名任意arg=3,kwargs={'x':5,'y':6}>>>func_demo5(3,score=70)#傳遞1個(gè)關(guān)鍵字參數(shù),參數(shù)名任意arg=3,kwargs={'score':70}2.2函數(shù)參數(shù)3、序列解包在調(diào)用包含多個(gè)參數(shù)的函數(shù)時(shí),可以使用列表、元組、字典、集合及其他可迭代對(duì)象作為實(shí)參,通過在實(shí)參名前加一個(gè)星號(hào)“*”,python解釋器將自動(dòng)對(duì)其進(jìn)行解包,然后傳遞給多個(gè)位置形參。對(duì)字典解包時(shí)默認(rèn)使用字典的鍵。2.2函數(shù)參數(shù)>>>deffunc_demo6(x,y,z): returnx+y+z>>>func_demo6(*[1,2,3])#列表序列解包6>>>func_demo6(*(1,2,3))#元組序列解包6>>>func_demo6(*{1,2,3})#集合序列解包6>>>func_demo6(*{'a':1,'b':2,'c':3})#字典序列解包,解包時(shí)默認(rèn)傳遞的是鍵'abc‘>>>func_demo6(*{'a':1,'b':2,'c':3}.values())#字典序列解包,傳遞其值6>>>func_demo6(*range(1,4))#將range對(duì)象解包6>>>func_demo6(*[1,2,3,4])#序列中元素個(gè)數(shù)與形參個(gè)數(shù)不相等,拋出異常Traceback(mostrecentcalllast):File"<pyshell#177>",line1,in<module>func_demo6(*[1,2,3,4])TypeError:func_demo6()takes3positionalargumentsbut4weregiven2.2函數(shù)參數(shù)還可以通過在字典前面加兩個(gè)星號(hào)“**”來對(duì)字典進(jìn)行解包,此時(shí)會(huì)把字典解包成關(guān)鍵字參數(shù)進(jìn)行傳遞,字典的鍵作為參數(shù)名,值作為參數(shù)的值。采用此種方式解包時(shí),字典的鍵要和函數(shù)的形參名相一致,否則會(huì)拋出異常。>>>deffunc_demo6(x,y,z): returnx+y+z>>>func_demo6(**{'x':1,'y':2,'z':3})#鍵名與形參名相同,正常解包6>>>func_demo6(**{'a':1,'b':2,'c':3})#鍵名與形參名不同,拋出異常Traceback(mostrecentcalllast):File"<pyshell#176>",line1,in<module>func_demo6(**{'a':1,'b':2,'c':3})TypeError:func_demo6()gotanunexpectedkeywordargument'a'2.2函數(shù)參數(shù)調(diào)用函數(shù)時(shí)如果對(duì)實(shí)參使用一個(gè)星號(hào)“*”進(jìn)行序列解包,這么這些解包后的實(shí)參將會(huì)被當(dāng)做位置參數(shù)對(duì)待,并且會(huì)在關(guān)鍵字參數(shù)和使用兩個(gè)星號(hào)“**”進(jìn)行序列解包的參數(shù)之前進(jìn)行處理。>>>deffunc_demo7(x,y,z): print('x={},y={},z={}'.format(x,y,z)) >>>func_demo7(*(1,2,3))#序列解包x=1,y=2,z=3>>>func_demo7(1,*(2,3))#位置參數(shù)和序列解包同時(shí)使用x=1,y=2,z=3>>>func_demo7(*(1,2),3)x=1,y=2,z=32.2函數(shù)參數(shù)>>>func_demo7(x=1,*(2,3))#序列解包相當(dāng)于位置參數(shù),優(yōu)先處理Traceback(mostrecentcalllast):File"<pyshell#183>",line1,in<module>func_demo7(x=1,*(2,3))TypeError:func_demo7()gotmultiplevaluesforargument'x'>>>func_demo7(z=1,*(2,3))#序列解包相當(dāng)于位置參數(shù),優(yōu)先處理x=2,y=3,z=1>>>func_demo7(**{'x':1},*(2,3))#序列解包不能在關(guān)鍵字參數(shù)解包之后SyntaxError:iterableargumentunpackingfollowskeywordargumentunpacking>>>func_demo7(*(2,3),**{'z':1})#序列解包須在關(guān)鍵字參數(shù)解包之前x=2,y=3,z=12.2函數(shù)參數(shù)提示:可變參數(shù)和序列解包都會(huì)出現(xiàn)星號(hào)“*”和“**”。如何區(qū)分出現(xiàn)的星號(hào)到底是表示可變參數(shù)還是序列解包?看星號(hào)出現(xiàn)的位置。如果出現(xiàn)在函數(shù)定義中也即在形參前面表示的是可變參數(shù),如果出現(xiàn)在函數(shù)調(diào)用中也即實(shí)參前面表示的是序列解包。2.3匿名函數(shù)1、匿名函數(shù)的定義匿名函數(shù)是沒有函數(shù)名、臨時(shí)使用的小函數(shù),多用于需要一個(gè)函數(shù)作為另一個(gè)函數(shù)參數(shù)的場合。Python中使用lambda表達(dá)式來創(chuàng)建匿名函數(shù)。格式:lambda[arg_list]:expression其中,lambda是Python的關(guān)鍵字,可選參數(shù)arg_list為形參列表(形參可以有,也可以沒有,與自定義函數(shù)中相同),4種參數(shù)形式(位置參數(shù)、關(guān)鍵字參數(shù)、默認(rèn)值參數(shù)、不定長參數(shù))皆可;expression為函數(shù)體,只允許包含一個(gè)表達(dá)式,不允許包含其他復(fù)雜語句,但在表達(dá)式中可調(diào)用其他函數(shù),以實(shí)現(xiàn)較復(fù)雜的業(yè)務(wù)邏輯。2.3匿名函數(shù)lambda表達(dá)式的結(jié)果相當(dāng)于函數(shù)的返回值,可將lambda表達(dá)式賦值給一個(gè)變量,然后使用這個(gè)變量來進(jìn)行函數(shù)調(diào)用(這里變量就相當(dāng)于函數(shù)名)。>>>total=lambdax,y:x+y>>>total(5,6)11>>>total=lambdax,y=10:x+y>>>total(5)15>>>total(5,7)12>>>total(x=8,y=9)17>>>test=lambda*args:print('args=',args)>>>test()args=()>>>test(1,2,3)args=(1,2,3)>>>test(1)args=(1,)>>>test=lambda**kwargs:print(‘kwargs=‘,kwargs)>>>test(x=1,y=2)kwargs={'x':1,'y':2}2.3匿名函數(shù)lambda表達(dá)式中可調(diào)用其他函數(shù)。>>>deffunc_demo(n): returnn**2,n**3,n**4

>>>func_demo(2)(4,8,16)>>>result=lambdan:func_demo(n)>>>result(2)(4,8,16)2.3匿名函數(shù)2.匿名函數(shù)的使用匿名函數(shù)的使用實(shí)際上就是定義一個(gè)lambda表達(dá)式。在實(shí)際中,根據(jù)這個(gè)lambda表達(dá)式應(yīng)用場景的不同,可以將lambda表達(dá)式的用法大體分為以下幾種。(1)將lambda表達(dá)式賦值給一個(gè)變量,通過這個(gè)變量來調(diào)用該匿名函數(shù)。>>>total=lambdaa,b:a+b#將lambda表達(dá)式賦值給一個(gè)變量>>>total(3,4)#通過變量來調(diào)用函數(shù)7>>>demo=[lambdax:x**2,lambdax:x**3,lambdax:x**4]#lambda表達(dá)式可作為列表元素>>>demo[0](2)4>>>demo[1](3)27>>>demo[2](2)162.3匿名函數(shù)>>>demo={'f1':lambda:2*3,'f2':lambdax:2*x,'f3':lambdax,y:x+y}>>>demo['f1']()6>>>demo['f2'](2)4>>>demo['f3'](3,4)72.3匿名函數(shù)(2)

將lambda表達(dá)式作為其他函數(shù)的返回值,返回給調(diào)用者。函數(shù)的返回值也可以是函數(shù),例如returnlambdax,y:x+y返回一個(gè)加法函數(shù)。這時(shí),lambda函數(shù)實(shí)際上是定義在某個(gè)函數(shù)內(nèi)部的函數(shù),稱之為嵌套函數(shù),或者內(nèi)部函數(shù)。>>>defdemo(): returnlambdax:x*2>>>demo()(3)62.3匿名函數(shù)(3)將lambda表達(dá)式作為參數(shù)傳遞給其他函數(shù)部分Python內(nèi)置函數(shù)接收函數(shù)作為參數(shù),常用的此類內(nèi)置函數(shù)有map()、sorted()、filter()、reduce()等。在此先以sorted()為例說明。內(nèi)置函數(shù)sorted()中的參數(shù)key可用lambda表達(dá)式來實(shí)現(xiàn)較復(fù)雜的排序規(guī)則。>>>data=[3,5,2,9,10,13,1235,234,45]>>>sorted(data)[2,3,5,9,10,13,45,234,1235]>>>sorted(data,key=lambdax:-x)[1235,234,45,13,10,9,5,3,2]>>>sorted(data,reverse=True)[1235,234,45,13,10,9,5,3,2]>>>sorted(data,key=lambdax:len(str(x)))#按轉(zhuǎn)換成字符串以后的長度排序[3,5,2,9,10,13,45,234,1235]2.3匿名函數(shù)還可用在對(duì)類似矩陣形式的數(shù)據(jù)的排序中。設(shè)有一矩陣matrix=[[1,0,5,3,16],[18,13,17,11,16],[11,6,10,2,15],[11,12,2,15,1],[4,1,5,2,12]],為便于查看其內(nèi)容,將其以矩陣形式輸出:>>>forlineinmatrix: print(line)

[1,0,5,3,16][18,13,17,11,16][11,6,10,2,15][11,12,2,15,1][4,1,5,2,12]#先按矩陣中第1列值升序排序,第1列有相同值再按第5列值升序排序:>>>result=sorted(matrix,key=lambdacol:(col[0],col[4]))>>>forlineinresult: print(line)

[1,0,5,3,16][4,1,5,2,12][11,12,2,15,1][11,6,10,2,15][18,13,17,11,16]2.4函數(shù)的嵌套與遞歸1、函數(shù)的嵌套函數(shù)的嵌套包括函數(shù)的嵌套調(diào)用和嵌套定義,多數(shù)語言中只支持函數(shù)的嵌套調(diào)用,Python中既支持函數(shù)的嵌套調(diào)用也支持函數(shù)的嵌套定義。函數(shù)的嵌套調(diào)用是指在定義一個(gè)函數(shù)時(shí)又調(diào)用了別的函數(shù)(如果函數(shù)在定義時(shí)又直接或間接調(diào)用了其自身,就構(gòu)成了函數(shù)的遞歸)。函數(shù)的嵌套定義是指在一個(gè)函數(shù)的函數(shù)體內(nèi)部還可以再定義一個(gè)函數(shù),將定義在某個(gè)函數(shù)內(nèi)部的函數(shù),稱之內(nèi)部函數(shù),將包含內(nèi)部函數(shù)的函數(shù)稱之為外部函數(shù)。2.4函數(shù)的嵌套與遞歸

2.4函數(shù)的嵌套與遞歸方法2:利用函數(shù)的嵌套定義實(shí)現(xiàn)defcmn(m,n):#外部函數(shù)deffac_demo(n):#內(nèi)部函數(shù)f=1foriinrange(1,n+1):f*=ireturnf

returnfac_demo(m)/(fac_demo(n)*fac_demo(m-n))

print('c(5,2)=',cmn(5,2))2.4函數(shù)的嵌套與遞歸

deffac(n):ifn==1:return1else:returnn*fac(n-1)

print('5!=',fac(5))求解fac(5)的過程:2.4函數(shù)的嵌套與遞歸fac(5)=5*fac(4)fac(4)=4*fac(3)fac(3)=3*fac(2)fac(2)=2*fac(1)fac(1)=1fac(3)=3*fac(2)=6fac(2)=2*fac(1)=2fac(4)=4*fac(3)=24fac(5)=5*fac(4)=120

遞推過程

回推過程遞歸終止條件2.4函數(shù)的嵌套與遞歸【例5?6】漢諾塔問題:古印度有一個(gè)梵塔,塔內(nèi)有3個(gè)柱子A、B、C,開始時(shí)A柱上套有64個(gè)盤子,盤子大小不等,大的在下,小的在上。有一個(gè)老和尚想把這64個(gè)盤子從A柱移動(dòng)到C柱,在移動(dòng)過程中可利用B柱。但規(guī)定每次只能移動(dòng)一個(gè)盤子,且在任何時(shí)候3個(gè)柱子上的盤子都是大盤子在下,小盤子在上。編制程序來模擬移動(dòng)盤子的過程。要求輸出移動(dòng)盤子的每一步。【分析】將n(n>1)個(gè)盤子從A柱移到C柱可分解為以下3個(gè)步驟:(1)先將A柱上n-1個(gè)盤子借助C柱移到B柱上(2)將A柱上剩下的1個(gè)盤子直接移到C柱上(3)再將B柱上n-1個(gè)盤子借助A柱移到到C柱上如果只有1個(gè)盤子則可以直接從A柱移到C柱上。defhanoi(n,a,b,c):ifn==1:print('{}----->{}'.format(a,c))else:hanoi(n-1,a,c,b)print('{}----->{}'.format(a,c))hanoi(n-1,b,a,c)

print('3個(gè)盤子的移動(dòng)過程:')hanoi(3,'A','B','C')2.4函數(shù)的嵌套與遞歸hanoi(3,A,B,C)hanoi(2,A,C,B)A→Chanoi(2,B,A,C)hanoi(1,A,B,C)A→Bhanoi(1,C,A,B)1)A→C3)C→B2)4)hanoi(1,B,C,A)B→Chanoi(1,A,B,C)5)B→A6)7)A→C移動(dòng)3個(gè)盤子的步驟為:1)A→C,2)A→B,3)C→B,4)A→C,5)B→A,6)B→C,7)A→C3個(gè)盤子的具體執(zhí)行過程:2.5變量作用域在Python中,程序中用到的變量并不是在任何位置都可以訪問的,訪問權(quán)限取決于這個(gè)變量是在哪里賦值的。變量起作用的代碼范圍稱為變量的作用域。變量的作用域決定了在哪一部分程序可以訪問哪個(gè)特定的變量名稱。Python的作用域一共有4種,分別是:(1)L(Local):局部作用域(2)E(Enclosing):閉包函數(shù)外的函數(shù)中(3)G(Global):全局作用域(4)B(Built-in):內(nèi)建作用域以L→E→G→B的規(guī)則查找,即:在局部找不到,便會(huì)去局部外的局部找(例如閉包),再找不到就會(huì)去全局找,最后去內(nèi)建中找。2.5變量作用域1.局部變量和全局變量在函數(shù)內(nèi)部定義的變量稱為局部變量;在函數(shù)外部定義的變量稱為全局變量。一個(gè)變量在函數(shù)外部定義和在函數(shù)內(nèi)部定義,其作用域是不同的。局部變量的作用域是函數(shù)內(nèi)部,當(dāng)函數(shù)執(zhí)行結(jié)束后,局部變量自動(dòng)刪除,不再可以使用。全局變量的作用域是從其定義處開始到程序結(jié)束。不同作用域內(nèi)變量名可以相同,互不影響。2.5變量作用域【例5?7】局部變量和全局變量的使用。count=10#全局變量

deffunc_demo(m,n):count=m+n#局部變量print('函數(shù)內(nèi)部count=',count)

print('函數(shù)調(diào)用前:')print('函數(shù)外部count=',count)func_demo(8,9)print('函數(shù)調(diào)用后:')print('函數(shù)外部count=',count)【運(yùn)行結(jié)果】函數(shù)調(diào)用前:函數(shù)外部count=10函數(shù)內(nèi)部count=17函數(shù)調(diào)用后:函數(shù)外部count=10此例中,在函數(shù)外部定義了一個(gè)全局變量count,在函數(shù)內(nèi)部定義了一個(gè)局部變量count,兩者盡管名字相同,但表示的是不同的變量,由程序運(yùn)行結(jié)果也可看出。如果想在函數(shù)內(nèi)部使用函數(shù)外部定義的count變量,這時(shí)就須用到關(guān)鍵字global。2.5變量作用域2、global關(guān)鍵字在Python中,在函數(shù)內(nèi)如果只引用某個(gè)變量的值而沒有為其賦新值,該變量為(隱式的)全局變量;如果在函數(shù)內(nèi)任意位置有為變量賦新值的操作,該變量即被認(rèn)為是(隱式的)局部變量,除非在函數(shù)內(nèi)顯式地用關(guān)鍵字global進(jìn)行聲明。global的作用就是將此變量聲明為全局變量,而不再是局部變量。global聲明的變量既可以是已經(jīng)在函數(shù)外部定義過的,也可以是在函數(shù)外沒有定義過的。2.5變量作用域【例5?8】global關(guān)鍵字使用。count=10#全局變量

deffunc_demo(m,n):globalcount#將count聲明為全局變量count=m+n#使用全局變量print('函數(shù)內(nèi)部count=',count)

print('函數(shù)調(diào)用前:')print('函數(shù)外部count=',count)func_demo(8,9)print('函數(shù)調(diào)用后:')print('函數(shù)外部count=',count)【運(yùn)行結(jié)果】函數(shù)調(diào)用前:函數(shù)外部count=10函數(shù)內(nèi)部count=17函數(shù)調(diào)用后:函數(shù)外部count=17上述代碼在函數(shù)外部定義了一個(gè)全局變量count,在函數(shù)內(nèi)部也有一個(gè)count,通過global將其聲明為全局變量,也即此時(shí)在函數(shù)內(nèi)部的count就不再是局部變量了。也可以在函數(shù)外部不定義全局變量,直接用global在函數(shù)內(nèi)部聲明一個(gè)全局變量。2.5變量作用域也可以在函數(shù)外部不定義全局變量,直接用global在函數(shù)內(nèi)部聲明一個(gè)全局變量。deffunc_demo(m,n):globalcount#聲明count為全局變量count=m+n#使用全局變量print('函數(shù)內(nèi)部count=',count)

func_demo(8,9)print('函數(shù)調(diào)用后:')print('函數(shù)外部count=',count)【運(yùn)行結(jié)果】函數(shù)內(nèi)部count=17函數(shù)調(diào)用后:函數(shù)外部count=172.5變量作用域3、nonlocal關(guān)鍵字引例:count=100#全局變量

deffunc_out():count=1#局部變量

deffunc_in():count=12#局部變量print('在func_in中,count=',count)

func_in()print('在func_out中,count=',count)

func_out()上述代碼中定義了一個(gè)全局變量count,外部函數(shù)func_out中定義了一個(gè)局部變量count,在內(nèi)部函數(shù)func_in中也定義了一個(gè)局部變量count,此時(shí)程序運(yùn)行結(jié)果為:在func_in中,count=12在func_out中,count=1如果在函數(shù)func_in中想使用func_out函數(shù)中的變量count,而不是全局變量count,這時(shí)該如何實(shí)現(xiàn)呢?顯然不能用global來聲明(因global聲明的是全局變量),這時(shí)就可用nonlocal關(guān)鍵字來聲明。nonlocal關(guān)鍵字用于修改嵌套函數(shù)中變量的作用域。2.5變量作用域#nonlocal關(guān)鍵字用于修改嵌套函數(shù)中變量的作用域count=100#全局變量

deffunc_out():count=1#局部變量

deffunc_in():nonlocalcount#非局部變量count=12#這時(shí)使用的count就是外部函數(shù)中的countprint('在func_in中,count=',count)

func_in()print('在func_out中,count=',count)

func_out()【運(yùn)行結(jié)果】在func_in中,count=12在func_out中,count=12由程序運(yùn)行結(jié)果可以看出,在func_in中使用的count就是func_out中的count,通過nonlocal關(guān)鍵字將func_in中原來的局部變量變成了非局部變量,但不是全局變量。2.6常用系統(tǒng)函數(shù)Python中提供了大量的系統(tǒng)函數(shù)供程序設(shè)計(jì)人員使用。這些函數(shù)有的在基本模塊中,可直接使用,稱為內(nèi)置函數(shù)。還有些函數(shù)是在不同的標(biāo)準(zhǔn)模塊中,使用時(shí)需先導(dǎo)入相應(yīng)的庫,然后才能使用??梢栽诮换ツJ较率褂妹睢癶elp(函數(shù)名)”來查看某個(gè)內(nèi)置函數(shù)的用法,例help(abs);也可以在導(dǎo)入相應(yīng)模塊后,使用“help('模塊名')”來查看某模塊的幫助文檔,例help('random')。2.6常用系統(tǒng)函數(shù)1、map()函數(shù)格式:map(func,*seq)功能:將函數(shù)func(可以是系統(tǒng)函數(shù)也可以是自定義函數(shù))依次作用到可迭代對(duì)象seq中的每個(gè)元素上,并返回一個(gè)可迭代的map對(duì)象。map對(duì)象里面的元素是原seq中元素經(jīng)過函數(shù)func處理后的結(jié)果,為了方便使用map對(duì)象中的數(shù)據(jù),可將其轉(zhuǎn)換成列表或元組。2.6常用系統(tǒng)函數(shù)>>>map(str,[2,3,4])#將列表[2,3,4]中每個(gè)元素轉(zhuǎn)換成字符串<mapobjectat0x0000006474F92A90>#結(jié)果為一map對(duì)象>>>list(map(str,range(5)))#可將map對(duì)象轉(zhuǎn)換成列表['0','1','2','3','4']map()中的函數(shù)也可以是自定義函數(shù):>>>defadd5(x):#定義一個(gè)函數(shù)returnx+5>>>list(map(add5,range(10)))[5,6,7,8,9,10,11,12,13,14]#將序列range(10)中的每個(gè)元素都加52.6常用系統(tǒng)函數(shù)map()中可迭代對(duì)象個(gè)數(shù)取決于要作用的函數(shù)func的形參個(gè)數(shù)。>>>defmyadd(x,y):#有兩個(gè)參數(shù)的函數(shù) returnx+y>>>list(map(myadd,[2,3,4],[4,5,6]))#雙參數(shù)函數(shù)作用到兩個(gè)序列上[6,8,10]map()中的函數(shù)還可以是lambda表達(dá)式,如果函數(shù)比較簡單,可直接用lambda表達(dá)式。>>>list(map(lambdax:x+5,range(5)))[5,6,7,8,9]>>>list(map(lambdax,y:x+y,range(5),range(5)))[0,2,4,6,8]2.6常用系統(tǒng)函數(shù)map對(duì)象除了可以轉(zhuǎn)換為列表或元組外,還可以直接遍歷輸出。>>>map_obj=map(lambdax:x*10,[1,2,3,4,5])>>>foriinmap_obj: print(i,end='') 10203040502.6常用系統(tǒng)函數(shù)2、zip()函數(shù)格式:zip(iter1[,iter2[,...]])功能:把多個(gè)可迭代對(duì)象中的元素壓縮在一起,返回一個(gè)包含若干元組的可迭代zip對(duì)象,每個(gè)元組中數(shù)據(jù)分別來自于各個(gè)可迭代對(duì)象對(duì)應(yīng)位置上的元素,如果各個(gè)可迭代對(duì)象中的元素個(gè)數(shù)不一致,以可迭代對(duì)象中最短的那個(gè)為準(zhǔn)。最終結(jié)果可轉(zhuǎn)換為列表或元組,或直接遍歷輸出。2.6常用系統(tǒng)函數(shù)>>>zip('abc',[1,2,3])#返回結(jié)果是zip對(duì)象<zipobjectat0x0000002F5D379108>>>>list(zip('abc',[1,2,3]))#將結(jié)果轉(zhuǎn)換成列表[('a',1),('b',2),('c',3)]>>>tuple(zip('abc',[1,2,3],(10,20,30)))#將結(jié)果轉(zhuǎn)換成元組(('a',1,10),('b',2,20),('c',3,30))>>>list(zip('abcd',[1,2,3]))#長度不一致時(shí),以短的為準(zhǔn)[('a',1),('b',2),('c',3)]>>>foriinzip('abc',[1,2,3]):#直接遍歷輸出 print(i,end='')

('a',1)('b',2)('c',3)2.6常用系統(tǒng)函數(shù)zip函數(shù)也常用在字典中,根據(jù)兩個(gè)序列中數(shù)據(jù)生成一個(gè)字典。>>>name=['王明','李軍','孫朋']>>>score=[87,98,79]>>>dict_demo=dict(zip(name,score))>>>dict_demo{'王明':87,'李軍':98,'孫朋':79}2.6常用系統(tǒng)函數(shù)3、enumerate()函數(shù)格式:enumerate(iterable[,start])功能:返回一個(gè)數(shù)據(jù)對(duì)的序列迭代對(duì)象,數(shù)據(jù)對(duì)的第一個(gè)數(shù)據(jù)是索引(下標(biāo)),第二個(gè)數(shù)據(jù)來自于參數(shù)可迭代對(duì)象,通常用于將一個(gè)可遍歷的數(shù)據(jù)對(duì)象(如列表、元組或字符串)組合為一個(gè)索引序列,同時(shí)列出數(shù)據(jù)下標(biāo)和數(shù)據(jù),一般用在for循環(huán)當(dāng)中,也可將其轉(zhuǎn)換為列表或元組。參數(shù)start用于指定索引起始值,沒有指定默認(rèn)從0開始。2.6常用系統(tǒng)函數(shù)>>>list(enumerate('good'))#默認(rèn)索引從0開始[(0,'g'),(1,'o'),(2,'o'),(3,'d')]>>>tuple(enumerate('good',1))#可指定起始索引((1,'g'),(2,'o'),(3,'o'),(4,'d'))>>>fork,vinenumerate('good',1): print('索引:{},值:{}'.format(k,v))

索引:1,值:g索引:2,值:o索引:3,值:o索引:4,值:dfilter()函數(shù)使用4、filter()函數(shù)格式:filter(func,iterable)功能:對(duì)可迭代對(duì)象iterable中的每個(gè)元素執(zhí)行func函數(shù),返回可迭代對(duì)象中使得func函數(shù)值為True的那些元素組成的filter對(duì)象。func函數(shù)可以是自定義函數(shù),也可以是系統(tǒng)函數(shù),還可以是lambda表達(dá)式,函數(shù)返回值應(yīng)是布爾型。對(duì)于生成的filter對(duì)象既可以轉(zhuǎn)換成列表或元組,也可直接循環(huán)遍歷。2.6常用系統(tǒng)函數(shù)>>>list(filter(lambdax:x%3==0orx%5==0,range(20)))#20以內(nèi)3和5的倍數(shù)[0,3,5,6,9,10,12,15,18]>>>list(filter(lambdax:x.isalpha(),‘a(chǎn)1b2c3d4’))#找字符串中所有的字母['a','b','c','d']>>>tuple(filter(lambdax:x.isdigit(),'a1b2c3d4'))#找字符串中所有的數(shù)字('1','2','3','4')>>>deffunc(x): returnx.isdigit()

>>>list(filter(func,'a1b2c3d4'))['1','2','3','4']2.6常用系統(tǒng)函數(shù)5、reduce()函數(shù)reduce()函數(shù)是標(biāo)準(zhǔn)庫functools中的函數(shù),使用前需先導(dǎo)入標(biāo)準(zhǔn)庫functools。格式:reduce(bin_func,seq[,init])功能:可以將一個(gè)接受兩個(gè)參數(shù)的函數(shù)bin_func以累積的方式從左到右依次作用到序列seq的所有元素上。具體執(zhí)行過程:首先取出seq序列中的前兩個(gè)元素作為bin_func函數(shù)的參數(shù)執(zhí)行bin_func函數(shù),將得到的函數(shù)結(jié)果作為下一次執(zhí)行bin_func函數(shù)的第一個(gè)參數(shù),然后從seq序列中再取下一個(gè)元素作為bin_func函數(shù)的第二個(gè)參數(shù)執(zhí)行bin_func函數(shù),依次類推,直到最后得到一個(gè)結(jié)果。每次迭代,都是將上一次的迭代結(jié)果與seq序列中下一個(gè)元素執(zhí)行bin_func函數(shù)(bin_func函數(shù)要求是兩個(gè)參數(shù),也叫二元函數(shù))。init是可選的,如果給出,則作為第一次迭代的第一個(gè)元素,否則以seq序列中的第一個(gè)元素作為第一次迭代的第一個(gè)元素。2.6常用系統(tǒng)函數(shù)reduce()函數(shù)工作流程示意圖:2.6常用系統(tǒng)函數(shù)reduce函數(shù)的工作過程實(shí)際上就是函數(shù)的嵌套調(diào)用:reduce(bin_func,[1,2,3])=bin_func(bin_func(1,2),3)例如reduce函數(shù)實(shí)現(xiàn)求1到10的累加和:>>>fromfunctoolsimportreduce>>>reduce(lambdax,y:x+y,range(11))55同樣,reduce()中的bin_func函數(shù)既可以是系統(tǒng)函數(shù),也可以是lambda表達(dá)式,還可以是自定義函數(shù)。使用時(shí)還可根據(jù)需要指定一個(gè)起始值。>>>defmyadd(x,y): returnx+y>>>reduce(myadd,range(11),100)1552.6常用系統(tǒng)函數(shù)6、隨機(jī)數(shù)函數(shù)Python中的random模塊提供了跟隨機(jī)數(shù)有關(guān)的若干函數(shù)。函數(shù)功能說明random()生成一個(gè)[0.0,1.0)之間的一個(gè)隨機(jī)小數(shù)randint(a,b)生成一個(gè)[a,b]之間的隨機(jī)整數(shù)choice(seq)從非空序列seq中隨機(jī)返回一個(gè)元素shuffle(seq)將列表seq中元素打亂順序sample(seq,k)從序列seq中隨機(jī)選擇k個(gè)元素2.6常用系統(tǒng)函數(shù)>>>importrandom>>>random.random()0.4493094364214406>>>random.randint(1,10)7>>>random.choice(range(1,10))8>>>alist=list(range(1,10))>>>random.shuffle(alist)>>>alist[4,2,8,9,6,1,3,5,7]>>>random.sample(range(10),3)[5,9,2]2.7函數(shù)應(yīng)用示例【例5?9】編寫一個(gè)判斷一個(gè)字符串是否是回文字符串的函數(shù)。回文字符串是指正序和倒序都相同的字符串,如’abccba’就是回文字符串?!痉治觥恳肱袛嘧址欠袷腔匚?,只須比較字符串正序和倒序是否一樣即可,字符串倒序可直接利用切片操作實(shí)現(xiàn)。defIsPalindrome(text):returntext==text[::-1]

str_demo=input('enterastring:')ifIsPalindrome(str_demo):print('字符串"{}"是回文'.format(str_demo))else:print('字符串"{}"不是回文'.format(str_demo))【運(yùn)行結(jié)果】enterastring:abc字符串"abc"不是回文enterastring:abcba字符串"abcba"是回文2.7函數(shù)應(yīng)用示例【例5?10】找出一個(gè)正整數(shù)的所有素因子。例30的素因子有2、3、5?!痉治觥克匾蜃邮侵讣仁撬?cái)?shù)、又是另一個(gè)數(shù)的因子的數(shù)。要求一個(gè)數(shù)m的所有素因子,只需從m的所有因子中找出是素?cái)?shù)的即可。defAllPrime(m):#求所有素因子defIsPrime(n):#判斷一個(gè)數(shù)是否是素?cái)?shù)return0notin[0foriinrange(2,n)ifn%i==0]

return[iforiinrange(2,m)ifm%i==0andIsPrime(i)]

m=int(input('enteranumber:'))print('{}的素因子有{}'.format(m,AllPrime(m)))【運(yùn)行結(jié)果】enteranumber:3030的素因子有[2,3,5]2.7函數(shù)應(yīng)用示例【例5?11】編寫一個(gè)求任意一組數(shù)平均值的函數(shù)?!痉治觥恳笕我庖唤M數(shù)的平均值,也即參數(shù)個(gè)數(shù)可以任意,可以是0個(gè)、1個(gè)、2個(gè)……,可以利用不定長參數(shù)來實(shí)現(xiàn)。defavg(*args):iflen(args)==0:returnNoneelse:returnsum(args)/len(args)>>>avg()>>>avg(2,3)2.5>>>avg(1,2,3,4,5)3.0>>>avg(3,4.8,10)5.9333333333333342.7函數(shù)應(yīng)用示例【例5?12】編寫一個(gè)函數(shù),實(shí)現(xiàn)列表的循環(huán)移位。例列表[1,2,3,4,5]循環(huán)左移2位是[3,4,5,1,2],循環(huán)右移2位是[4,5,1,2,3]。【分析】循環(huán)左移K位實(shí)際上就是將列表中的前K個(gè)元素移到了列表的后面,而循環(huán)右移K位則是將列表中的后K個(gè)元素移到了列表的前面。因此可直接利用切片操作來實(shí)現(xiàn)循環(huán)移位:直接取出從第K位開始的所有元素再加上前K個(gè)元素即可。當(dāng)K為正數(shù)時(shí),實(shí)現(xiàn)的是左移,當(dāng)K為負(fù)數(shù)時(shí),實(shí)現(xiàn)的是右移。defshift(lst,k):#循環(huán)移位returnlst[k:]+lst[:k]>>>shift([1,2,3,4,5],2)#循環(huán)左移2位[3,4,5,1,2]>>>shift([1,2,3,4,5],-2)#循環(huán)右移2位[4,5,1,2,3]此函數(shù)實(shí)際上也可實(shí)現(xiàn)字符串的循環(huán)移位。>>>shift('abcdef',2)'cdefab'>>>shift('abcdef',-2)'efabcd'2.7函數(shù)應(yīng)用示例【例5?13】編寫函數(shù),統(tǒng)計(jì)一個(gè)字符串中字母和數(shù)字出現(xiàn)的次數(shù)。defcount(s):alpha=num=0forchins:ifch.isalpha():alpha+=1elifch.isdigit():num+=1returnalpha,num

str_demo=input('enterastring:')alpha,num=count(str_demo)print('字符串"{}"中字母個(gè)數(shù)是{},數(shù)字個(gè)數(shù)是{}'.format(str_demo,alpha,num))【運(yùn)行結(jié)果】enterastring:a1b2cdG35字符串"a1b2cdG35"中字母個(gè)數(shù)是5,數(shù)字個(gè)數(shù)是42.8模塊與包1、模塊在Python中,每個(gè)Python文件都可以作為一個(gè)模塊,模塊的名字就是文件的名字。模塊既可以獨(dú)立運(yùn)行,也可以被其他模塊引入。每個(gè)模塊都有一個(gè)__name__屬性,當(dāng)其值是“__main__”時(shí),表示該模塊是獨(dú)立運(yùn)行,否則表示該模塊是被引用。有時(shí)希望模塊中的某部分代碼只是在獨(dú)立運(yùn)行時(shí)執(zhí)行,而被引用時(shí)不執(zhí)行,則可通過判斷__name__屬性值來實(shí)現(xiàn)。假設(shè)有一個(gè)demo.py文件,其內(nèi)容如下:defmyadd(a,b):returna+b

print('獨(dú)立運(yùn)行和引入時(shí)都會(huì)執(zhí)行:',myadd(3,4))if__name__=='__main__':print('只在獨(dú)立運(yùn)行時(shí)執(zhí)行:',myadd(3,4))另有一test.py文件,內(nèi)容如下:fromdemoimportmyaddprint('調(diào)用模塊:',myadd(3,4))【運(yùn)行結(jié)果】獨(dú)立運(yùn)行和引入時(shí)都會(huì)執(zhí)行:7調(diào)用模塊:7【運(yùn)行結(jié)果】獨(dú)立運(yùn)行和引入時(shí)都會(huì)執(zhí)行:7只在獨(dú)立運(yùn)行時(shí)執(zhí)行:72.8模塊與包2、包包是Python中用來組織模塊的方式,可將功能相關(guān)的一組模塊放在一個(gè)包里面。包就是模塊文件所在的目錄,在該目錄下必須要有一個(gè)__init__.py文件(內(nèi)容可以為空)。只有目錄中有__init__.py文件,才表示此目錄是一個(gè)包,否則就是一個(gè)普通目錄。與目錄類似,包也可以有多級(jí),一個(gè)包中可以有若干個(gè)子包,訪問時(shí)用“.”來分隔各級(jí)。假設(shè)有如下結(jié)構(gòu)的包:在demo.py文件中定義了一個(gè)函數(shù)myadd,如果要想在main.py文件中調(diào)用demo.py中myadd函數(shù),可采用如下語句實(shí)現(xiàn):frompackage1importdemoprint(demo.myadd(3,4))或者是采用如下方式實(shí)現(xiàn):importpackage1.demoprint(package1.demo.myadd(3,4))3.1存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)任務(wù)實(shí)施3.2功能菜單顯示Python程序設(shè)計(jì)3.3學(xué)生信息添加3.4學(xué)生信息修改3.5學(xué)生信息刪除3.6學(xué)生信息顯示3.7主控函數(shù)3.8系統(tǒng)測(cè)試3.1

存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)每個(gè)學(xué)生信息有學(xué)號(hào)、姓名、語文成績、數(shù)學(xué)成績和英語成績等字段,因此可選用字典來存放一個(gè)學(xué)生的信息,形如:{'no':'1001','name':'王芳','chinese':80,'math':90,'english':98}然后將所有學(xué)生的信息放在一個(gè)列表中,即形如:[{'no':'1001','name':'王芳','chinese':80,'math':90,'english':98},{'no':'1002','name':'劉明','chinese':83,'math':89,'english':78},{'no':'1003','name':'王月','chinese':78,'math':79,'english':88},{'no':'1004','name':'孫朋','chinese':89,'math':59,'english':58}]首先初始化一個(gè)空列表準(zhǔn)備用來存放所有學(xué)生的信息,代碼如下:stulist=[]#初始化一個(gè)空列表用來保存學(xué)生的所有信息3.2

功能菜單顯示定義一個(gè)打印功能菜單的函數(shù),以提示用戶可以進(jìn)行哪些操作,代碼如下:defprint_menu():print('學(xué)生基本信息管理'.center(20,'-'))print('insert--------添加學(xué)生信息')print('delete--------刪除學(xué)生信息')print('update--------修改學(xué)生信息')print('show----------顯示學(xué)生信

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論