《Python與數(shù)據(jù)分析應用》課件-第6章 函數(shù)_第1頁
《Python與數(shù)據(jù)分析應用》課件-第6章 函數(shù)_第2頁
《Python與數(shù)據(jù)分析應用》課件-第6章 函數(shù)_第3頁
《Python與數(shù)據(jù)分析應用》課件-第6章 函數(shù)_第4頁
《Python與數(shù)據(jù)分析應用》課件-第6章 函數(shù)_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

第六章

函數(shù)在此輸入副標題·

函數(shù)的定義和調(diào)用·函數(shù)參數(shù)的傳遞·函數(shù)的返回值·變量作用域·特殊形式的函數(shù)了解掌握熟悉理解

1234學習目標了解

函數(shù)的概念及優(yōu)勢掌握

局部變量和全局變量、遞歸函數(shù)和匿名函數(shù)熟悉函數(shù)的定義和使用、函數(shù)參數(shù)的傳遞理解

變量作用域目錄CONTENTS6.16.26.36.46.56.6函數(shù)概述函數(shù)的定義和使用函數(shù)的返回值函數(shù)參數(shù)的傳遞變量作用域

特殊形式的函數(shù)

第一部分PART016.1函數(shù)概述函數(shù)是組織好的、實現(xiàn)單一功能或相關(guān)聯(lián)功能的代碼段。我們可以將函數(shù)視為一段有名字的代碼,這類代碼可以在需要的地方以“函數(shù)名()”的形式調(diào)用。print()input()6.1函數(shù)概述

(a)未使用函數(shù)的程序(b)使用函數(shù)的程序結(jié)構(gòu)清晰代碼精簡6.1函數(shù)概述程序若希望再打印一個邊長為5個星號的正方形,應該如何解決呢?6.1函數(shù)概述冗余代碼繼續(xù)增加再次調(diào)用函數(shù)6.1函數(shù)概述6.1函數(shù)概述PART01。PART02PART03將程序模塊化,既減少了冗余代碼,又讓程序結(jié)構(gòu)更為清晰。提高開發(fā)人員的編程效率。方便后期的維護與擴展。函數(shù)式編程具有以下優(yōu)點:

第二部分PART026.2函數(shù)的定義和調(diào)用前面使用的print()函數(shù)和input()都是Python的內(nèi)置函數(shù),這些函數(shù)由Python定義的。開發(fā)人員也可以根據(jù)自己的需求定義函數(shù),Python中使用關(guān)鍵字def來定義函數(shù),其語法格式如下:標記函數(shù)的開始函數(shù)的唯一標識傳入函數(shù)中的數(shù)據(jù)可以包含一個或多個參數(shù)也可以為空標記函數(shù)體的開始實現(xiàn)函數(shù)功能的具體代碼返回函數(shù)的處理結(jié)果給調(diào)用者標志著函數(shù)的結(jié)束若函數(shù)沒有返回值,可以省略6.2.1定義函數(shù)例如,定義一個計算兩個數(shù)之和的函數(shù),代碼如下:defadd():

result=11+22

print(result)defadd_modify(a,b):

result=a+b

print(result)無參函數(shù)有參函數(shù)6.2.1定義函數(shù)函數(shù)在定義完成后不會立刻執(zhí)行,直到被程序調(diào)用時才會執(zhí)行。語法格式如下:add()add_modify(10,20)例如函數(shù)名([參數(shù)列表])調(diào)用過程1.程序在調(diào)用函數(shù)的位置暫停執(zhí)行。2.將數(shù)據(jù)傳遞給函數(shù)參數(shù)。3.執(zhí)行函數(shù)體中的語句。4.程序回到暫停處繼續(xù)執(zhí)行。6.2.2調(diào)用函數(shù)函數(shù)內(nèi)部也可以調(diào)用其他函數(shù),這被稱為函數(shù)的嵌套調(diào)用。6.2.2調(diào)用函數(shù)defadd_modify(a,b):

result=a+b

add() print(result)add_modify(10,20)例如嵌套調(diào)用函數(shù)add()調(diào)用過程函數(shù)在定義時可以在其內(nèi)部嵌套定義另外一個函數(shù),此時嵌套的函數(shù)稱為外層函數(shù),被嵌套的函數(shù)稱為內(nèi)層函數(shù)。函數(shù)外部無法直接調(diào)用內(nèi)層函數(shù)只能通過外層函數(shù)間接調(diào)用內(nèi)層函數(shù)注意內(nèi)嵌函數(shù)defadd_modify(a,b):

result=a+b

print(result)

deftest():print("我是內(nèi)層函數(shù)")add_modify(10,20)例如多學一招:函數(shù)的嵌套定義

第三部分PART036.3函數(shù)參數(shù)的傳遞6.3函數(shù)參數(shù)的傳遞函數(shù)參數(shù)的傳遞

我們通常將定義函數(shù)時設(shè)置的參數(shù)稱為形式參數(shù)(簡稱為形參),將調(diào)用函數(shù)時傳入的參數(shù)稱為實際參數(shù)(簡稱為實參)。函數(shù)的參數(shù)傳遞是指將實際參數(shù)傳遞給形式參數(shù)的過程。

函數(shù)參數(shù)的傳遞可以分為位置參數(shù)傳遞、關(guān)鍵字參數(shù)傳遞、默認參數(shù)傳遞、參數(shù)的打包與解包以及混合傳遞。函數(shù)參數(shù)的傳遞函數(shù)在被調(diào)用時會將實參按照相應的位置依次傳遞給形參,也就是說將第一個實參傳遞給第一個形參,將第二個實參傳遞給第二個形參,以此類推。defget_max(a,b):ifa>b:

print(a,"是較大的值!")

else:

print(b,"是較大的值!")get_max(8,5)8是較大的值6.3.1位置參數(shù)的傳遞關(guān)鍵字參數(shù)的傳遞是通過“形參=實參”的格式將實參與形參相關(guān)聯(lián),將實參按照相應的關(guān)鍵字傳遞給形參。6.3.2關(guān)鍵字參數(shù)的傳遞注意:在函數(shù)調(diào)用時,如果有位置參數(shù),位置參數(shù)必須在關(guān)鍵字參數(shù)的前面,但關(guān)鍵字參數(shù)之間不存在先后順序。defconnect(ip,port):print(f"設(shè)備{ip}:{port}連接!")connect(ip="127.0.0.1",port=8080)無論實參采用位置參數(shù)的方式傳遞,還是關(guān)鍵字參數(shù)的方式傳遞,每個形參都是有名稱的,怎么區(qū)分用哪種方式傳遞呢?符號“/”6.3.2關(guān)鍵字參數(shù)的傳遞Python在3.8之后版本中新增了僅限位置形參的語法,使用符號“/”來限定部分形參只接收采用位置傳遞方式的實參。deffunc(a,b,/,c):

print(a,b,c)例如:#錯誤的調(diào)用方式#func(a=10,20,30)#func(10,b=20,30)#正確的調(diào)用方式func(10,20,c=30)6.3.2關(guān)鍵字參數(shù)的傳遞函數(shù)在定義時可以指定形參的默認值,因此在被調(diào)用時可以選擇是否給帶有默認值的形參傳值,若沒有給帶有默認值的形參傳值,則直接使用該形參的默認值。defconnect(ip,port=8080):

print(f"設(shè)備{ip}:{port}連接!")定義connect(ip="127.0.0.1")connect(ip="127.0.0.1",port=3306)調(diào)用設(shè)備127.0.0.1:8080連接!設(shè)備127.0.0.1:3306連接!結(jié)果6.3.3默認參數(shù)的傳遞默認參數(shù)就是在定義函數(shù)時設(shè)定了默認值的參數(shù)。默認參數(shù)要寫在位置參數(shù)和關(guān)鍵字參數(shù)的后面。參數(shù)的順序依次是:位置參數(shù)、關(guān)鍵字參數(shù)、默認參數(shù)。如果沒有給默認參數(shù)傳遞數(shù)據(jù),則直接使用默認值;如果給默認參數(shù)傳遞數(shù)據(jù),則使用傳遞的數(shù)據(jù)。在給默認參數(shù)傳遞數(shù)據(jù)的時候,可以用位置參數(shù)的方式,也可以用關(guān)鍵字參數(shù)的方式。6.3.3默認參數(shù)的傳遞位置參數(shù)關(guān)鍵字參數(shù)默認參數(shù)不定長參數(shù)不定長參數(shù)的傳遞方式:第一類是包裹位置傳遞,為了接收所有不確定個數(shù)的位置參數(shù);第二類是包裹關(guān)鍵字傳遞,為了接收所有不確定個數(shù)的關(guān)鍵字參數(shù)。6.3.4參數(shù)的打包與解包不定長參數(shù):也叫可變參數(shù),指的是不設(shè)定個數(shù)的參數(shù),它用于在調(diào)用函數(shù)時會傳入不確定個數(shù)實際參數(shù)的場景。函數(shù)支持將實參以打包或者解包的方式傳遞給形參。如果函數(shù)在定義時無法確定需要接收多少個數(shù)據(jù),那么可以在定義函數(shù)時為形參添加“*”或“**”:“*”——接收以元組形式打包的多個值“**”——接收以字典形式打包的多個值6.3.4參數(shù)的打包與解包1.打包1.打包——“*”deftest(*args):

print(args)定義test(11,22,33,44,55)調(diào)用(11,22,33,44,55)結(jié)果6.3.4參數(shù)的打包與解包1.打包——“**”deftest(**kwargs):

print(kwargs)定義test(a=11,b=22,c=33,d=44,e=55)調(diào)用{'a':11,'b':22,'c':33,'d':44,'e':55}結(jié)果6.3.4參數(shù)的打包與解包雖然函數(shù)中添加“*”或“**”的形參可以是符合命名規(guī)范的任意名稱,但這里建議使用*args和**kwargs。若函數(shù)沒有接收到任何數(shù)據(jù),參數(shù)*args和**kwargs為空,即它們?yōu)榭赵M或空字典。6.3.4參數(shù)的打包與解包1.打包——“**”實參是元組

→可以使用“*”拆分成多個值

→按位置參數(shù)傳給形參實參是字典→可以使用“**”拆分成多個鍵值對

→按關(guān)鍵字參數(shù)傳給形參6.3.4參數(shù)的打包與解包2.解包deftest(a,b,c,d,e):

print(a,b,c,d,e)定義nums=(11,22,33,44,55)test(*nums)調(diào)用112233

4455結(jié)果6.3.4參數(shù)的打包與解包2.解包deftest(a,b,c,d,e):

print(a,b,c,d,e)定義nums={"a":11,"b":22,"c":33,"d":44,"e":55}test(**nums)調(diào)用1122334455結(jié)果6.3.4參數(shù)的打包與解包2.解包前面介紹的參數(shù)傳遞的方式在定義函數(shù)或調(diào)用函數(shù)時可以混合使用,但是需要遵循一定的規(guī)則,具體規(guī)則如下。優(yōu)先按位置參數(shù)傳遞的方式。然后按關(guān)鍵字參數(shù)傳遞的方式。之后按默認參數(shù)傳遞的方式。最后按打包傳遞的方式。6.3.5混合傳遞6.3.5混合傳遞010203帶有默認值的參數(shù)必須位于普通參數(shù)之后。帶有“*”標識的參數(shù)必須位于帶有默認值的參數(shù)之后帶有“**”標識的參數(shù)必須位于帶有“*”標識的參數(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)用1233(){}123(){}123(4,){}123(4,){'e':5}結(jié)果6.3.5混合傳遞

第四部分PART046.4函數(shù)的返回值函數(shù)中的return語句會在函數(shù)結(jié)束時將數(shù)據(jù)返回給程序,同時讓程序回到函數(shù)被調(diào)用的位置繼續(xù)執(zhí)行。6.4函數(shù)的返回值deffilter_sensitive_words(words):

if"山寨"inwords:

new_words=words.replace("山寨","**")

returnnew_words定義result=filter_sensitive_words("這個手機是山寨版吧!")print(result)調(diào)用這個手機是**版吧!結(jié)果6.4函數(shù)的返回值如果函數(shù)使用return語句返回了多個值,那么這些值將被保存到元組中。6.4函數(shù)的返回值defmove(x,y,step):

nx=x+step

ny=y-step

returnnx,ny#使用return語句返回多個值定義result=move(100,100,60) print(result)調(diào)用(160,40)結(jié)果6.4函數(shù)的返回值

第五部分PART056.5變量作用域6.5變量作用域變量并非在程序的任意位置都可以被訪問,其訪問權(quán)限取決于變量定義的位置,其所處的有效范圍稱為變量的作用域。根據(jù)作用域的不同,變量可以劃分為局部變量和全局變量。函數(shù)內(nèi)部定義的變量,只能在函數(shù)內(nèi)部被使用。函數(shù)執(zhí)行結(jié)束之后局部變量會被釋放,此時無法再進行訪問。6.5.1局部變量和全局變量1.局部變量deftest_one():

number=10 #局部變量

print(number) #函數(shù)內(nèi)部訪問局部變量test_one()print(number) #函數(shù)外部訪問局部變量示例6.5.1局部變量和全局變量1.局部變量deftest_one():

number=10

print(number)#訪問test_one()函數(shù)的局部變量numberdeftest_two():

number=20

print(number)#訪問test_two()函數(shù)的局部變量numbertest_one()test_two()示例不同函數(shù)內(nèi)部可以包含同名的局部變量,這些局部變量的關(guān)系類似于不同目錄下同名文件的關(guān)系,它們相互獨立,互不影響。1020結(jié)果6.5.1局部變量和全局變量1.局部變量全局變量可以在整個程序的范圍內(nèi)起作用,它不會受到函數(shù)范圍的影響。6.5.1局部變量和全局變量2.全局變量number=10 #全局變量deftest_one():

print(number) #函數(shù)內(nèi)部訪問全局變量test_one()print(number) #函數(shù)外部訪問全局變量示例1010結(jié)果6.5.1局部變量和全局變量2.全局變量#定義全局變量number=10deftest_one():

print(number)

number+=1test_one()print(number)示例全局變量在函數(shù)內(nèi)部只能被訪問,而無法直接修改。已經(jīng)聲明6.5.1局部變量和全局變量2.全局變量沒有找到這是因為函數(shù)內(nèi)部的變量number視為局部變量,而在執(zhí)行“number+=1”這行代碼之前并未聲明過局部變量number。函數(shù)內(nèi)部只能訪問全局變量,而無法直接修改全局變量。6.5.1局部變量和全局變量2.全局變量6.5.2global和nonlocal關(guān)鍵字函數(shù)內(nèi)部無法直接修改全局變量或在嵌套函數(shù)的外層函數(shù)聲明的變量,但可以使用global或nonlocal關(guān)鍵字修飾變量以間接修改以上變量。number=10#定義全局變量deftest_one():

globalnumber#使用global聲明變量number為全局變量

number+=1

print(number)test_one()print(number)示例使用global關(guān)鍵字可以將局部變量聲明為全局變量,其使用方法如下:global變量1111結(jié)果6.5.2global和nonlocal關(guān)鍵字1.global關(guān)鍵字deftest():

number=10

deftest_in():

nonlocalnumber

number=20

test_in()

print(number)test()示例使用nonlocal關(guān)鍵字可以在局部作用域中修改嵌套作用域中定義的變量,其使用方法如下:nonlocal變量20結(jié)果6.5.2global和nonlocal關(guān)鍵字2.nonlocal關(guān)鍵字

第六部分PART066.6特殊形式的函數(shù)函數(shù)在定義時可以直接或間接地調(diào)用其他函數(shù)。若函數(shù)內(nèi)部調(diào)用了自身,則這個函數(shù)被稱為遞歸函數(shù)。6.6.1遞歸函數(shù)6.6.1遞歸函數(shù)遞歸公式AB邊界條件遞歸函數(shù)在定義時需要滿足兩個基本條件:一個是遞歸公式,另一個是邊界條件。遞歸公式是求解原問題或相似的子問題的結(jié)構(gòu);邊界條件是最小化的子問題,也是遞歸終止的條件。遞歸函數(shù)的執(zhí)行可以分為以下兩個階段:1.遞推:遞歸本次的執(zhí)行都基于上一次的運算結(jié)果。2.回溯:遇到終止條件時,則沿著遞推往回一級一級地把值返回來。遞歸函數(shù)的一般定義格式如下所示:def函數(shù)名([參數(shù)列表]):

if邊界條件:

rerurn結(jié)果

else:

return遞歸公式6.6.1遞歸函數(shù)n!=1*2*3*…*n,可以分為以下兩種情況:1.當n=1時,所得的結(jié)果為1。2.當n>1時,所得的結(jié)果為n*(n-1)!。階乘n!兔子一般在出生兩個月之后就有了繁殖能力,每對兔子每月可以繁殖一對小兔子,假如所有的兔子都不會死,試問一年以后一共有多少對兔子?兔子數(shù)列有三根桿子,初始A桿有N個圓盤,移動圓盤到C桿,要求每次只能移動一個圓盤、大盤不能疊在小盤上面。問一共需要移動多少次?漢諾塔歸并排序是一種基于歸并算法的排序方法,該方法采用分治策略:先將待排序的序列劃分成若干長度為1的子序列……歸并排序6.6.1遞歸函數(shù)1.遞歸經(jīng)典應用n!=1*2*3*…*n,可以分為以下兩種情況:1.當n=1時,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論