人工智能技術(shù)基礎(chǔ) 課件 模塊6 函數(shù)_第1頁(yè)
人工智能技術(shù)基礎(chǔ) 課件 模塊6 函數(shù)_第2頁(yè)
人工智能技術(shù)基礎(chǔ) 課件 模塊6 函數(shù)_第3頁(yè)
人工智能技術(shù)基礎(chǔ) 課件 模塊6 函數(shù)_第4頁(yè)
人工智能技術(shù)基礎(chǔ) 課件 模塊6 函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩72頁(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)介

將可能需要反復(fù)執(zhí)行的代碼封裝為函數(shù),并在需要該功能的地方進(jìn)行調(diào)用,不僅可以實(shí)現(xiàn)代碼復(fù)用,更重要的是可以保證代碼的一致性,只需要修改該函數(shù)代碼則所有調(diào)用均受到影響。設(shè)計(jì)函數(shù)時(shí),應(yīng)注意提高模塊的內(nèi)聚性,同時(shí)降低模塊之間的隱式耦合。在實(shí)際項(xiàng)目開(kāi)發(fā)中,往往會(huì)把一些通用的函數(shù)封裝到一個(gè)模塊中,并把這個(gè)通用模塊文件放到頂層文件夾中,這樣更方便管理。6.1函數(shù)定義在編寫(xiě)函數(shù)時(shí),應(yīng)盡量減少副作用,盡量不要修改參數(shù)本身,不要修改除返回值以外的其他內(nèi)容。應(yīng)充分利用Python函數(shù)式編程的特點(diǎn),讓自己定義的函數(shù)盡量符合純函數(shù)式編程的要求,例如保證線程安全、可以并行運(yùn)行等等。6.1函數(shù)定義6.1函數(shù)定義函數(shù)定義語(yǔ)法:def函數(shù)名([參數(shù)列表]):'''注釋'''

函數(shù)體注意事項(xiàng)函數(shù)形參不需要聲明其類型,也不需要指定函數(shù)返回值類型即使該函數(shù)不需要接收任何參數(shù),也必須保留一對(duì)空的圓括號(hào)括號(hào)后面的冒號(hào)必不可少函數(shù)體相對(duì)于def關(guān)鍵字必須保持一定的空格縮進(jìn)Python允許嵌套定義函數(shù)6.1函數(shù)定義生成斐波那契數(shù)列的函數(shù)定義和調(diào)用deffib(n):a,b=0,1whilea<n:print(a,end='')a,b=b,a+bprint()fib(1000)6.1函數(shù)定義在定義函數(shù)時(shí),開(kāi)頭部分的注釋并不是必需的,但是如果為函數(shù)的定義加上這段注釋的話,可以為用戶提供友好的提示和使用幫助。Python是一種高級(jí)動(dòng)態(tài)編程語(yǔ)言,變量類型是隨時(shí)可以改變的。Python中的函數(shù)和自定義對(duì)象的成員也是可以隨時(shí)發(fā)生改變的,可以為函數(shù)和自定義對(duì)象動(dòng)態(tài)增加新成員。>>>deffunc():print(func.x)#查看函數(shù)func的成員x>>>func()#現(xiàn)在函數(shù)func還沒(méi)有成員x,出錯(cuò)AttributeError:'function'objecthasnoattribute'x'>>>func.x=3#動(dòng)態(tài)為函數(shù)增加新成員>>>func()3>>>func.x#在外部也可以直接訪問(wèn)函數(shù)的成員3>>>delfunc.x#刪除函數(shù)成員>>>func()#刪除之后不可訪問(wèn)AttributeError:'function'objecthasnoattribute'x'6.1函數(shù)定義函數(shù)的遞歸調(diào)用是函數(shù)調(diào)用的一種特殊情況,函數(shù)調(diào)用自己,自己再調(diào)用自己,自己再調(diào)用自己,...,當(dāng)某個(gè)條件得到滿足的時(shí)候就不再調(diào)用了,然后再一層一層地返回直到該函數(shù)第一次調(diào)用的位置。函數(shù)A函數(shù)B函數(shù)B函數(shù)B函數(shù)B函數(shù)B調(diào)用返回調(diào)用返回調(diào)用返回調(diào)用返回調(diào)用返回調(diào)用返回6.1函數(shù)定義6.2形參與實(shí)參函數(shù)定義時(shí)括弧內(nèi)為形參,一個(gè)函數(shù)可以沒(méi)有形參,但是括弧必須要有,表示該函數(shù)不接受參數(shù)。函數(shù)調(diào)用時(shí)向其傳遞實(shí)參,將實(shí)參引用傳遞給形參。在定義函數(shù)時(shí),對(duì)參數(shù)個(gè)數(shù)并沒(méi)有限制,如果有多個(gè)形參,需要使用逗號(hào)進(jìn)行分隔。6.2形參與實(shí)參編寫(xiě)函數(shù),接受兩個(gè)整數(shù),并輸出其中最大數(shù)。defprintMax(a,b):

ifa>b:

print(a,'isthemax')

else:

print(b,'isthemax')6.2形參與實(shí)參對(duì)于絕大多數(shù)情況下,在函數(shù)內(nèi)部直接修改形參的值不會(huì)影響實(shí)參,而是創(chuàng)建一個(gè)新變量。例如:>>>defaddOne(a):

print(id(a),':',a)

a+=1

print(id(a),':',a)

>>>v=3>>>id(v)1599055008>>>addOne(v)1599055008:31599055040:4>>>v3>>>id(v2形參與實(shí)參在有些情況下,可以通過(guò)特殊的方式在函數(shù)內(nèi)部修改實(shí)參的值,例如下面的代碼。>>>defmodify(v):#修改列表元素值v[0]=v[0]+1>>>a=[2]>>>modify(a)>>>a[3]>>>defmodify(v,item):#為列表增加元素v.append(item)>>>a=[2]>>>modify(a,3)>>>a[2,3]6.2形參與實(shí)參也就是說(shuō),如果傳遞給函數(shù)的是可變序列,并且在函數(shù)內(nèi)部使用下標(biāo)或可變序列自身的方法增加、刪除元素或修改元素時(shí),實(shí)參也得到相應(yīng)的修改。>>>defmodify(d):#修改字典元素值或?yàn)樽值湓黾釉豥['age']=38>>>a={'name':'Dong','age':37,'sex':'Male'}>>>a{'age':37,'name':'Dong','sex':'Male'}>>>modify(a)>>>a{'age':38,'name':'Dong','sex':'Male'}6.3參數(shù)類型在Python中,函數(shù)參數(shù)有很多種:可以為普通參數(shù)、默認(rèn)值參數(shù)、關(guān)鍵參數(shù)、可變長(zhǎng)度參數(shù)等等。Python在定義函數(shù)時(shí)不需要指定形參的類型,完全由調(diào)用者傳遞的實(shí)參類型以及Python解釋器的理解和推斷來(lái)決定,類似于重載和泛型。Python函數(shù)定義時(shí)也不需要指定函數(shù)的類型,這將由函數(shù)中的return語(yǔ)句來(lái)決定,如果沒(méi)有return語(yǔ)句或者return沒(méi)有得到執(zhí)行,則認(rèn)為返回空值None。Python支持對(duì)函數(shù)參數(shù)和返回值類型的標(biāo)注,但實(shí)際上并不起任何作用,只是看起來(lái)方便。>>>deftest(x:int,y:int)->int:'''xandymustbeintegers,returnanintegerx+y'''assertisinstance(x,int),'xmustbeinteger'assertisinstance(y,int),'ymustbeinteger'z=x+yassertisinstance(z,int),'mustreturnaninteger'returnz>>>test(1,2)3>>>test(2,3.0)#參數(shù)類型不符合要求,拋出異常AssertionError:ymustbeinteger6.3參數(shù)類型位置參數(shù)(positionalarguments)是比較常用的形式,調(diào)用函數(shù)時(shí)實(shí)參和形參的順序必須嚴(yán)格一致,并且實(shí)參和形參的數(shù)量必須相同。>>>defdemo(a,b,c):print(a,b,c)>>>demo(3,4,5)#按位置傳遞參數(shù)345>>>demo(3,5,4)354>>>demo(1,2,3,4)#實(shí)參與形參數(shù)量必須相同TypeError:demo()takes3positionalargumentsbut4weregiven6.3參數(shù)類型6.3.1默認(rèn)值參數(shù)默認(rèn)值參數(shù)必須出現(xiàn)在函數(shù)參數(shù)列表的最右端,任何一個(gè)默認(rèn)值參數(shù)右邊不能有非默認(rèn)值參數(shù)。6.3.1默認(rèn)值參數(shù)調(diào)用帶有默認(rèn)值參數(shù)的函數(shù)時(shí),可以不對(duì)默認(rèn)值參數(shù)進(jìn)行賦值,也可以為其賦值,具有很大的靈活性。>>>defsay(message,times=1):print(message*times)>>>say('hello')hello>>>say('hello',3)hellohellohello>>>say('hi',7)hihihihihihihi6.3.1默認(rèn)值參數(shù)下面的函數(shù)使用指定分隔符將列表中所有字符串元素連接成一個(gè)字符串。>>>defJoin(List,sep=None):return(sepor'').join(List)>>>aList=['a','b','c']>>>Join(aList)'abc'>>>Join(aList,',')'a,b,c'6.3.1默認(rèn)值參數(shù)默認(rèn)值參數(shù)如果使用不當(dāng),會(huì)導(dǎo)致很難發(fā)現(xiàn)的邏輯錯(cuò)誤,例如:defdemo(newitem,old_list=[]):old_list.append(newitem)returnold_listprint(demo('5',[1,2,3,4]))#rightprint(demo('aaa',['a','b']))#rightprint(demo('a'))#rightprint(demo('b'))#wrong試著想一想,這段代碼會(huì)輸出什么呢?6.3.1默認(rèn)值參數(shù)上面的代碼輸出結(jié)果如下,最后一個(gè)結(jié)果是錯(cuò)的。[1,2,3,4,'5']['a','b','aaa']['a']['a','b']繼續(xù)想:為什么會(huì)這樣呢?6.3.1默認(rèn)值參數(shù)原因在于默認(rèn)值參數(shù)的賦值只會(huì)在函數(shù)定義時(shí)被解釋一次。當(dāng)使用可變序列作為參數(shù)默認(rèn)值時(shí),一定要謹(jǐn)慎操作。最后一個(gè)問(wèn)題來(lái)了:正確的代碼該怎么寫(xiě)呢?6.3.1默認(rèn)值參數(shù)終極解決方案:改成下面的樣子就不會(huì)有問(wèn)題了defdemo(newitem,old_list=None):ifold_listisNone:old_list=[]new_list=old_list[:]new_list.append(newitem)returnnew_listprint(demo('5',[1,2,3,4]))print(demo('aaa',['a','b']))print(demo('a'))print(demo('b'))6.3.1默認(rèn)值參數(shù)注意:默認(rèn)值參數(shù)只在函數(shù)定義時(shí)被解釋一次可以使用“函數(shù)名.__defaults__”查看所有默認(rèn)參數(shù)的當(dāng)前值>>>i=3>>>deff(n=i):#參數(shù)n的值僅取決于i的當(dāng)前值print(n)>>>f()3>>>i=5#函數(shù)定義后修改i的值不影響參數(shù)n的默認(rèn)值>>>f()3>>>f.__defaults__#查看函數(shù)默認(rèn)值參數(shù)的當(dāng)前值(3,)6.3.2關(guān)鍵參數(shù)關(guān)鍵參數(shù)主要指實(shí)參,即調(diào)用函數(shù)時(shí)的參數(shù)傳遞方式。通過(guò)關(guān)鍵參數(shù),實(shí)參順序可以和形參順序不一致,但不影響傳遞結(jié)果,避免了用戶需要牢記位置參數(shù)順序的麻煩。>>>defdemo(a,b,c=5):print(a,b,c)>>>demo(3,7)375>>>demo(a=7,b=3,c=6)736>>>demo(c=8,a=9,b=0)9086.3.3可變長(zhǎng)度參數(shù)可變長(zhǎng)度參數(shù)主要有兩種形式:*parameter用來(lái)接受多個(gè)實(shí)參并將其放在一個(gè)元組中**parameter接受關(guān)鍵參數(shù)并存放到字典中6.3.3可變長(zhǎng)度參數(shù)*parameter的用法>>>defdemo(*p):print(p)>>>demo(1,2,3)(1,2,3)>>>demo(1,2)(1,2)>>>demo(1,2,3,4,5,6,7)(1,2,3,4,5,6,7)6.3.3可變長(zhǎng)度參數(shù)**parameter的用法>>>defdemo(**p):foriteminp.items():print(item)>>>demo(x=1,y=2,z=3)('y',2)('x',1)('z',3)6.3.3可變長(zhǎng)度參數(shù)幾種不同類型的參數(shù)可以混合使用,但是不建議這樣做>>>deffunc_4(a,b,c=4,*aa,**bb):

print(a,b,c)

print(aa)

print(bb)>>>func_4(1,2,3,4,5,6,7,8,9,xx='1',yy='2',zz=3)(1,2,3)(4,5,6,7,8,9){'yy':'2','xx':'1','zz':3}>>>func_4(1,2,3,4,5,6,7,xx='1',yy='2',zz=3)(1,2,3)(4,5,6,7){'yy':'2','xx':'1','zz':3}6.3.4參數(shù)傳遞的序列解包傳遞參數(shù)時(shí),可以通過(guò)在實(shí)參序列前加一個(gè)星號(hào)將其解包,然后傳遞給多個(gè)單變量形參。>>>defdemo(a,b,c):

print(a+b+c)>>>seq=[1,2,3]>>>demo(*seq)6>>>tup=(1,2,3)>>>demo(*tup)6>>>dic={1:'a',2:'b',3:'c'}>>>demo(*dic)6>>>Set={1,2,3}>>>demo(*Set)6>>>demo(*dic.values())abc6.3.4參數(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)行處理。6.3.4參數(shù)傳遞的序列解包>>>defdemo(a,b,c):#定義函數(shù)

print(a,b,c) >>>demo(*(1,2,3))#調(diào)用,序列解包123>>>demo(1,*(2,3))#位置參數(shù)和序列解包同時(shí)使用123>>>demo(1,*(2,),3)1236.3.4參數(shù)傳遞的序列解包>>>demo(a=1,*(2,3))#序列解包相當(dāng)于位置參數(shù),優(yōu)先處理Traceback(mostrecentcalllast):File"<pyshell#26>",line1,in<module>demo(a=1,*(2,3))TypeError:demo()gotmultiplevaluesforargument'a'>>>demo(b=1,*(2,3))Traceback(mostrecentcalllast):File"<pyshell#27>",line1,in<module>demo(b=1,*(2,3))TypeError:demo()gotmultiplevaluesforargument'b'>>>demo(c=1,*(2,3))2316.3.4參數(shù)傳遞的序列解包>>>demo(**{'a':1,'b':2},*(3,))#序列解包不能在關(guān)鍵參數(shù)解包之后SyntaxError:iterableargumentunpackingfollowskeywordargumentunpacking>>>demo(*(3,),**{'a':1,'b':2})Traceback(mostrecentcalllast):File"<pyshell#30>",line1,in<module>demo(*(3,),**{'a':1,'b':2})TypeError:demo()gotmultiplevaluesforargument'a'>>>demo(*(3,),**{'c':1,'b':2})3216.4return語(yǔ)句return語(yǔ)句用來(lái)從一個(gè)函數(shù)中返回一個(gè)值,同時(shí)結(jié)束函數(shù)。如果函數(shù)沒(méi)有return語(yǔ)句,或者有return語(yǔ)句但是沒(méi)有執(zhí)行到,或者只有return而沒(méi)有返回值,Python將認(rèn)為該函數(shù)以returnNone結(jié)束。defmaximum(x,y):

ifx>y:

returnx

else:

returny6.4return語(yǔ)句在調(diào)用函數(shù)或?qū)ο蠓椒〞r(shí),一定要注意有沒(méi)有返回值,這決定了該函數(shù)或方法的用法。>>>a_list=[1,2,3,4,9,5,7]>>>print(sorted(a_list))[1,2,3,4,5,7,9]>>>print(a_list)[1,2,3,4,9,5,7]>>>print(a_list.sort())None>>>print(a_list)[1,2,3,4,5,7,9]6.5變量作用域變量起作用的代碼范圍稱為變量的作用域,不同作用域內(nèi)變量名可以相同,互不影響。一個(gè)變量在函數(shù)外部定義和在函數(shù)內(nèi)部定義,其作用域是不同的。在函數(shù)內(nèi)部定義的普通變量只在函數(shù)內(nèi)部起作用,稱為局部變量。當(dāng)函數(shù)執(zhí)行結(jié)束后,局部變量自動(dòng)刪除,不再可以使用。局部變量的引用比全局變量速度快,應(yīng)優(yōu)先考慮使用。6.5變量作用域如果想要在函數(shù)內(nèi)部給一個(gè)定義在函數(shù)外的變量賦值,那么這個(gè)變量就不能是局部的,其作用域必須為全局的,能夠同時(shí)作用于函數(shù)內(nèi)外,稱為全局變量,可以通過(guò)global來(lái)定義。這分為兩種情況:一個(gè)變量已在函數(shù)外定義,如果在函數(shù)內(nèi)需要為這個(gè)變量賦值,并要將這個(gè)賦值結(jié)果反映到函數(shù)外,可以在函數(shù)內(nèi)用global聲明這個(gè)變量,將其聲明為全局變量。在函數(shù)內(nèi)部直接將一個(gè)變量聲明為全局變量,在函數(shù)外沒(méi)有聲明,該函數(shù)執(zhí)行后,將增加為新的全局變量。6.5變量作用域也可以這么理解:在函數(shù)內(nèi)如果只引用某個(gè)變量的值而沒(méi)有為其賦新值,該變量為(隱式的)全局變量;如果在函數(shù)內(nèi)任意位置有為變量賦新值的操作,該變量即被認(rèn)為是(隱式的)局部變量,除非在函數(shù)內(nèi)顯式地用關(guān)鍵字global進(jìn)行聲明。6.5變量作用域>>>defdemo():globalxx=3y=4print(x,y)>>>x=5>>>demo()34>>>x3>>>yNameError:name'y'isnotdefined6.5變量作用域>>>delx>>>xNameError:name'x'isnotdefined>>>demo()34>>>x3>>>yNameError:name'y'isnotdefined注意:在某個(gè)作用域內(nèi)只要有為變量賦值的操作,該變量在這個(gè)作用域內(nèi)就是局部變量,除非使用global進(jìn)行了聲明。>>>x=3>>>deff():

print(x)#本意是先輸出全局變量x的值,但是不允許這樣做

x=5#有賦值操作,因此在整個(gè)作用域內(nèi)x都是局部變量

print(x)>>>f()Traceback(mostrecentcalllast):File"<pyshell#10>",line1,in<module>f()File"<pyshell#9>",line2,infprint(x)UnboundLocalError:localvariable'x'referencedbeforeassignment6.5變量作用域6.5變量作用域如果局部變量與全局變量具有相同的名字,那么該局部變量會(huì)在自己的作用域內(nèi)隱藏同名的全局變量。>>>defdemo():

x=3#創(chuàng)建了局部變量,并自動(dòng)隱藏了同名的全局變量 >>>x=5>>>x5>>>demo()>>>x#函數(shù)執(zhí)行不影響外面全局變量的值56.5變量作用域如果需要在同一個(gè)程序的不同模塊之間共享全局變量的話,可以編寫(xiě)一個(gè)專門(mén)的模塊來(lái)實(shí)現(xiàn)這一目的。例如,假設(shè)在模塊A.py中有如下變量定義:global_variable=0而在模塊B.py中包含以下用來(lái)設(shè)置全局變量的語(yǔ)句:importAA.global_variable=1在模塊C.py中有以下語(yǔ)句來(lái)訪問(wèn)全局變量的值:importAprint(A.global_variable)除了局部變量和全局變量,Python還支持使用nonlocal關(guān)鍵字定義一種介于二者之間的變量。關(guān)鍵字nonlocal聲明的變量會(huì)引用距離最近的非全局作用域的變量,要求聲明的變量已經(jīng)存在,關(guān)鍵字nonlocal不會(huì)創(chuàng)建新變量。6.5變量作用域defscope_test():defdo_local():spam="我是局部變量"defdo_nonlocal():nonlocalspam#這時(shí)要求spam必須是已存在的變量spam="我不是局部變量,也不是全局變量"defdo_global():globalspam#如果全局作用域內(nèi)沒(méi)有spam,就自動(dòng)新建一個(gè)spam="我是全局變量"spam="原來(lái)的值"do_local()print("局部變量賦值后:",spam)do_nonlocal()print("nonlocal變量賦值后:",spam)do_global()print("全局變量賦值后:",spam)scope_test()print("全局變量:",spam)6.5變量作用域6.7案例精選例5-1:編寫(xiě)函數(shù)計(jì)算圓的面積。frommathimportpiasPIdefCircleArea(r):ifisinstance(r,(int,float)):#確保接收的參數(shù)為數(shù)值

returnPI*r*relse:print('Youmustgivemeanintegerorfloatasradius.')print(CircleArea(3))6.7案例精選例5-2:編寫(xiě)函數(shù),接收任意多個(gè)實(shí)數(shù),返回一個(gè)元組,其中第一個(gè)元素為所有參數(shù)的平均值,其他元素為所有參數(shù)中大于平均值的實(shí)數(shù)。defdemo(*para):avg=sum(para)/len(para)

g=[iforiinparaifi>avg]return(avg,)+tuple(g)print(demo(1,2,3,4))6.7案例精選例5-3:編寫(xiě)函數(shù),接收字符串參數(shù),返回一個(gè)元組,其中第一個(gè)元素為大寫(xiě)字母?jìng)€(gè)數(shù),第二個(gè)元素為小寫(xiě)字母?jìng)€(gè)數(shù)。defdemo(s):result=[0,0]forchins:if'a'<=ch<='z':result[1]+=1elif'A'<=ch<='Z':result[0]+=1returntuple(result)print(demo('aaaabbbbC'))6.7案例精選例5-4:編寫(xiě)函數(shù),接收包含20個(gè)整數(shù)的列表lst和一個(gè)整數(shù)k作為參數(shù),返回新列表。處理規(guī)則為:將列表lst中下標(biāo)k之前的元素逆序,下標(biāo)k之后的元素逆序,然后將整個(gè)列表lst中的所有元素再逆序。defdemo(lst,k):

x=lst[:k]

x.reverse()

y=lst[k:]

y.reverse()

r=x+y

r.reverse()

returnrlst=list(range(1,21))print(demo(lst,5))6.7案例精選本例的執(zhí)行結(jié)果實(shí)際上是把列表中所有元素循環(huán)左移k位。在collections標(biāo)準(zhǔn)庫(kù)的deque對(duì)象已經(jīng)實(shí)現(xiàn)了該功能,直接調(diào)用即可。>>>importcollections>>>x=list(range(20))>>>x=collections.deque(x)>>>xdeque([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])>>>x.rotate(-3)>>>xdeque([3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,0,1,2])>>>x=list(x)>>>x[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,0,1,2]6.7案例精選要是把代碼寫(xiě)成這樣,會(huì)不會(huì)眼前一亮呢?>>>defshift(lst,k):

returnlst[k:]+lst[:k]>>>x=list(range(20))>>>shift(x,3)[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,0,1,2]>>>shift(x,-3)[17,18,19,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]6.7案例精選例5-5:編寫(xiě)函數(shù),接收整數(shù)參數(shù)t,返回斐波那契數(shù)列中大于t的第一個(gè)數(shù)。defdemo(t):a,b=1,1whileb<t:a,b=b,a+belse:returnbprint(demo(50))6.7案例精選例5-6:編寫(xiě)函數(shù),接收一個(gè)包含若干整數(shù)的列表參數(shù)lst,返回一個(gè)元組,其中第一個(gè)元素為列表lst中的最小值,其余元素為最小值在列表lst中的下標(biāo)。importrandomdefdemo(lst):m=min(lst)result=(m,)forindex,valueinenumerate(lst):ifvalue==m:result=result+(index,)returnresultx=[random.randint(1,20)foriinrange(50)]print(x)print(demo(x))6.7案例精選例5-7:編寫(xiě)函數(shù),接收一個(gè)整數(shù)t為參數(shù),打印楊輝三角前t行。defdemo(t):print([1])print([1,1])line=[1,1]foriinrange(2,t):r=[]forjinrange(0,len(line)-1):r.append(line[j]+line[j+1])line=[1]+r+[1]print(line)demo(10)6.7案例精選例5-8:編寫(xiě)函數(shù),接收一個(gè)正偶數(shù)為參數(shù),輸出兩個(gè)素?cái)?shù),并且這兩個(gè)素?cái)?shù)之和等于原來(lái)的正偶數(shù)。如果存在多組符合條件的素?cái)?shù),則全部輸出。6.7案例精選importmathdefIsPrime(n):m=int(math.sqrt(n))+1foriinrange(2,m):ifn%i==0:returnFalsereturnTruedefdemo(n):ifisinstance(n,int)andn>0andn%2==0:foriinrange(3,n//2+1):ifIsPrime(i)andIsPrime(n-i):print(i,'+',n-i,'=',n)demo(60)6.7案例精選例5-9:編寫(xiě)函數(shù),接收兩個(gè)正整數(shù)作為參數(shù),返回一個(gè)元組,其中第一個(gè)元素為最大公約數(shù),第二個(gè)元素為最小公倍數(shù)。defdemo(m,n):

ifm>n:

m,n=n,m

p=m*n

whilem!=0:

r=n%m

n=m

m=r

return(n,p//n)print(demo(12,30))6.7案例精選Python標(biāo)準(zhǔn)庫(kù)已經(jīng)提供了計(jì)算最大公約數(shù)的方法。>>>importfractions>>>fractions.gcd(36,39)3>>>fractions.gcd(30,20)10>>>30*20/fractions.gcd(30,20)60.0>>>importmath>>>math.gcd(36,39)36.7案例精選例5-10:編寫(xiě)函數(shù),接收一個(gè)所有元素值都不相等的整數(shù)列表x和一個(gè)整數(shù)n,要求將值為n的元素作為支點(diǎn),將列表中所有值小于n的元素全部放到n的前面,所有值大于n的元素放到n的后面。6.7案例精選importrandomdefdemo(x,n):ifnnotinx:print(n,'isnotanelementof',x)returni=x.index(n)#獲取指定元素在列表中的索引x[0],x[i]=x[i],x[0]#將指定元素與第0個(gè)元素交換key=x[0]i=0j=len(x)-1whilei<j:whilei<jandx[j]>=key:#從后向前尋找第一個(gè)比指定元素小的元素j-=1x[i]=x[j]whilei<jandx[i]<=key:#從前向后尋找第一個(gè)比指定元素大的元素i+=1x[j]=x[i]x[i]=keyx=list(range(1,10))random.shuffle(x)print(x)demo(x,4)print(x)6.7案例精選上面的代碼演示的是快速排序算法中非常重要的一個(gè)步驟,當(dāng)然也可以使用下面更加簡(jiǎn)潔的代碼來(lái)實(shí)現(xiàn)。>>>importrandom>>>defdemo(x,n):

t1=[iforiinxifi<n]

t2=[iforiinxifi>n]

returnt1+[n]+t2>>>x=list(range(1,10))>>>random.shuffle(x)>>>x[1,9,3,6,5,2,4,7,8]>>>demo(x,4)[1,3,2,4,9,6,5,7,8]6.7案例精選例5-11編寫(xiě)函數(shù),計(jì)算字符串匹配的準(zhǔn)確率。以打字練習(xí)程序?yàn)槔?,假設(shè)origin為原始內(nèi)容,userInput為用戶輸入的內(nèi)容,下面的代碼用來(lái)測(cè)試用戶輸入的準(zhǔn)確率。6.7案例精選defRate(origin,userInput):ifnot(isinstance(origin,str)andisinstance(userInput,str)):print('Thetwoparametersmustbestrings.')returniflen(origin)<len(userInput):print('Sorry.Isupposethesecondparameterstringisshorter.')returnright=0#精確匹配的字符個(gè)數(shù)fororigin_char,user_charinzip(origin,userInput):iforigin_char==user_char:right+=1returnright/len(origin)origin='ShandongInstituteofBusinessandTechnology'userInput='ShanDonginstituteofbusinessandtechnolog'print(Rate(origin,userInput))#輸出測(cè)試結(jié)果例5-12編寫(xiě)函數(shù),使用非遞歸方法對(duì)整數(shù)進(jìn)行因數(shù)分解。fromrandomimportrandintfrommathimportsqrt6.7案例精選deffactoring(n):'''對(duì)大數(shù)進(jìn)行因數(shù)分解'''ifnotisinstance(n,int):print('Youmustgivemeaninteger')return#開(kāi)始分解,把所有因數(shù)都添加到result列表中result=[]forpinprimes:whilen!=1:ifn%p==0:n=n//presult.append(p)else:breakelse:result='*'.join(map(str,result))returnresult#考慮參數(shù)本身就是素?cái)?shù)的情況ifnotresult:returnn6.7案例精選testData=[randint(10,100000)foriinrange(50)]#隨機(jī)數(shù)中的最大數(shù)maxData=max(testData)#小于maxData的所有素?cái)?shù)primes=[pforpinrange(2,maxData)if0notin[p%dfordinrange(2,int(sqrt(p))+1)]]fordataintestData:r=factoring(data)print(data,'=',r)#測(cè)試分解結(jié)果是否正確print(data==eval(r))6.7案例精選例5-13編寫(xiě)函數(shù)模擬猜數(shù)游戲。系統(tǒng)隨機(jī)產(chǎn)生一個(gè)數(shù),玩家最多可以猜5次,系統(tǒng)會(huì)根據(jù)玩家的猜測(cè)進(jìn)行提示,玩家則可以根據(jù)系統(tǒng)的提示對(duì)下一次的猜測(cè)進(jìn)行適當(dāng)調(diào)整。6.7案例精選fromrandomimportrandintdefguess(maxValue=100,maxTimes=5):value=randint(1,maxValue)#隨機(jī)生成一個(gè)整數(shù)foriinrange(maxTimes):prompt='StarttoGUESS:'ifi==0else'Guessagain:'try:#使用異常處理結(jié)構(gòu),防止輸入不是數(shù)字的情況x=int(input(prompt))except:print('Mustinputanintegerbetween1and',maxValue)else:ifx==value:#猜對(duì)了print('Congratulations!')breakelifx>value:print('Toobig')else:print('Toolittle')else:#次數(shù)用完還沒(méi)猜對(duì),游戲結(jié)束,提示正確答案print('Gameover.FAIL.')print('Thevalueis',value)6.7案例精選例5-14編寫(xiě)函數(shù),計(jì)算形式如a+aa+aaa+aaaa+...+aaa...aaa的表達(dá)式的值,其中a為小于10的自然數(shù)。defdemo(v,n):asserttype(n)==intand0<v<10,'vmustbeintegerbetween1and9'result,t=0,0foriinrange(n):t=t*10+vresult+=treturnresultprint(demo(3,4))6.7案例精選例5-15編寫(xiě)函數(shù),模擬輪盤(pán)抽獎(jiǎng)游戲。輪盤(pán)抽獎(jiǎng)是比較常見(jiàn)的一種游戲,在輪盤(pán)上有一個(gè)指針和一些不同顏色、不同面積的扇形,用力轉(zhuǎn)動(dòng)輪盤(pán),輪盤(pán)慢慢停下后依靠指針?biāo)幍奈恢脕?lái)判定是否中獎(jiǎng)以及獎(jiǎng)項(xiàng)等級(jí)。本例中的函數(shù)名和很多變量名使用了中文,這在Python3.x中是完全允許的。6.7案例精選fromrandomimportrandomdef輪盤(pán)賭(獎(jiǎng)項(xiàng)分布):本次轉(zhuǎn)盤(pán)讀數(shù)=random()fork,vin獎(jiǎng)項(xiàng)分布.items():ifv[0]<=本次轉(zhuǎn)盤(pán)讀數(shù)<v[1]:returnk#各獎(jiǎng)項(xiàng)在輪盤(pán)上所占比例獎(jiǎng)項(xiàng)分布={'一等獎(jiǎng)':(0,0.08),'二等獎(jiǎng)':(0.08,0.3),'

溫馨提示

  • 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)論