Python程序設計基礎 (第3版) 課件【ch06】函數(shù)_第1頁
Python程序設計基礎 (第3版) 課件【ch06】函數(shù)_第2頁
Python程序設計基礎 (第3版) 課件【ch06】函數(shù)_第3頁
Python程序設計基礎 (第3版) 課件【ch06】函數(shù)_第4頁
Python程序設計基礎 (第3版) 課件【ch06】函數(shù)_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第六章

函數(shù)高等學校計算機類特別教材上海市高等學校信息技術水平考試參考教材Python程序設計基礎掌握函數(shù)的聲明與調(diào)用。理解并掌握函數(shù)的參數(shù)傳遞。理解變量的作用域。本章教學目標

理解匿名函數(shù)的聲明和調(diào)用。了解函數(shù)的遞歸。了解生成器、裝飾器和閉包等函數(shù)的高級應用。本章教學目標01掌握函數(shù)的聲明與調(diào)用PARTONE6.1函數(shù)的定義與調(diào)用程序設計中,常需要將一些經(jīng)常重復使用的代碼定義為函數(shù),方便重復調(diào)用執(zhí)行,以提高程序的模塊化程度和代碼的重復利用率,這就是自定義函數(shù)。前面章節(jié)我們已經(jīng)使用過一些函數(shù),例如,最常用的輸出函數(shù)print(),以及導入math模塊后就可以使用的函數(shù)math.sin()等。它們作為內(nèi)置函數(shù),為Python的操作、運算提供了豐富的功能。函數(shù)由函數(shù)名、形式參數(shù)列表和函數(shù)體組成。自定義函數(shù)用關鍵字def聲明,函數(shù)的命名原則與變量相同。函數(shù)體使用縮進表示與函數(shù)的隸屬關系。與其他高級語言不同,Python定義函數(shù)時既不需要聲明其返回類型,也不需要聲明參數(shù)的傳入類型。函數(shù)定義格式如下:6.1函數(shù)的定義與調(diào)用定義函數(shù)時,用來接收調(diào)用該函數(shù)時傳入的參數(shù)稱為形式參數(shù)(parameter),簡稱形參。形參分為必選參數(shù)和可選(默認)參數(shù),必選參數(shù)在調(diào)用函數(shù)時必須傳遞。定義函數(shù)時,可以同時給定默認參數(shù)值。調(diào)用該函數(shù)時,若有參數(shù)傳遞則使用傳遞的參數(shù),若沒有則使用默認值。前面我們熟悉的函數(shù)print()中,end就是一個可選參數(shù),默認為end-^n',表示打印完畢換行,也可在調(diào)用時傳遞參數(shù)end="使其打印完畢后不換行。定義函數(shù)時,必選參數(shù)必須放在可選參數(shù)前面,否則會報錯。6.1函數(shù)的定義與調(diào)用【例6-1】帶可選參數(shù)的函數(shù)調(diào)用示例。6.1函數(shù)的定義與調(diào)用函數(shù)在定義時,即使沒有參數(shù)傳遞的需要,冒號前也必須要有空括號。函數(shù)可以沒有return語句、沒有返回值,即返回值為None。在程序設計時還可能先建立一個空函數(shù)作為占位函數(shù),其中的<執(zhí)行語句>僅為占位語句pass,待以后完善。例如:6.1函數(shù)的定義與調(diào)用調(diào)用自定義函數(shù)與前面我們調(diào)用Python內(nèi)置函數(shù)的方法相同,即在語句中直接使用函數(shù)名,并在函數(shù)名之后的圓括號中傳入?yún)?shù),多個參數(shù)之間以半角逗號開。調(diào)用函數(shù)時,實際傳遞給函數(shù)的參數(shù)稱為實際參數(shù)(argument),簡稱實參。實參應與形參的類型一致。即使不需要傳入實參,也要帶圓括號,如print()。6.1函數(shù)的定義與調(diào)用02參數(shù)的傳遞PARTTWO6.2.1關鍵字參數(shù)和默認參數(shù)關鍵字參數(shù)用形參名作為關鍵字來接收傳入的參數(shù)值。通過關鍵字參數(shù)給定函數(shù)實時,不需要與形參的位置完全一致。定義函數(shù)時,給定了默認參數(shù)值的關鍵字參數(shù)稱為默認參數(shù)。默認參數(shù)既可以不傳遞

參數(shù)直接使用默認值,也可以傳入新的實參替代默認值。值得注意的是,定義函數(shù)時,

默認參數(shù)必須放在所有形參的最后。在調(diào)用函數(shù)時,在函數(shù)名后的圓括號內(nèi)用“形參名=參數(shù)值”的方式傳入?yún)?shù),使用這Python程序設計基礎(第3版)

種方式不必按照定義函數(shù)時形參的原有順序。例如:6.1函數(shù)的定義與調(diào)用6.2.2位置參數(shù)調(diào)用函數(shù)時,實參按照函數(shù)聲明時形參的先后順序依次傳遞,不必寫出參數(shù)名。【例6-2】使用位置參數(shù)的函數(shù)調(diào)用示例。6.2.3可變參數(shù)所謂“可變”是指參數(shù)個數(shù)可變,可以用組合數(shù)據(jù)類型傳遞0至任意個參數(shù)。若在某個參數(shù)名前面加一個星號“*”,則表示該參數(shù)是一個元組類型的可變參數(shù)。在調(diào)用該函數(shù)時,依次將必須賦值的位置參數(shù)賦值完畢后,繼續(xù)依次從調(diào)用時所提供的參數(shù)元組中接收元素值從而為可變參數(shù)賦值。如果在函數(shù)調(diào)用時沒有提供元組類型的可變參數(shù),則相當于提供了一個空元組,即可變參數(shù)為0個?!纠?-3】帶元組類型可變參數(shù)的函數(shù)調(diào)用示例。

defprintse_series(d,*dtup):

print('必選參數(shù):',d)

print('元組類型可變參數(shù):',dtup)#不帶星號的實參整體作為元組對象

print('參數(shù)值依次為:’,*dtup)#帶星號的實參自動解包依次傳遞參數(shù)6.2.3可變參數(shù)若在某個參數(shù)名前面加兩個星號“**”,則表示該參數(shù)是一個字典類型的可變參數(shù)。在調(diào)用該函數(shù)時,以關鍵字參數(shù)方式傳遞參數(shù),即將字典的鍵作為關鍵字參數(shù)名,將字典的值作為參數(shù)值。6.2.3可變參數(shù)如果在函數(shù)調(diào)用時沒有提供字典類型的參數(shù),則相當于提供了一個空字典,即可變參數(shù)為0個。6.2.3可變參數(shù)【例6-4】帶元組類型和字典類型可變參數(shù)的函數(shù)調(diào)用示例。6.2.3可變參數(shù)6.2.4變量的作用域變量的作用域是指在程序中能夠?qū)υ撟兞窟M行讀寫操作的范圍。根據(jù)作用域的不同,變量分為函數(shù)中定義的變量(local,簡記為L)、嵌套中父級函數(shù)的局部作用域變量(enclosing,簡記為E)、模塊級別定義的全局變量(global,簡記為G)和內(nèi)置模塊中的變量(built-in,簡記為B)。程序執(zhí)行對變量的搜索和讀寫操作時,優(yōu)先級由近及遠,即函數(shù)中定義的變量>嵌套中父級函數(shù)的局部作用域變量>模塊級別定義的全局變量>內(nèi)置模塊中的變量,也就是LEGB。Python允許出現(xiàn)同名變量。若具有相同命名標識的變量出現(xiàn)在不同的函數(shù)體中,則各自代表不同的對象,既不相互干擾,也不能相互訪問;若具有相同命名標識的變量出現(xiàn)在同一個函數(shù)體中或具有函數(shù)嵌套關系,則不同作用域的變量也各自代表不同的對象,程序執(zhí)行時按優(yōu)先級進行訪問。6.2.4變量的作用域在默認條件下,不屬于當前局部作用域的變量是只讀的,如果為其進行賦值操作,則Python認為在當前作用域中又聲明了一個新的同名局部變量。當內(nèi)部作用域中的變量需要修改全局作用域中的變量的值時,要在內(nèi)部作用域中使用關鍵字global對變量進行聲明。同理,當內(nèi)部作用域中的變量需要修改嵌套的父級函數(shù)的局部作用域中的變量的值時,要在內(nèi)部作用域中使用關鍵字nonlocal對變量進行聲明。6.2.4變量的作用域【例6-6】全局變量聲明測試。6.2.4變量的作用域03匿名函數(shù)PARTTHREE6.3匿名函數(shù)匿名函數(shù)就是沒有實際名稱的函數(shù)。Python使用lambda語句來創(chuàng)建匿名函數(shù),在lambda表達式中封裝簡單的邏輯,其主體僅是一個表達式而不需要使用代碼塊。匿名函數(shù)適合處理不再需要在其他位置復用代碼的函數(shù)邏輯,可以省去函數(shù)的定義過程且不用考慮函數(shù)的命名。語法格式如下:04高階函數(shù)PARTFOUR6.4高階函數(shù)Python是面向?qū)ο蟮?,對象名可以指向函?shù)。高階函數(shù)(higher-orderfunction)就是允許將函數(shù)對象的名稱作為參數(shù)傳入的函數(shù)。注意,這里對象名的類型是函數(shù),而不是字符串?!纠?-7】高階函數(shù)調(diào)用示例。6.4高階函數(shù)6.4.1map()函數(shù)map()函數(shù)是Python內(nèi)置的高階函數(shù),其表達式如下:6.4.1map()函數(shù)6.4.2filter()函數(shù)filter()函數(shù)也是Python內(nèi)置的高階函數(shù),其表達式與map()函數(shù)類似:filter(<函數(shù)>,<可迭代對象>}所不同的是,第一個參數(shù)<函數(shù)>必須返回True或False,其功能是不需要循環(huán)遍歷,將<可迭代對象>中的對應元素根據(jù)<函數(shù)>的返回值篩選后的結果組成新的可迭代對象。6.4.2filter()函數(shù)6.4.2reduce()函數(shù)reduce()函數(shù)是Python內(nèi)置functools包中的高階函數(shù),其表達式如下:

reduce(<函數(shù)>,<可迭代對象>)其功能是不需要循環(huán)遍歷,逐個對<可迭代對象>中的對應元素進行操作,返回最終結果。05遞歸PARTFIVE6.5

遞歸遞歸(recursion)是一種調(diào)用函數(shù)自身的算法,其實質(zhì)是把問題分解成規(guī)??s小的同類子問題,然后分治求解。遞歸屬于計算思維中的分治算法,將問題分而治之,通過解決子問題得到問題的解。能夠遞歸解決的問題,要求子問題的每個步驟具有相同的結構形式。假如要解決問題f(n),必先要解決f(n-1);而要解決f(n-1),又必先要解決f(n-2)……直到最先要解決的f(1)。遞歸的思路就是子問題解決了,再反復執(zhí)行等價方法解決問題。能夠設計成遞歸算法的問題必須滿足兩個條件:①能找到反復調(diào)用自身縮小問題規(guī)模的等價方法;②能找到結束反復執(zhí)行的邊界條件(遞歸出口)。設計遞歸函數(shù)的關鍵在于找到邊界條件和調(diào)用自身的等價方法。6.5

遞歸6.5

遞歸6.5

遞歸6.5

遞歸6.5

遞歸遞歸和循環(huán)方法都是重復、多次計算相同的問題。遞歸通常在函數(shù)內(nèi)部調(diào)用這個函數(shù)本身,當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸終止。而循環(huán)則通過設置初始值和終止條件,在一個范圍內(nèi)重復運算。通常,能夠用循環(huán)解決的問題,也可以用遞歸解決。解決同樣的問題,遞歸的代碼更簡潔清晰,可讀性更好,但遞歸的時間和空間資源消耗較大,深度較大的遞歸運算甚至會造成系統(tǒng)崩潰。而循環(huán)的優(yōu)點是運行效率高,運行時間只會因循環(huán)次數(shù)增加而增加,沒有其他資源消耗。6.5

遞歸【例6-11】例3-10用循環(huán)方法計算兀的近似值,也可以設計成用遞歸方法實現(xiàn)。輸入多項式的項數(shù),輸出π的近似值。公式如下:6.5

遞歸6.5

遞歸6.5

遞歸06函數(shù)的高級應用PARTSIX6.6.1生成器前面介紹過,使用列表解析語句可以創(chuàng)建列表,但如果這個列表中的元素很多,則會占用很多的內(nèi)存資源。如果程序僅需要訪問其中的幾個元素,則絕大多數(shù)元素所占用的空

間都被浪費了。生成器(generator)是能夠按照解析表達式逐次產(chǎn)生出數(shù)據(jù)集合中的數(shù)據(jù)項的函數(shù)。在Python中,利用生成器,可不必創(chuàng)建完整的數(shù)據(jù)集合,從而節(jié)省了存儲空間。生成器與普通函數(shù)的差別主要在于,生成器函數(shù)體中用關鍵字yield生成數(shù)據(jù)項,而不是用print()函數(shù)輸出數(shù)據(jù)項。生成器用循環(huán)遍歷時,可以用__next__()方法獲取yield生成的數(shù)據(jù)項(此處next的兩側分別為兩個半角下畫線)生成器與普通函數(shù)的執(zhí)行流程不同。普通函數(shù)是順序執(zhí)行的,遇到retum語句或最后一條語句就返回。而生成器在每次調(diào)用next__()方法的時候才會執(zhí)行,遇到y(tǒng)ield語句返回,再次執(zhí)行時不會從頭開始,而是從上次返回的yield語句處繼續(xù)執(zhí)行。6.6.1生成器運行結果:6.6.1生成器6.6.2裝飾器與閉包前面介紹高階函數(shù)時已提到,對象名可以指向函數(shù),函數(shù)對象名能夠作為參數(shù)傳入高階函數(shù)。這里進一步利用包裝函數(shù)的函數(shù)——裝飾器(decorator)——為已經(jīng)存在的函數(shù)增加功能。如果需要添加輸出原始數(shù)據(jù)的功能,則必須重寫return語句,并且會改變返回值的類型。對于已經(jīng)編寫完成的程序,改動一處可能會造成其他相關部分出錯。利用裝飾器,則

可以在不必改動原有函數(shù)的前提下增加功能。裝飾器經(jīng)常被用于事務處理、日志記錄、

權限驗證、調(diào)試測試等有需求的場景。6.6.2裝飾器與閉包在上述裝飾器decorator()的函數(shù)定義中,又定義了一個新函數(shù)new_f()來包裝傳入的函數(shù)f,用retumf(x,y)在不改變原調(diào)用結果的前提下,增加了輸出原始數(shù)據(jù)的功能。裝飾器的返回值是一個函數(shù)對象。調(diào)用裝飾器時,只需要在原函數(shù)定義前用“@”引導裝飾器即可。這種對原功能沒有影響,卻能方便程序員使用的語法稱為語法糖(syntacticsugar)。使用語法糖能夠增強程序的可讀性,減少代碼出錯的概率。6.6.2裝飾器與閉包【例6-14】利用裝飾器為前述add()函數(shù)添加輸出原始數(shù)據(jù)的功能并進行測試6.6.2裝飾器與閉包若調(diào)用某函數(shù)時,該函數(shù)將其內(nèi)部定義的函數(shù)作為返回值,則所返回的函數(shù)稱為閉包(closure)?;蛘哒f,如果在一個內(nèi)部函數(shù)里,對外部作用域中的變量(非全局變量)進行引用,這個內(nèi)部函數(shù)就是閉包。

溫馨提示

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

評論

0/150

提交評論