Python快速編程入門(第3版) 課件 第6章 函數(shù)_第1頁
Python快速編程入門(第3版) 課件 第6章 函數(shù)_第2頁
Python快速編程入門(第3版) 課件 第6章 函數(shù)_第3頁
Python快速編程入門(第3版) 課件 第6章 函數(shù)_第4頁
Python快速編程入門(第3版) 課件 第6章 函數(shù)_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第6章函數(shù)《Python快速編程入門(第3版))》學習目標/Target了解函數(shù),能夠簡述函數(shù)的概念以及程序中使用函數(shù)的好處掌握函數(shù)參數(shù)的傳遞方式,能夠通過各種類型的參數(shù)向函數(shù)內(nèi)部傳遞數(shù)據(jù)熟悉函數(shù)的返回值,能夠在程序中處理一個或多個返回值掌握函數(shù)的定義和調(diào)用,能夠根據(jù)需求定義和調(diào)用函數(shù)學習目標/Target掌握局部變量和全局變量,能夠在程序中使用全局變量和局部變量掌握遞歸函數(shù)的使用,能夠運用遞歸函數(shù)解決階乘的問題掌握匿名函數(shù)的使用,能夠運用匿名函數(shù)簡化簡單函數(shù)的定義掌握global或nonlocal關(guān)鍵字,能夠通過這兩個關(guān)鍵字修改變量的作用域章節(jié)概述/Summary程序中有時不僅要處理數(shù)字、字符串這些基礎(chǔ)類型的數(shù)據(jù),還需要處理一些混合數(shù)據(jù)。為此,Python定義了可以表示和記錄混合數(shù)據(jù)的組合數(shù)據(jù)類型。使用組合數(shù)據(jù)類型表示和記錄數(shù)據(jù),不僅能使數(shù)據(jù)表示得更為清晰,也能極大簡化程序員的開發(fā)工作,提高開發(fā)效率。本章將對Python中的組合數(shù)據(jù)類型進行詳細講解。目錄/Contents010203函數(shù)概述函數(shù)的定義和調(diào)用函數(shù)參數(shù)的傳遞04函數(shù)的返回值05變量的作用域目錄/Contents060708實訓案例特殊形式的函數(shù)實訓案例09階段案例—學生管理系統(tǒng)函數(shù)概述6.1

先定一個小目標!了解函數(shù),能夠簡述函數(shù)的概念以及程序中使用函數(shù)的好處6.1函數(shù)概述在程序開發(fā)中,函數(shù)是組織好的、實現(xiàn)單一功能或相關(guān)聯(lián)功能的代碼段。例如,用于向控制臺輸出的print()函數(shù)、用戶接收用戶輸入內(nèi)容的input()函數(shù)等。我們可以將函數(shù)視為一段有名字的代碼,這類代碼可以在需要的地方以“函數(shù)名()”的形式調(diào)用。6.1函數(shù)概述6.1函數(shù)概述未使用函數(shù)的程序輸出指定個數(shù)星號的正方形

使用函數(shù)的程序輸出指定個數(shù)星號的正方形相較之前的編程方法,函數(shù)式編程將程序模塊化,減少了冗余代碼,程序結(jié)構(gòu)更為清晰,這樣不僅提高開發(fā)人員的編程效率,而且方便后期的維護與擴展。函數(shù)的定義和調(diào)用6.2

先定一個小目標!6.2.1定義函數(shù)掌握函數(shù)的定義,能夠根據(jù)需求定義函數(shù)Python中使用關(guān)鍵字def定義函數(shù),定義函數(shù)的語法格式如下:6.2.1定義函數(shù)def函數(shù)名([參數(shù)列表]):["""文檔字符串"""]

函數(shù)體[return語句]標記函數(shù)的開始接收傳入函數(shù)中的數(shù)據(jù)函數(shù)的唯一標識說明函數(shù)功能的字符串函數(shù)功能的具體代碼標志函數(shù)的結(jié)束定義函數(shù)的語法格式如果在定義函數(shù)時參數(shù)列表為空,則這個函數(shù)稱為無參函數(shù)。例如,定義一個計算兩個數(shù)之和的函數(shù),具體代碼如下:defadd():result=11+22print(result)6.2.1定義函數(shù)為了增加函數(shù)的靈活性,使函數(shù)能夠計算任意兩個數(shù)之和,這里可以定義一個帶有參數(shù)的add_modify()函數(shù),使用該函數(shù)的參數(shù)接收函數(shù)外部傳入的數(shù)據(jù),之后根據(jù)這些數(shù)據(jù)的具體數(shù)值計算它們的和,示例代碼如下:defadd_modify(a,b):result=a+bprint(result)6.2.1定義函數(shù)

先定一個小目標!6.2.2調(diào)用函數(shù)掌握函數(shù)的定義,能夠根據(jù)需求調(diào)用函數(shù)6.2.2調(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ù)的代碼,修改后的代碼如下:defadd_modify(a,b):result=a+badd()#在add_modify()函數(shù)的內(nèi)部調(diào)用add()函數(shù)

print(result)6.2.2調(diào)用函數(shù)6.2.2調(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ù)定義的位置。程序執(zhí)行add()函數(shù)中的函數(shù)體。程序回到調(diào)用add()函數(shù)的位置繼續(xù)執(zhí)行。程序繼續(xù)執(zhí)行add_modify()函數(shù)中的函數(shù)體。程序回到調(diào)用add_modify()函數(shù)的位置繼續(xù)執(zhí)行。defadd_modify(a,b):result=a+bprint(result)deftest():#在函數(shù)中定義函數(shù)test()print("我是內(nèi)層函數(shù)")add_modify(10,20)多學一招:函數(shù)的嵌套定義函數(shù)在定義時可以在其內(nèi)部嵌套定義另外一個函數(shù),此時嵌套的函數(shù)稱為外層函數(shù),被嵌套的函數(shù)稱為內(nèi)層函數(shù)。例如,在add_modify()函數(shù)中定義test()函數(shù),具體代碼如下所示:defadd_modify(a,b):result=a+bprint(result)deftest():#在函數(shù)中定義函數(shù)test()print("我是內(nèi)層函數(shù)")test()#在函數(shù)中調(diào)用函數(shù)test()add_modify(10,20)多學一招:函數(shù)的嵌套定義需要說明的是,函數(shù)外部無法直接調(diào)用內(nèi)層函數(shù),只能在外層函數(shù)中調(diào)用內(nèi)層函數(shù),從而執(zhí)行兩個函數(shù)的輸出語句。例如,在add_modify()函數(shù)中調(diào)用test()函數(shù),修改后的代碼如下:函數(shù)參數(shù)的傳遞6.3

先定一個小目標!6.3.1位置參數(shù)的傳遞掌握位置參數(shù)傳遞,能夠通過位置參數(shù)傳遞參數(shù)當調(diào)用函數(shù)傳遞位置參數(shù)時,實參會按照位置順序依次傳遞給對應(yīng)的形參。也就是說,第1個實參會傳遞給第1個形參,第2個實參會傳遞給第2個形參,以此類推。注意,實參的數(shù)量和位置必須與函數(shù)定義中位置參數(shù)的數(shù)量和位置保持一致,否則會導(dǎo)致解釋器運行時出現(xiàn)異常信息,或者錯誤的參數(shù)匹配。6.3.1位置參數(shù)的傳遞defget_max(a,b):ifa>b:print(a,"是較大的值!")elifa<b:print(b,"是較大的值!")else:print("兩個值一樣大!")get_max(8,5)6.3.1位置參數(shù)的傳遞定義一個獲取兩個數(shù)之間最大值的函數(shù)get_max(),調(diào)用get_max()函數(shù),通過位置參數(shù)的方式傳遞實參,示例代碼如下:第一個實參8傳遞給第一個形參a,第二個實參5傳遞給第二個形參b。

先定一個小目標!6.3.2關(guān)鍵字參數(shù)的傳遞掌握關(guān)鍵字參數(shù)傳遞,能夠通過關(guān)鍵字參數(shù)傳遞參數(shù)當函數(shù)有較多參數(shù)時,記住每個參數(shù)的位置和含義可能會很困難,因此按照位置參數(shù)的方式傳參并不是一個好的選擇。此時,可以使用關(guān)鍵字參數(shù)的方式傳參。關(guān)鍵字參數(shù)的傳遞通過使用“形參=實參”的格式將實參與對應(yīng)的形參關(guān)聯(lián)起來,根據(jù)具體的參數(shù)名傳遞參數(shù),從而避免記憶參數(shù)位置的困擾。6.3.2關(guān)鍵字參數(shù)的傳遞defconnect(ip,port):print(f"設(shè)備{ip}:{port}連接!")connect(ip="127.0.0.1",port=8080)定義一個連接設(shè)備的函數(shù)connect(),調(diào)用connect()函數(shù),通過關(guān)鍵字參數(shù)的方式傳遞實參,示例代碼如下:執(zhí)行后會將"127.0.0.1"傳遞給關(guān)聯(lián)的形參ip,將8080傳遞給關(guān)聯(lián)的形參port。6.3.2關(guān)鍵字參數(shù)的傳遞deffunc(a,b,/,c):#使用/限制其前面的形參a、bprint(a,b,c)多學一招:僅限位置無論實參采用位置參數(shù)的方式傳遞,還是關(guān)鍵字參數(shù)的方式傳遞,每個形參都是有名稱的。Python新增了僅限位置的語法,使用符號“/”來限定部分形參只能接收通過位置傳遞方式的實參,示例代碼如下:定義的func()函數(shù)中,符號“/”之前的a、b只能接收通過位置傳遞方式的實參;符號“/”之后的c為普通形參,可以接收采用位置傳遞方式或關(guān)鍵字傳遞方式的實參。#錯誤的調(diào)用方式func(a=10,20,30)func(10,b=20,30)#正確的調(diào)用方式func(10,20,c=30)多學一招:僅限位置調(diào)用func()函數(shù),示例代碼如下:

先定一個小目標!6.3.3默認參數(shù)的傳遞掌握默認參數(shù)傳遞,能夠通過默認參數(shù)傳遞參數(shù)6.3.3默認參數(shù)的傳遞定義函數(shù)時可以指定形參的默認值,調(diào)用函數(shù)時可以選擇是否給帶有默認值的形參傳值。若沒有給帶有默認值的形參傳值,直接使用參數(shù)的默認值;若給帶有默認值的形參傳值,則使用實參的值覆蓋默認值。defconnect(ip,port=8080):print(f"設(shè)備{ip}:{port}連接!")定義一個連接設(shè)備的函數(shù),在該函數(shù)中給一個參數(shù)指定默認值,另一個參數(shù)不指定默認值,示例代碼如下:6.3.3默認參數(shù)的傳遞調(diào)用兩次connect()函數(shù),分別使用默認值和不使用默認值,示例代碼如下:connect(ip="127.0.0.1")#"127.0.0.1"傳遞形參ip,形參port使用默認值8080connect(ip="127.0.0.1",port=3306)#"127.0.0.1"傳遞給形參ip,3306傳遞給形參port

先定一個小目標!6.3.4參數(shù)的打包與解包掌握參數(shù)的打包與解包,能夠通過打包的方式傳遞參數(shù)Python中參數(shù)的打包是指將多個實參打包成一個元組或字典,在函數(shù)調(diào)用時作為一個整體傳遞給形參。如果形參的前面加上“*”,那么它可以接收以元組形式打包的多個值;如果形參的前面加上“**”,那么它可以接收以字典形式打包的多個值。6.3.4參數(shù)的打包與解包參數(shù)*args參數(shù)**kwargsdeftest(*args):print(args)#多個實參會在打包后被傳遞給形參test(11,22,33,44,55)定義一個形參為*args的函數(shù)。deftest(**kwargs):print(kwargs)#調(diào)用test()函數(shù)時傳入多個關(guān)聯(lián)了形參的實參test(a=11,b=22,c=33,d=44,e=55)定義一個形參為**kwargs的函數(shù)。6.3.4參數(shù)的打包與解包6.3.4參數(shù)的打包與解包值得一提的是,雖然函數(shù)中添加“*”或“**”的形參可以是符合命名規(guī)范的任意名稱,但這里建議使用*args和**kwargs。若函數(shù)沒有接收到任何數(shù)據(jù),參數(shù)*args和**kwargs為空,即它們?yōu)榭赵M或空字典。6.3.4參數(shù)的打包與解包Python中參數(shù)的解包是指使用特殊語法將元組或字典拆分為多個值并賦值給對應(yīng)的形參。如果函數(shù)在調(diào)用時接收的實參是元組類型的數(shù)據(jù),那么可以使用“*”將元組拆分成多個值,并按照位置參數(shù)傳遞的方式賦值給形參;如果函數(shù)在調(diào)用時接收的實參是字典類型的數(shù)據(jù),那么可以使用“**”將字典拆分成多個鍵值對,并按照關(guān)鍵字參數(shù)傳遞的方式賦值給與鍵名稱對應(yīng)的形參。6.3.4參數(shù)的打包與解包使用“*”對該元組執(zhí)行解包使用“**”對該字典執(zhí)行解包deftest(a,b,c,d,e):print(a,b,c,d,e)nums=(11,22,33,44,55)#使用“*”對該元組執(zhí)行解包操作test(*nums)定義一個形參為*args的函數(shù)。deftest(a,b,c,d,e):print(a,b,c,d,e)nums={"a":11,"b":22,"c":33,"d":44,"e":55}#使用“**”對該字典執(zhí)行解包test(**nums)定義一個形參為**kwargs的函數(shù)。

先定一個小目標!6.3.5混合傳遞掌握混合傳遞,能夠通過混合傳遞的方式傳遞參數(shù)6.3.5混合傳遞函數(shù)參數(shù)的傳遞方式按優(yōu)先級從高到低依次為位置參數(shù)傳遞、關(guān)鍵字參數(shù)傳遞、默認參數(shù)傳遞、打包傳遞。在定義函數(shù)時,帶有默認值的參數(shù)必須位于普通參數(shù)(不帶默認值或星號標識的參數(shù))之后,帶有“*”標識的參數(shù)必須位于帶有默認值的參數(shù)之后,帶有“**”標識的參數(shù)必須位于帶有“*”標識的參數(shù)之后。6.3.5混合傳遞定義一個混合了多種形式參數(shù)的函數(shù),代碼如下:deftest(a,b,c=33,*args,**kwargs):print(a,b,c,args,kwargs)test(1,2)test(1,2,3)test(1,2,3,4)test(1,2,3,4,e=5)第一次調(diào)用接收實參1、2,剩余三個形參c、*args、**kwargs都使用默認值。第二次調(diào)用接收實參1、2、3,剩余兩個形參*args、**kwargs都使用默認值。第三次調(diào)用接收實參1、2、3、4,形參**kwargs使用默認值。第四次調(diào)用接收實參1、2、3、4和關(guān)聯(lián)形參e的實參5。函數(shù)的返回值6.4

先定一個小目標!6.4函數(shù)的返回值熟悉函數(shù)的返回值,能夠在程序中處理一個或多個返回值函數(shù)中的return語句會在函數(shù)結(jié)束時將數(shù)據(jù)返回給程序,同時讓程序回到函數(shù)被調(diào)用的位置繼續(xù)執(zhí)行。定義一個過濾敏感詞的函數(shù),代碼如下:6.4函數(shù)的返回值deffilter_sensitive_words(words):if"山寨"inwords:new_words=words.replace("山寨","**")returnnew_words調(diào)用filter_sensitive_words()函數(shù),使用一個變量保存返回值,示例代碼如下:6.4函數(shù)的返回值result=filter_sensitive_words("這個手機是山寨版吧!")print(result)以上定義的函數(shù)只返回了一個值,如果函數(shù)使用return語句返回了多個值,那么這些值將被保存到元組中。定義一個控制游戲角色位置的函數(shù),該函數(shù)使用return語句返回游戲角色目前所處位置的x坐標和y坐標,示例代碼如下:6.4函數(shù)的返回值defmove(x,y,step):nx=x+stepny=y-stepreturnnx,ny#使用return語句返回多個值result=move(100,100,60)print(result)變量作用域6.5

先定一個小目標!6.5.1局部變量和全局變量掌握局部變量,能夠在程序中使用局部變量局部變量是指在函數(shù)內(nèi)部定義的變量,它的作用域僅限于函數(shù)內(nèi)部,只能在函數(shù)內(nèi)部進行訪問或使用。一旦函數(shù)執(zhí)行結(jié)束,局部變量將無法再被訪問或使用。例如,test_one()函數(shù)中定義一個局部變量number,分別在該函數(shù)內(nèi)和函數(shù)外訪問局部變量number,代碼如下:deftest_one():number=10#局部變量

print(number)#函數(shù)內(nèi)部訪問局部變量test_one()print(number)6.5.1局部變量和全局變量程序調(diào)用test_one()函數(shù)后成功訪問并輸出了局部變量number的值,說明局部變量能夠在函數(shù)內(nèi)部使用;程序在調(diào)用test_one()函數(shù)后繼續(xù)在函數(shù)外部訪問局部變量number,這時出現(xiàn)name'number'isnotdefined的錯誤信息,說明局部變量不能在函數(shù)外部使用。不同函數(shù)內(nèi)部可以包含同名的局部變量,這些局部變量的關(guān)系類似于不同目錄下同名文件的關(guān)系,它們相互獨立,互不影響。例如,test_one()函數(shù)中定義一個局部變量number,test_two()函數(shù)中也定義一個局部變量number,分別在每個函數(shù)的內(nèi)部訪問number,代碼如下:deftest_one():number=10print(number) #訪問test_one()函數(shù)的局部變量numberdeftest_two():number=20print(number) #訪問test_two()函數(shù)的局部變量numbertest_one()test_two()6.5.1局部變量和全局變量程序在執(zhí)行test_one()函數(shù)時訪問了局部變量number,并且輸出了number的值10;程序在執(zhí)行test_two()函數(shù)時訪問了局部變量number,并且輸出了number的值20,由此可見,不同函數(shù)的局部變量之間互不影響。全局變量是指在整個程序中都可以使用的變量,它們一般定義在函數(shù)外部,并且在整個程序運行期間占用存儲單元。例如,在test_one()函數(shù)的外部定義了一個全局變量number,分別在該函數(shù)的內(nèi)部和外部訪問全局變量number,具體代碼如下:number=10 #定義全局變量deftest_one():print(number) #在函數(shù)內(nèi)部訪問全局變量test_one()print(number) #在函數(shù)外部訪問全局變量6.5.1局部變量和全局變量程序在執(zhí)行test_one()函數(shù)時成功地訪問了全局變量number,并且輸出了number的值;程序在執(zhí)行完test_one()函數(shù)后再次成功地訪問了全局變量number,并且輸出了number的值。由此可知,全局變量可以在程序的任意位置被訪問。需要注意的是,全局變量在函數(shù)內(nèi)部只能被訪問,而無法直接修改。下面對test_one()函數(shù)進行修改,在該函數(shù)中添加給全局變量number重新賦值的語句,修改后的代碼如下:number=10#定義全局變量deftest_one():print(number) #在函數(shù)內(nèi)部訪問全局變量

number+=1 #在函數(shù)內(nèi)部直接修改全局變量test_one()print(number)6.5.1局部變量和全局變量函數(shù)內(nèi)部的變量number視為局部變量,而在執(zhí)行“number+=1”這行代碼之前并未聲明過局部變量number。由此可見,函數(shù)內(nèi)部只能訪問全局變量,而無法直接修改全局變量。多學一招:LEGB原則LEGB是程序中搜索變量時所遵循的原則,該原則中的每個字母指代一種作用域,具體如下:(1)L(local):局部作用域,例如,函數(shù)內(nèi)定義的局部變量和形參的作用域。(2)E(enclosing):嵌套作用域,例如,嵌套函數(shù)中外層函數(shù)聲明變量的作用域。(3)G(global):全局作用域。例如,在模塊層定義的變量作用域。(4)B(built-in):內(nèi)置作用域。例如,Python內(nèi)置的模塊或函數(shù)聲明的變量作用域。Python在搜索變量時會按照“L-E-G-B”這個順序依次在這四種區(qū)域中搜索變量:若搜索到匹配的變量,則終止搜索并使用該變量;若搜索完L、E、G、B這四種區(qū)域仍未找到變量,程序?qū)伋霎惓!?/p>

先定一個小目標!6.5.2global和nonlocal關(guān)鍵字掌握global或nonlocal關(guān)鍵字,能夠通過這兩個關(guān)鍵字修改變量的作用域global關(guān)鍵字用于在函數(shù)內(nèi)部聲明一個全局變量,并允許在函數(shù)內(nèi)部對該全局變量進行修改。global關(guān)鍵字的使用方法如下:6.5.2global和nonlocal關(guān)鍵字global變量名語法格式在test_one()函數(shù)中使用global關(guān)鍵字聲明全局變量number,然后在函數(shù)中重新給number賦值,修改后的代碼如下:6.5.2global和nonlocal關(guān)鍵字number=10#定義全局變量deftest_one():globalnumber#使用global聲明變量number為全局變量

number+=1print(number)test_one()print(number)6.5.2global和nonlocal關(guān)鍵字如果在嵌套函數(shù)內(nèi)部訪問和修改外層函數(shù)中的變量,而不是創(chuàng)建新的局部變量,可以使用nonlocal關(guān)鍵字。nonlocal關(guān)鍵字的使用方法如下:nonlocal變量名語法格式在test()函數(shù)嵌套的test_in()函數(shù)中使用nonlocal關(guān)鍵字聲明變量是外部函數(shù)中定義的變量,之后修改這個變量的值,具體代碼如下所示:6.5.2global和nonlocal關(guān)鍵字deftest():number=10#定義變量

deftest_in():nonlocalnumber#使用nonlocal聲明變量numbernumber=20#在內(nèi)部函數(shù)中修改變量numbertest_in()print(number)test()定義的test()函數(shù)中嵌套了函數(shù)test_in(),在test()函數(shù)中定義了一個變量number,在test_in()函數(shù)中使用nonlocal關(guān)鍵字聲明變量number,并修改了變量number的值,調(diào)用test_in()函數(shù)后輸出變量number的值。實訓案例6.6

先定一個小目標!6.6.1智能聊天機器人根據(jù)任務(wù)描述實現(xiàn)案例:智能聊天機器人近年來,智能聊天機器人在國內(nèi)廣泛應(yīng)用于企業(yè)客戶服務(wù)、教育、醫(yī)療等多個領(lǐng)域,為人們提供了更加便捷、高效、智能的服務(wù)。本案例要求實現(xiàn)一個簡易智能聊天機器人——小智,用于幫助用戶解答百科知識的問題,具體要求如下。(1)機器人默認會解答5個問題,這5個問題分別是詩仙是誰、中國第一個朝代、三十六計的第一計是什么、天府之國是中國的哪個地方、中國第一長河,答案分別是李白、夏朝、瞞天過海、四川、長江。(2)機器人有3項功能,分別是訓練、對話和離開,若用戶從鍵盤輸入t,說明用戶想訓練機器人,此時機器人需要記錄訓練的新問題及答案;若用戶從鍵盤輸入c,說明用戶想跟機器人對話,此時機器人需要回答用戶提出的問題;若用戶從鍵盤輸入l,說明讓機器人離開,此時機器人需要退出程序。6.6.1智能聊天機器人

先定一個小目標!6.6.2飲品自動售貨機根據(jù)任務(wù)描述實現(xiàn)案例:飲品自動售貨機隨著無人新零售經(jīng)濟的興起,商場、車站、大廈等各種場所都引入了無人飲品自動售貨機,方便人們選購自己想要的飲品。購買者選擇想要的飲品,通過投幣或掃碼的方式支付,支付成功后從出貨口取出飲品。本案例要求編寫代碼,運行函數(shù)的知識實現(xiàn)飲品自動售貨機的程序,模擬用戶在飲品自動售貨機選購飲品的流程,具體要求如下。(1)用戶開始使用時會展示飲品菜單,飲品菜單包括飲品名稱及其價格。(2)用戶可以根據(jù)自己的需要重復(fù)輸入商品名稱和數(shù)量,如果用戶輸入的商品名稱不存在,則會輸出商品名稱不正確的提示信息;如果用戶輸入的商品數(shù)量為負數(shù)或者非整數(shù),則會輸出商品數(shù)量不合法的提示信息;如果用戶輸入的商品名稱為q,則會完成選擇進入結(jié)算的流程。(3)飲品自動售貨機會根據(jù)商品單價和數(shù)量計算總金額。6.6.2飲品自動售貨機特殊形式的函數(shù)6.7

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

if邊界條件:

return結(jié)果

else:return遞歸公式6.7.1遞歸函數(shù)遞歸最經(jīng)典的應(yīng)用便是階乘。在數(shù)學中,求正整數(shù)n!(n的階乘)問題根據(jù)n的取值可以分為以下兩種情況:(1)當n=1時,所得的結(jié)果為1。(2)當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("5!=%d"%result)6.7.1遞歸函數(shù)func(5)的求解過程如圖所示。6.7.1遞歸函數(shù)程序?qū)⑶蠼鈌unc(5)轉(zhuǎn)化為求解5*func(4),想要得到func(5)的結(jié)果,必須先得到func(4)的結(jié)果;func(4)求解又會被轉(zhuǎn)換為4*func(3),同樣地想要得到func(4)的結(jié)果必須先得到func(3)的結(jié)果。以此類推,直到程序開始求解2*func(1),此時觸發(fā)臨界條件,func(1)的值可以直接計算,之后結(jié)果開始向上層層傳遞,直到最終返回func(5)的位置,求得5!。

先定一個小目標!掌握匿名函數(shù)的使用,能夠運用匿名函數(shù)簡化簡單函數(shù)的定義6.7.2匿名函數(shù)6.7.2匿名函數(shù)匿名函數(shù)是一類不需要命名的函數(shù),它與普通函數(shù)一樣可以在程序的任何位置使用。Python中使用lambda關(guān)鍵字定義匿名函數(shù),它的語法格式如下:lambda<形式參數(shù)列表>:<表達式>語法格式以上語法格式中,形式參數(shù)列表可以包含零個、一個或多個參數(shù),多個參數(shù)之間使用逗號分隔,表達式定義了匿名函數(shù)要執(zhí)行的操作。關(guān)于匿名函數(shù)與普通函數(shù)的主要區(qū)別如下:(1)普通函數(shù)在定義時有函數(shù)名稱,而匿名函數(shù)沒有函數(shù)名稱。(2)普通函數(shù)的函數(shù)體中包含多條語句,而匿名函數(shù)的函數(shù)體只

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論