Python程序設(shè)計與案例教程 課件 項目06 函數(shù)_第1頁
Python程序設(shè)計與案例教程 課件 項目06 函數(shù)_第2頁
Python程序設(shè)計與案例教程 課件 項目06 函數(shù)_第3頁
Python程序設(shè)計與案例教程 課件 項目06 函數(shù)_第4頁
Python程序設(shè)計與案例教程 課件 項目06 函數(shù)_第5頁
已閱讀5頁,還剩69頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

程序設(shè)計與案例教程Python延時符

Python函數(shù)項目6項目概述在Python中,除了基本的數(shù)據(jù)結(jié)構(gòu)和程序結(jié)構(gòu)之外,經(jīng)常需要重復(fù)使用一個功能,并且程序開發(fā)的難度和程序的復(fù)雜度也越來越高。為了解決這個問題,提高代碼的復(fù)用性、更好地組織代碼結(jié)構(gòu)與邏輯,Python引入了函數(shù)這一概念。本項目將帶你系統(tǒng)學(xué)習(xí)Python函數(shù)的基本概念、參數(shù)傳遞、嵌套函數(shù)、函數(shù)的遞歸調(diào)用以及簡單算法的應(yīng)用。3任務(wù)1函數(shù)概述任務(wù)1函數(shù)概述·知識準(zhǔn)備通過本任務(wù),你將學(xué)習(xí)Python自定義函數(shù)的編寫,組織好一段可重復(fù)使用的代碼塊,用于執(zhí)行特定的任務(wù)。函數(shù)可以接受輸入?yún)?shù),并返回輸出結(jié)果。通過使用函數(shù),我們可以將代碼模塊化,提高代碼的可讀性和可維護(hù)性。掌握這些知識能夠提高代碼的復(fù)用性,讓代碼更簡潔。0504030201學(xué)習(xí)目標(biāo)

了解函數(shù),能夠簡述函數(shù)的概念以及程序中使用函數(shù)的好處掌握函數(shù)的定義和調(diào)用,能夠根據(jù)需求定義和調(diào)用函數(shù)熟悉函數(shù)的返回值,能夠在程序中處理一個或多個返回值掌握局部變量和全局變量,能夠在程序中使用全局變量和局部變量掌握匿名函數(shù)的使用,能夠運(yùn)用匿名函數(shù)簡化簡單函數(shù)的定義延時符目錄

Contents函數(shù)定義016函數(shù)調(diào)用02函數(shù)的返回值03變量的作用域04匿名函數(shù)05綜合實例06一、函數(shù)定義在程序開發(fā)中,函數(shù)是組織好的、實現(xiàn)單一功能或相關(guān)聯(lián)功能的代碼段。例如,用于向控制臺輸出的print()函數(shù)、用戶接收用戶輸入內(nèi)容的input()函數(shù)等。我們可以將函數(shù)視為一段有名字的代碼,這類代碼可以在需要的地方以“函數(shù)名()”的形式調(diào)用。開發(fā)人員也可以根據(jù)自己的需求定義函數(shù),將代碼段封裝成函數(shù)的過程稱為函數(shù)定義。Python中使用def關(guān)鍵字定義函數(shù)。語法格式的相關(guān)說明如下:def關(guān)鍵字:函數(shù)的開始標(biāo)志。函數(shù)名:函數(shù)的名稱,用于調(diào)用函數(shù)。參數(shù):函數(shù)可以接受零個或多個參數(shù),參數(shù)是函數(shù)的輸入。冒號:函數(shù)體的開始標(biāo)志函數(shù)體:函數(shù)的具體實現(xiàn)代碼。def函數(shù)名([參數(shù)列表]):["""文檔字符串"""]

函數(shù)體

標(biāo)記函數(shù)的開始接收傳入函數(shù)中的數(shù)據(jù)函數(shù)的唯一標(biāo)識說明函數(shù)功能的字符串函數(shù)功能的具體代碼一、函數(shù)定義為了增加函數(shù)的靈活性,使函數(shù)能夠計算任意兩個數(shù)之和,這里可以定義一個帶有參數(shù)的add()函數(shù),使用該函數(shù)的參數(shù)接收函數(shù)外部傳入的數(shù)據(jù),之后根據(jù)這些數(shù)據(jù)的具體數(shù)值計算它們的和,示例代碼如下:實例6.1.1——定義一個計算兩個數(shù)之和的函數(shù)代碼如下:defadd(a,b):result=a+bprint(result)一、函數(shù)定義二、調(diào)用函數(shù)函數(shù)在定義完成后不會立刻執(zhí)行,直到被程序調(diào)用時才會執(zhí)行。函數(shù)名([參數(shù)列表])語法格式add_modify(10,20)函數(shù)內(nèi)部也可以調(diào)用其他函數(shù),這被稱為函數(shù)的嵌套調(diào)用。例如,在add_modify()函數(shù)內(nèi)部增加調(diào)用add()函數(shù)的代碼,修改后的代碼如下:實例6.1.2——加法運(yùn)算defadd_modify(a,b):result=a+b

print(result)add_modify(10,20)二、調(diào)用函數(shù)程序在調(diào)用add_modify()函數(shù)的位置暫停執(zhí)行,跳轉(zhuǎn)到該函數(shù)定義的位置。程序?qū)?shù)據(jù)10和20分別傳遞給函數(shù)的參數(shù)a和b。程序執(zhí)行add_modify()函數(shù)中的函數(shù)體。程序執(zhí)行到調(diào)用add()函數(shù)的位置暫停執(zhí)行,跳轉(zhuǎn)到該函數(shù)定義的位置。二、調(diào)用函數(shù)三、函數(shù)返回值Python函數(shù)的返回值是通過return語句實現(xiàn)的。返回值可以是任何數(shù)據(jù)類型,包括數(shù)字、字符串、列表、字典、對象,甚至是另一個函數(shù)。return語句用于結(jié)束函數(shù)的執(zhí)行,并將指定的值返回給調(diào)用者。def函數(shù)名([參數(shù)列表]):["""文檔字符串"""]

函數(shù)體return返回值標(biāo)記函數(shù)的開始接收傳入函數(shù)中的數(shù)據(jù)函數(shù)的唯一標(biāo)識說明函數(shù)功能的字符串函數(shù)功能的具體代碼標(biāo)志函數(shù)的結(jié)束返回單個值,代碼如下:defadd(a,b):returna+bresult=add(3,5)print(result)#輸出:8三、函數(shù)返回值可以通過“return”返回多個值,這些值會被打包成一個元組,代碼如下:defget_user_info():name="Alice"age=25city="NewYork"returnname,age,city#返回多個值

#接收返回值user_info=get_user_info()print(user_info)#輸出:('Alice',25,'NewYork')#解包返回值name,age,city=get_user_info()print(name,age,city)#輸出:Alice25NewYork三、函數(shù)返回值四、變量的作用域在Python中,變量的作用域決定了變量在程序中的可見性和生命周期。變量的有效范圍稱為該變量的作用域。其目的是提高程序的可靠性,更重要的是減少命名沖突。一般根據(jù)變量的有效范圍將變量分為局部變量和全局變量。

四、局部變量局部變量是指在函數(shù)內(nèi)部定義的變量,它的作用域僅限于函數(shù)內(nèi)部,只能在函數(shù)內(nèi)部進(jìn)行訪問或使用。一旦函數(shù)執(zhí)行結(jié)束,局部變量將無法再被訪問或使用。局部變量的優(yōu)勢:

封裝性:僅在函數(shù)內(nèi)部有效,避免外部誤修改。

避免命名沖突:同名變量可在不同函數(shù)中獨(dú)立使用。

節(jié)省內(nèi)存:函數(shù)執(zhí)行完畢后局部變量自動釋放。

實例6.1.3——計算找零程序代碼如下:defbuy_drink(choice,money_in):price=5#局部變量:飲料價格ifmoney_in>=price:change=money_in-price#局部變量:找零print(f"購買成功,找零{change}元")else:print("金額不足")buy_drink("可樂",10)#此處無法訪問price、change,它已被釋放四、局部變量四、全局變量全局變量是指在整個程序中都可以使用的變量,它們一般定義在函數(shù)外部,并且在整個程序運(yùn)行期間占用存儲單元。如果要在函數(shù)內(nèi)部修改全局變量,需要使用“global”關(guān)鍵字。如果需要查看局部變量,可以使用globals()函數(shù)獲取,返回全局變量的是字典。當(dāng)局部變量和全局變量重名時,優(yōu)先使用局部變量;對函數(shù)內(nèi)部的變量進(jìn)行賦值后,不影響函數(shù)外部的變量。

實例6.1.4——銀行賬戶余額balance=0#全局變量defdeposit(amount):globalbalancebalance+=amountprint(f"存款成功,當(dāng)前余額:{balance}")defwithdraw(amount):globalbalanceifbalance>=amount:balance-=amountprint(f"取款成功,當(dāng)前余額:{balance}")else:print("余額不足")deposit(1000)#輸出:存款成功,當(dāng)前余額:1000withdraw(500)#輸出:取款成功,當(dāng)前余額:500四、全局變量五、匿名函數(shù)匿名函數(shù)是一類不需要命名的函數(shù),它與普通函數(shù)一樣可以在程序的任何位置使用。Python中使用lambda關(guān)鍵字定義匿名函數(shù),它的語法格式如下:

lambda<形式參數(shù)列表>:<表達(dá)式>語法格式以上語法格式中,形式參數(shù)列表可以包含零個、一個或多個參數(shù),多個參數(shù)之間使用逗號分隔,表達(dá)式定義了匿名函數(shù)要執(zhí)行的操作。關(guān)于匿名函數(shù)與普通函數(shù)的主要區(qū)別如下:(1)普通函數(shù)在定義時有函數(shù)名稱,而匿名函數(shù)沒有函數(shù)名稱。(2)普通函數(shù)的函數(shù)體中包含多條語句,而匿名函數(shù)的函數(shù)體只能是一個表達(dá)式。(3)普通函數(shù)可以實現(xiàn)比較復(fù)雜的功能,而匿名函數(shù)可實現(xiàn)的功能比較簡單。五、匿名函數(shù)實例6.1.5——計算圓面積程序代碼如下:importmath

#導(dǎo)入數(shù)學(xué)函數(shù)模塊defcir_area(rr):#定義一個計算圓的面積的函數(shù)result=math.pi*pow(rr,2)returnint(result)#計算圓的面積,輸出結(jié)果為整數(shù)r=10#輸出結(jié)果print('半徑為',r,'的圓的面積為',cir_area(r))注意:定義好的匿名函數(shù)不能直接使用,最好使用一個變量保存它,以便后期可以隨時使用這個函數(shù)。五、匿名函數(shù)實例6.1.6——排序程序代碼如下:points=[(1,2),(4,1),(5,3),(2,4)]points.sort(key=lambdax:x[1])#按第二個元素排序print(points)運(yùn)行結(jié)果:[(4,1),(1,2),(5,3),(2,4)]五、匿名函數(shù)六、綜合案例案例:計算郵費(fèi)設(shè)計一個算法,根據(jù)郵件物品的重量計算郵費(fèi)。計算規(guī)則:首重1kg收費(fèi)8元;超過1kg的部分,每增加0.5kg收費(fèi)3元;不足0.5kg按0.5kg計算。根據(jù)上述計算規(guī)則,編寫自定義函數(shù)完成程序功能。運(yùn)行結(jié)果參考如下:請輸入郵件重量(kg):6郵件重量:6.0kg→郵費(fèi):38元26任務(wù)2函數(shù)參數(shù)傳遞任務(wù)2函數(shù)參數(shù)傳遞·知識準(zhǔn)備在學(xué)習(xí)的過程中發(fā)現(xiàn)程序越來越復(fù)雜,老師告訴他,函數(shù)是編程中非常重要的一部分,而函數(shù)的參數(shù)則是函數(shù)的核心。建議先從了解函數(shù)參數(shù)的基本概念開始學(xué)習(xí),弄明白函數(shù)參數(shù)傳遞的幾種方式,它們之間有什么區(qū)別與關(guān)聯(lián)?04030201學(xué)習(xí)目標(biāo)熟悉位置參數(shù)傳遞的使用熟悉關(guān)鍵字參數(shù)傳遞的使用掌握函數(shù)參數(shù)的傳遞方式,能夠通過各種類型的參數(shù)向函數(shù)內(nèi)部傳遞數(shù)據(jù)掌握默認(rèn)參數(shù)傳遞和可變參數(shù)傳遞的使用延時符目錄

Contents位置參數(shù)的傳遞0128關(guān)鍵字參數(shù)的傳遞02默認(rèn)參數(shù)的傳遞03可變參數(shù)的傳遞04綜合實例05一、位置參數(shù)傳遞當(dāng)調(diào)用函數(shù)傳遞位置參數(shù)時,實參會按照位置順序依次傳遞給對應(yīng)的形參。也就是說,第1個實參會傳遞給第1個形參,第2個實參會傳遞給第2個形參,以此類推。注意,實參的數(shù)量和位置必須與函數(shù)定義中位置參數(shù)的數(shù)量和位置保持一致,否則會導(dǎo)致解釋器運(yùn)行時出現(xiàn)異常信息,或者錯誤的參數(shù)匹配。一、位置參數(shù)傳遞定義一個獲取兩個數(shù)之間最大值的函數(shù)get_max(),調(diào)用get_max()函數(shù),通過位置參數(shù)的方式傳遞實參,示例代碼如下:實例6.2.1——減法運(yùn)算程序代碼如下:defsub(a,b):returna-b

result1=sub(10,5)print(result1)

#輸出5result2=sub(5,10)print(result2)#輸出-5result1調(diào)用`sub(a,b)`時:`10`傳遞給`a`,`5`傳遞給`b`result2調(diào)用`sub(a,b)`時:`5`傳遞給`a`,`10`傳遞給`b`二、關(guān)鍵字參數(shù)傳遞當(dāng)函數(shù)有較多參數(shù)時,記住每個參數(shù)的位置和含義可能會很困難,因此按照位置參數(shù)的方式傳參并不是一個好的選擇。此時,可以使用關(guān)鍵字參數(shù)的方式傳參。關(guān)鍵字參數(shù)的傳遞通過使用“形參=實參”的格式將實參與對應(yīng)的形參關(guān)聯(lián)起來,根據(jù)具體的參數(shù)名傳遞參數(shù),從而避免記憶參數(shù)位置的困擾。實例6.2.2——計算圓柱體積程序代碼如下:#定義計算圓柱體體積的函數(shù)(帶默認(rèn)高度)defcylinder_volume(radius,height=10):#計算圓柱體積公式:V=πr2hreturn3.14159*radius**2*height#純關(guān)鍵字參數(shù)調(diào)用(順序自由)print("體積1=",cylinder_volume(radius=3,height=5))#radius=3,height=5print("體積2=",cylinder_volume(height=7,radius=2))#故意調(diào)換順序運(yùn)行結(jié)果如下:體積1=141.37155體積2=87.96452二、關(guān)鍵字參數(shù)傳遞定義一個用戶信息的函數(shù)print_info(),調(diào)用print_info()函數(shù),通過關(guān)鍵字參數(shù)的方式傳遞實參實例6.2.3——打印用戶信息(混合使用位置參數(shù)和關(guān)鍵字參數(shù))程序代碼如下:defprint_info(name,age,city):print(f"姓名:{name}\t年齡:{age}\t城市:{city}\n")#常規(guī)位置參數(shù)調(diào)用print_info("張三",25,"北京")#關(guān)鍵字參數(shù)調(diào)用(順序任意)print_info(age=28,city="上海",name="李四")#混合使用位置參數(shù)和關(guān)鍵字參數(shù)print_info("王五",city="廣州",age=35)運(yùn)行結(jié)果如下:姓名:張三

年齡:25城市:北京

姓名:李四

年齡:28城市:上海

姓名:王五

年齡:35

城市:廣州二、關(guān)鍵字參數(shù)傳遞三、默認(rèn)參數(shù)傳遞定義函數(shù)時可以指定形參的默認(rèn)值,調(diào)用函數(shù)時可以選擇是否給帶有默認(rèn)值的形參傳值。若沒有給帶有默認(rèn)值的形參傳值,直接使用參數(shù)的默認(rèn)值;若給帶有默認(rèn)值的形參傳值,則使用實參的值覆蓋默認(rèn)值。三、默認(rèn)參數(shù)傳遞實例6.2.4——喝咖啡程序代碼如下:deforder_drink(drink,size="medium",ice=True):ice_status="加冰"ificeelse"不加冰"print(f"一杯{size}杯的{drink},{ice_status}。")order_drink("拿鐵")#使用默認(rèn)值:medium杯,加冰order_drink("美式",size="large",ice=False)#覆蓋默認(rèn)值:large杯,不加冰運(yùn)行結(jié)果如下:一杯medium杯的拿鐵,加冰。一杯large杯的美式,不加冰。四、可變參數(shù)傳遞可變參數(shù)允許函數(shù)接受任意數(shù)量的參數(shù)。Python提供了兩種可變參數(shù):可變位置參數(shù)(通過*args)和可變關(guān)鍵字參數(shù)(通過**kwargs)。這兩種形式允許在調(diào)用函數(shù)時傳遞任意數(shù)量的參數(shù)給函數(shù),無論這些參數(shù)是位置參數(shù)還是關(guān)鍵字參數(shù)。四、可變數(shù)量的位置參數(shù)實例6.2.5——累加求和程序代碼如下:defsum_numbers(*args):total=0fornuminargs:total+=numreturntotal#調(diào)用函數(shù),傳遞任意數(shù)量的參數(shù)print(sum_numbers(1,2,3))print(sum_numbers(10,20,30,40))運(yùn)行結(jié)果如下:6100當(dāng)你不確定函數(shù)將接收多少個位置參數(shù)時,可以使用*args?!?args”允許你向函數(shù)傳遞任意數(shù)量的位置參數(shù)。這些參數(shù)會被打包成一個元組(tuple),在函數(shù)內(nèi)部可以通過

“args”訪問。四、可變數(shù)量的關(guān)鍵字參數(shù)**kwargs允許你向函數(shù)傳遞任意數(shù)量的關(guān)鍵字參數(shù)。這些參數(shù)會被打包成一個字典(dictionary),在函數(shù)內(nèi)部可以通過`kwargs`訪問。示例代碼如下:實例6.2.6——獲取個人信息程序代碼如下:defprint_info(**kwargs):forkey,valueinkwargs.items():print(f"{key}:{value}")#調(diào)用函數(shù),傳遞任意數(shù)量的關(guān)鍵字參數(shù)print_info(name='Alice',age=30,city='NewYork')運(yùn)行結(jié)果如下:

name:Aliceage:30city:NewYork在同一個函數(shù)定義中同時使用*args和**kwargs,以允許函數(shù)接收任意數(shù)量的位置參數(shù)和關(guān)鍵字參數(shù)。示例代碼如下:實例6.2.7——可變參數(shù)混合使用程序代碼如下:defmy_function(*args,**kwargs):forarginargs:print(arg)forkey,valueinkwargs.items():print(f"{key}:{value}")#調(diào)用函數(shù)

my_function(1,2,3,name='Alice',age=30)運(yùn)行結(jié)果如下:

123name:Aliceage:30四、可變數(shù)量的關(guān)鍵字參數(shù)參數(shù)傳遞規(guī)則總結(jié)參數(shù)類型定義示例調(diào)用示例特點(diǎn)位置參數(shù)deffunc(a,b)func(1,2)必須按順序傳遞關(guān)鍵字參數(shù)deffunc(a,b)func(b=2,a=1)通過參數(shù)名指定,順序無關(guān)默認(rèn)參數(shù)deffunc(a,b=5)func(3)或func(3,b=10)可省略,有默認(rèn)值可變位置參數(shù)deffunc(*args)func(1,2,3)接收元組可變關(guān)鍵字參數(shù)deffunc(**kwargs)func(x=1,y=2)接收字典五、綜合案例案例:角谷猜想角谷猜想又稱冰雹猜想,是由日本數(shù)字家角谷靜夫發(fā)現(xiàn)的一種數(shù)學(xué)現(xiàn)象。以一個正整數(shù)n為例,如果n為偶數(shù),就將它變?yōu)閚/2,如果除后變?yōu)槠鏀?shù),則將它乘3加1(即3n+1)。不斷重復(fù)這樣的運(yùn)算,經(jīng)過有限步后,必然會得到1。例如5—>16—>8—>4—>2—>1

本實例要求編寫代碼,計算用戶輸入的數(shù)據(jù)按照以上規(guī)律經(jīng)多少次運(yùn)算后可變?yōu)?。運(yùn)行結(jié)果參考如下:請輸入一個大于1的正整數(shù):77經(jīng)過16次變換后回到143任務(wù)3函數(shù)的嵌套任務(wù)3函數(shù)的嵌套·知識準(zhǔn)備在Python編程中,函數(shù)的嵌套調(diào)用是指在一個函數(shù)的定義或執(zhí)行過程中,又調(diào)用了其他函數(shù),即在一個函數(shù)內(nèi)部定義另一個函數(shù)。嵌套函數(shù)的作用域僅限于外部函數(shù)內(nèi)部。這種嵌套調(diào)用的方式可以使程序更加模塊化,便于理解和維護(hù)。030201學(xué)習(xí)目標(biāo)掌握遞歸函數(shù)的使用,能夠運(yùn)用遞歸函數(shù)解決階乘的問題掌握閉包的使用掌握裝飾器的定義與使用延時符目錄

Contents遞歸算法0145閉包的使用02裝飾器的定義與使用03可綜合實例04一、遞歸函數(shù)在定義時可以直接或間接地調(diào)用其他函數(shù)。若函數(shù)內(nèi)部調(diào)用了自身,則這個函數(shù)被稱為遞歸函數(shù)。遞歸函數(shù)通常用于解決結(jié)構(gòu)相似的問題,它采用遞歸的方式,將一個復(fù)雜的大型問題轉(zhuǎn)化為與原問題結(jié)構(gòu)相似的、規(guī)模較小的若干子問題,之后對最小化的子問題求解,從而得到原問題的解。一、遞歸公式遞歸公式是遞歸求解過程中的歸納項,用于處理原問題以及與原問題規(guī)律相同的子問題。二、邊界條件邊界條件即終止條件,用于終止遞歸。一、遞歸遞歸函數(shù)的執(zhí)行可以分為以下兩個階段:(1)遞推:遞歸的執(zhí)行基于上一次的運(yùn)算結(jié)果,將問題規(guī)模逐漸縮小,通過不斷調(diào)用自身來求解子問題,這一階段也稱為遞歸調(diào)用。(2)回溯:當(dāng)遞歸達(dá)到邊界條件時,遞歸開始回溯,逐級返回函數(shù)調(diào)用過程中得到的結(jié)果,將得到的部分結(jié)果組合成最終的解,這一階段也稱為遞歸的回溯。遞歸函數(shù)的一般定義格式如下所示:def函數(shù)名([參數(shù)列表]):

if邊界條件:

return結(jié)果

else:return遞歸公式一、遞歸遞歸最經(jīng)典的應(yīng)用便是階乘。在數(shù)學(xué)中,求正整數(shù)n!(n的階乘)問題根據(jù)n的取值可以分為以下兩種情況:(1)當(dāng)n=1時,所得的結(jié)果為1。(2)當(dāng)n>1時,所得的結(jié)果為n×(n-1)!。那么利用遞歸求解階乘時,n=1是邊界條件,n×(n-1)!是遞歸公式。編寫代碼實現(xiàn)n!求解,示例代碼如下:deffunc(num):ifnum==1:return1else:returnnum*func(num-1)num=int(input("請輸入一個整數(shù):"))result=func(num)print(result)一、遞歸一、遞歸func(4)的求解過程如圖所示。程序?qū)⑶蠼鈌unc(4)轉(zhuǎn)化為求解4*func(3),想要得到func(4)的結(jié)果,必須先得到func(3)的結(jié)果;func(3)求解又會被轉(zhuǎn)換為3*func(2),以此類推,直到程序開始求解2*func(1),此時觸發(fā)臨界條件,func(1)的值可以直接計算,之后結(jié)果開始向上層層傳遞,直到最終返回func(4)的位置,求得5!。斐波那契數(shù)列是另一個經(jīng)典的遞歸問題,斐波那契數(shù)列在自然界、藝術(shù)、金融等領(lǐng)域有廣泛應(yīng)用,如植物葉序、黃金分割、股票分析等。斐波那契數(shù)列的定義如下:第0項,F(xiàn)(0)=0第1項,F(xiàn)(1)=1從第2項開始,每一項等于前兩項之和,F(xiàn)(n)=F(n-1)+F(n-2)(對于n>1)斐波那契數(shù)列的前幾項為:0,1,1,2,3,5,8,13,21,34,55,89,144,…一、遞歸實例6.3.2——斐波那契數(shù)列

程序代碼如下:deffibonacci(n):#基準(zhǔn)條件ifn==0:return0elifn==1:return1#遞歸條件else:returnfibonacci(n-1)+fibonacci(n-2)#生成前10項foriinrange(10):print(fibonacci(i),end="")運(yùn)行結(jié)果如下:0112358132134

一、遞歸二、閉包閉包(Closure)是Python中一個重要的概念,它指的是在一個函數(shù)內(nèi)部定義的函數(shù),并且該內(nèi)部函數(shù)引用了外部函數(shù)的變量。在Python中,可以通過定義一個返回函數(shù)的函數(shù)來創(chuàng)建閉包。返回的函數(shù)將保持對其定義環(huán)境中變量的引用。語法格式如下:defouter_func(outer_var):#外部函數(shù)定義一個局部變量

definner_func():print(outer_var)#內(nèi)部函數(shù)引用了外部函數(shù)的變量returninner_func#外部函數(shù)返回內(nèi)部函數(shù)

(空兩行)

#創(chuàng)建閉包實例closure=outer_func("Hello!")#調(diào)用閉包c(diǎn)losure()實例6.3.2——斐波那契數(shù)列

程序代碼如下:defcreate_substring(start,end):defsubstring(s):returns[start:end]returnsubstring#使用閉包實現(xiàn)字符串截取substr=create_substring(1,4)result=substr("Python")print('截取字符串:',result)運(yùn)行結(jié)果如下:截取字符串:yth

二、閉包閉包的特點(diǎn):

(1)保持狀態(tài):閉包可以記住并訪問其詞法作用域中的變量,即使外部函數(shù)已經(jīng)執(zhí)行完畢。

(2)封裝數(shù)據(jù):閉包可以用于封裝數(shù)據(jù),避免使用全局變量。

(3)延遲執(zhí)行:閉包可以用于延遲執(zhí)行某些操作,直到真正需要時才執(zhí)行。閉包與普通函數(shù)的區(qū)別:

(1)普通函數(shù):函數(shù)執(zhí)行完畢后,其局部變量會被銷毀。

(2)閉包:即使外部函數(shù)執(zhí)行完畢,其局部變量仍然會被內(nèi)部函數(shù)引用,因此不會被銷毀。二、閉包三、裝飾器Python裝飾器是一種用于修改或擴(kuò)展函數(shù)或方法行為的工具。裝飾器(decorators)也是一種函數(shù),接受一個函數(shù)作為參數(shù),并返回一個新的函數(shù)或修改原來的函數(shù),可以動態(tài)地修改函數(shù)或類的行為。1.裝飾器定義在應(yīng)用裝飾器時,使用@decorator_name語法將其應(yīng)用于函數(shù)定義之前。這相當(dāng)于function_name=decorator_name(function_name)。其基本語法如下:defdecorator_function(original_function):defwrapper(*args,**kwargs):#這里是在調(diào)用原始函數(shù)前添加的新功能before_call_code()result=original_function(*args,**kwargs)#這里是在調(diào)用原始函數(shù)后添加的新功能after_call_code()returnresultreturnwrapper三、裝飾器2.使用裝飾器以下是一個使用裝飾器驗證半徑并計算圓周長的案例:importmath#定義驗證半徑的裝飾器defvalidate_radius(func):defwrapper(radius):ifradius<0:raiseValueError("錯誤:半徑不能為負(fù)數(shù)")returnfunc(radius)returnwrapper

#應(yīng)用裝飾器@validate_radiusdefcalculate_circumference(radius):"""計算圓的周長"""return2*math.pi*radius

#測試案例try:print(f"半徑為5的圓周長:{calculate_circumference(5):.2f}")print(calculate_circumference(-2))#這里會觸發(fā)異常exceptValueErrorase:print(e)運(yùn)行結(jié)果如下:半徑為5的圓周長:31.42錯誤:半徑不能為負(fù)數(shù)四、綜合案例案例:兔子數(shù)列兔子數(shù)列又稱斐波那契數(shù)列、黃金分割數(shù)列,它以兔子繁殖的例子引出,故此得名。兔子繁殖的故事如下(如圖6-3-2所示):兔子一般在出生兩個月之后就有了繁殖能力,每對兔子每月可以繁殖一對小兔子,假如所有的兔子都不會死,試問一年以后一共有多少對兔子?本實例要求編寫代碼,利用遞歸實現(xiàn)根據(jù)月份計算兔子總數(shù)量的功能。運(yùn)行結(jié)果參考如下:請輸入一個大于1的正整數(shù):77經(jīng)過16次變換后回到160任務(wù)4簡單算法應(yīng)用任務(wù)2數(shù)據(jù)類型·知識準(zhǔn)備Python是一種非常流行的編程語言,適合實現(xiàn)各種簡單算法。算法是解決特定問題的一系列明確步驟,需要一定的數(shù)學(xué)知識,算法的核心是將輸入轉(zhuǎn)換為輸出。算法和數(shù)據(jù)結(jié)構(gòu)是密不可分的,掌握常見的數(shù)據(jù)結(jié)構(gòu)是設(shè)計高效算法的基礎(chǔ)。0201學(xué)習(xí)目標(biāo)掌握排序算法的運(yùn)用(冒泡和選擇)熟悉基礎(chǔ)數(shù)學(xué)算法的運(yùn)用(求最大/小值、平均數(shù)、最大公約數(shù)、判斷質(zhì)數(shù)等)延時符目錄

Contents排序算法0162數(shù)學(xué)算法02綜合實例03一、排序算法冒泡排序(BubbleSort)冒泡排序通過重復(fù)遍歷列表,比較相鄰元素并交換位置,直到列表有序。冒泡排序算法的工作過程defbubble_sort(arr):n=len(arr)foriinrange(n):forjinrange(0,n-i-1):ifarr[j]>arr[j+1]:arr[j],arr[j+1]=arr[j+1],arr[j]returnarr

#示例arr=[11,3,5,7,2]print("排序前:",arr)print("排序后:",bubble_sort(arr))示例(冒泡排序)代碼如下:運(yùn)行結(jié)果如下:排序前:[11,3,5,7,2]排序后:[2,3,5,7,11]一、排序算法2.選擇排序(SelectionSort)工作原理是每次從待排序的列表中選擇最?。ɑ蜃畲螅┑脑?,將其與列表中的第一個位置交換,然后繼續(xù)對剩余的元素進(jìn)行排序,直到整個列表排序完成。選擇排序算法的工作過程一、排序算法defselection_sort(arr):n=len(arr)foriinrange(n):min_idx=iforjinrange(i+1,n):ifarr[j]<arr[min_idx]:min_idx=jarr[i],arr[min_idx]=arr[min_idx],arr[i]returnarr

#示例arr=[7,11,3,2,5]print("排序前:",arr)print("排序后:",selection_sort(arr))示例(選擇排序)代碼如下:運(yùn)行結(jié)果如下:排序前:[7,11,3,2,5]排序后:[2,3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論