




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第六章
函數(shù)高等學(xué)校計(jì)算機(jī)類特別教材上海市高等學(xué)校信息技術(shù)水平考試參考教材Python程序設(shè)計(jì)基礎(chǔ)掌握函數(shù)的聲明與調(diào)用。理解并掌握函數(shù)的參數(shù)傳遞。理解變量的作用域。本章教學(xué)目標(biāo)
理解匿名函數(shù)的聲明和調(diào)用。了解函數(shù)的遞歸。了解生成器、裝飾器和閉包等函數(shù)的高級(jí)應(yīng)用。本章教學(xué)目標(biāo)01掌握函數(shù)的聲明與調(diào)用PARTONE6.1函數(shù)的定義與調(diào)用程序設(shè)計(jì)中,常需要將一些經(jīng)常重復(fù)使用的代碼定義為函數(shù),方便重復(fù)調(diào)用執(zhí)行,以提高程序的模塊化程度和代碼的重復(fù)利用率,這就是自定義函數(shù)。前面章節(jié)我們已經(jīng)使用過(guò)一些函數(shù),例如,最常用的輸出函數(shù)print(),以及導(dǎo)入math模塊后就可以使用的函數(shù)math.sin()等。它們作為內(nèi)置函數(shù),為Python的操作、運(yùn)算提供了豐富的功能。函數(shù)由函數(shù)名、形式參數(shù)列表和函數(shù)體組成。自定義函數(shù)用關(guān)鍵字def聲明,函數(shù)的命名原則與變量相同。函數(shù)體使用縮進(jìn)表示與函數(shù)的隸屬關(guān)系。與其他高級(jí)語(yǔ)言不同,Python定義函數(shù)時(shí)既不需要聲明其返回類型,也不需要聲明參數(shù)的傳入類型。函數(shù)定義格式如下:6.1函數(shù)的定義與調(diào)用定義函數(shù)時(shí),用來(lái)接收調(diào)用該函數(shù)時(shí)傳入的參數(shù)稱為形式參數(shù)(parameter),簡(jiǎn)稱形參。形參分為必選參數(shù)和可選(默認(rèn))參數(shù),必選參數(shù)在調(diào)用函數(shù)時(shí)必須傳遞。定義函數(shù)時(shí),可以同時(shí)給定默認(rèn)參數(shù)值。調(diào)用該函數(shù)時(shí),若有參數(shù)傳遞則使用傳遞的參數(shù),若沒(méi)有則使用默認(rèn)值。前面我們熟悉的函數(shù)print()中,end就是一個(gè)可選參數(shù),默認(rèn)為end-^n',表示打印完畢換行,也可在調(diào)用時(shí)傳遞參數(shù)end="使其打印完畢后不換行。定義函數(shù)時(shí),必選參數(shù)必須放在可選參數(shù)前面,否則會(huì)報(bào)錯(cuò)。6.1函數(shù)的定義與調(diào)用【例6-1】帶可選參數(shù)的函數(shù)調(diào)用示例。6.1函數(shù)的定義與調(diào)用函數(shù)在定義時(shí),即使沒(méi)有參數(shù)傳遞的需要,冒號(hào)前也必須要有空括號(hào)。函數(shù)可以沒(méi)有return語(yǔ)句、沒(méi)有返回值,即返回值為None。在程序設(shè)計(jì)時(shí)還可能先建立一個(gè)空函數(shù)作為占位函數(shù),其中的<執(zhí)行語(yǔ)句>僅為占位語(yǔ)句pass,待以后完善。例如:6.1函數(shù)的定義與調(diào)用調(diào)用自定義函數(shù)與前面我們調(diào)用Python內(nèi)置函數(shù)的方法相同,即在語(yǔ)句中直接使用函數(shù)名,并在函數(shù)名之后的圓括號(hào)中傳入?yún)?shù),多個(gè)參數(shù)之間以半角逗號(hào)開(kāi)。調(diào)用函數(shù)時(shí),實(shí)際傳遞給函數(shù)的參數(shù)稱為實(shí)際參數(shù)(argument),簡(jiǎn)稱實(shí)參。實(shí)參應(yīng)與形參的類型一致。即使不需要傳入實(shí)參,也要帶圓括號(hào),如print()。6.1函數(shù)的定義與調(diào)用02參數(shù)的傳遞PARTTWO6.2.1關(guān)鍵字參數(shù)和默認(rèn)參數(shù)關(guān)鍵字參數(shù)用形參名作為關(guān)鍵字來(lái)接收傳入的參數(shù)值。通過(guò)關(guān)鍵字參數(shù)給定函數(shù)實(shí)時(shí),不需要與形參的位置完全一致。定義函數(shù)時(shí),給定了默認(rèn)參數(shù)值的關(guān)鍵字參數(shù)稱為默認(rèn)參數(shù)。默認(rèn)參數(shù)既可以不傳遞
參數(shù)直接使用默認(rèn)值,也可以傳入新的實(shí)參替代默認(rèn)值。值得注意的是,定義函數(shù)時(shí),
默認(rèn)參數(shù)必須放在所有形參的最后。在調(diào)用函數(shù)時(shí),在函數(shù)名后的圓括號(hào)內(nèi)用“形參名=參數(shù)值”的方式傳入?yún)?shù),使用這Python程序設(shè)計(jì)基礎(chǔ)(第3版)
種方式不必按照定義函數(shù)時(shí)形參的原有順序。例如:6.1函數(shù)的定義與調(diào)用6.2.2位置參數(shù)調(diào)用函數(shù)時(shí),實(shí)參按照函數(shù)聲明時(shí)形參的先后順序依次傳遞,不必寫(xiě)出參數(shù)名。【例6-2】使用位置參數(shù)的函數(shù)調(diào)用示例。6.2.3可變參數(shù)所謂“可變”是指參數(shù)個(gè)數(shù)可變,可以用組合數(shù)據(jù)類型傳遞0至任意個(gè)參數(shù)。若在某個(gè)參數(shù)名前面加一個(gè)星號(hào)“*”,則表示該參數(shù)是一個(gè)元組類型的可變參數(shù)。在調(diào)用該函數(shù)時(shí),依次將必須賦值的位置參數(shù)賦值完畢后,繼續(xù)依次從調(diào)用時(shí)所提供的參數(shù)元組中接收元素值從而為可變參數(shù)賦值。如果在函數(shù)調(diào)用時(shí)沒(méi)有提供元組類型的可變參數(shù),則相當(dāng)于提供了一個(gè)空元組,即可變參數(shù)為0個(gè)?!纠?-3】帶元組類型可變參數(shù)的函數(shù)調(diào)用示例。
defprintse_series(d,*dtup):
print('必選參數(shù):',d)
print('元組類型可變參數(shù):',dtup)#不帶星號(hào)的實(shí)參整體作為元組對(duì)象
print('參數(shù)值依次為:’,*dtup)#帶星號(hào)的實(shí)參自動(dòng)解包依次傳遞參數(shù)6.2.3可變參數(shù)若在某個(gè)參數(shù)名前面加兩個(gè)星號(hào)“**”,則表示該參數(shù)是一個(gè)字典類型的可變參數(shù)。在調(diào)用該函數(shù)時(shí),以關(guān)鍵字參數(shù)方式傳遞參數(shù),即將字典的鍵作為關(guān)鍵字參數(shù)名,將字典的值作為參數(shù)值。6.2.3可變參數(shù)如果在函數(shù)調(diào)用時(shí)沒(méi)有提供字典類型的參數(shù),則相當(dāng)于提供了一個(gè)空字典,即可變參數(shù)為0個(gè)。6.2.3可變參數(shù)【例6-4】帶元組類型和字典類型可變參數(shù)的函數(shù)調(diào)用示例。6.2.3可變參數(shù)6.2.4變量的作用域變量的作用域是指在程序中能夠?qū)υ撟兞窟M(jìn)行讀寫(xiě)操作的范圍。根據(jù)作用域的不同,變量分為函數(shù)中定義的變量(local,簡(jiǎn)記為L(zhǎng))、嵌套中父級(jí)函數(shù)的局部作用域變量(enclosing,簡(jiǎn)記為E)、模塊級(jí)別定義的全局變量(global,簡(jiǎn)記為G)和內(nèi)置模塊中的變量(built-in,簡(jiǎn)記為B)。程序執(zhí)行對(duì)變量的搜索和讀寫(xiě)操作時(shí),優(yōu)先級(jí)由近及遠(yuǎn),即函數(shù)中定義的變量>嵌套中父級(jí)函數(shù)的局部作用域變量>模塊級(jí)別定義的全局變量>內(nèi)置模塊中的變量,也就是LEGB。Python允許出現(xiàn)同名變量。若具有相同命名標(biāo)識(shí)的變量出現(xiàn)在不同的函數(shù)體中,則各自代表不同的對(duì)象,既不相互干擾,也不能相互訪問(wèn);若具有相同命名標(biāo)識(shí)的變量出現(xiàn)在同一個(gè)函數(shù)體中或具有函數(shù)嵌套關(guān)系,則不同作用域的變量也各自代表不同的對(duì)象,程序執(zhí)行時(shí)按優(yōu)先級(jí)進(jìn)行訪問(wèn)。6.2.4變量的作用域在默認(rèn)條件下,不屬于當(dāng)前局部作用域的變量是只讀的,如果為其進(jìn)行賦值操作,則Python認(rèn)為在當(dāng)前作用域中又聲明了一個(gè)新的同名局部變量。當(dāng)內(nèi)部作用域中的變量需要修改全局作用域中的變量的值時(shí),要在內(nèi)部作用域中使用關(guān)鍵字global對(duì)變量進(jìn)行聲明。同理,當(dāng)內(nèi)部作用域中的變量需要修改嵌套的父級(jí)函數(shù)的局部作用域中的變量的值時(shí),要在內(nèi)部作用域中使用關(guān)鍵字nonlocal對(duì)變量進(jìn)行聲明。6.2.4變量的作用域【例6-6】全局變量聲明測(cè)試。6.2.4變量的作用域03匿名函數(shù)PARTTHREE6.3匿名函數(shù)匿名函數(shù)就是沒(méi)有實(shí)際名稱的函數(shù)。Python使用lambda語(yǔ)句來(lái)創(chuàng)建匿名函數(shù),在lambda表達(dá)式中封裝簡(jiǎn)單的邏輯,其主體僅是一個(gè)表達(dá)式而不需要使用代碼塊。匿名函數(shù)適合處理不再需要在其他位置復(fù)用代碼的函數(shù)邏輯,可以省去函數(shù)的定義過(guò)程且不用考慮函數(shù)的命名。語(yǔ)法格式如下:04高階函數(shù)PARTFOUR6.4高階函數(shù)Python是面向?qū)ο蟮?,?duì)象名可以指向函數(shù)。高階函數(shù)(higher-orderfunction)就是允許將函數(shù)對(duì)象的名稱作為參數(shù)傳入的函數(shù)。注意,這里對(duì)象名的類型是函數(shù),而不是字符串。【例6-7】高階函數(shù)調(diào)用示例。6.4高階函數(shù)6.4.1map()函數(shù)map()函數(shù)是Python內(nèi)置的高階函數(shù),其表達(dá)式如下:6.4.1map()函數(shù)6.4.2filter()函數(shù)filter()函數(shù)也是Python內(nèi)置的高階函數(shù),其表達(dá)式與map()函數(shù)類似:filter(<函數(shù)>,<可迭代對(duì)象>}所不同的是,第一個(gè)參數(shù)<函數(shù)>必須返回True或False,其功能是不需要循環(huán)遍歷,將<可迭代對(duì)象>中的對(duì)應(yīng)元素根據(jù)<函數(shù)>的返回值篩選后的結(jié)果組成新的可迭代對(duì)象。6.4.2filter()函數(shù)6.4.2reduce()函數(shù)reduce()函數(shù)是Python內(nèi)置functools包中的高階函數(shù),其表達(dá)式如下:
reduce(<函數(shù)>,<可迭代對(duì)象>)其功能是不需要循環(huán)遍歷,逐個(gè)對(duì)<可迭代對(duì)象>中的對(duì)應(yīng)元素進(jìn)行操作,返回最終結(jié)果。05遞歸PARTFIVE6.5
遞歸遞歸(recursion)是一種調(diào)用函數(shù)自身的算法,其實(shí)質(zhì)是把問(wèn)題分解成規(guī)??s小的同類子問(wèn)題,然后分治求解。遞歸屬于計(jì)算思維中的分治算法,將問(wèn)題分而治之,通過(guò)解決子問(wèn)題得到問(wèn)題的解。能夠遞歸解決的問(wèn)題,要求子問(wèn)題的每個(gè)步驟具有相同的結(jié)構(gòu)形式。假如要解決問(wèn)題f(n),必先要解決f(n-1);而要解決f(n-1),又必先要解決f(n-2)……直到最先要解決的f(1)。遞歸的思路就是子問(wèn)題解決了,再反復(fù)執(zhí)行等價(jià)方法解決問(wèn)題。能夠設(shè)計(jì)成遞歸算法的問(wèn)題必須滿足兩個(gè)條件:①能找到反復(fù)調(diào)用自身縮小問(wèn)題規(guī)模的等價(jià)方法;②能找到結(jié)束反復(fù)執(zhí)行的邊界條件(遞歸出口)。設(shè)計(jì)遞歸函數(shù)的關(guān)鍵在于找到邊界條件和調(diào)用自身的等價(jià)方法。6.5
遞歸6.5
遞歸6.5
遞歸6.5
遞歸6.5
遞歸遞歸和循環(huán)方法都是重復(fù)、多次計(jì)算相同的問(wèn)題。遞歸通常在函數(shù)內(nèi)部調(diào)用這個(gè)函數(shù)本身,當(dāng)邊界條件不滿足時(shí),遞歸前進(jìn);當(dāng)邊界條件滿足時(shí),遞歸終止。而循環(huán)則通過(guò)設(shè)置初始值和終止條件,在一個(gè)范圍內(nèi)重復(fù)運(yùn)算。通常,能夠用循環(huán)解決的問(wèn)題,也可以用遞歸解決。解決同樣的問(wèn)題,遞歸的代碼更簡(jiǎn)潔清晰,可讀性更好,但遞歸的時(shí)間和空間資源消耗較大,深度較大的遞歸運(yùn)算甚至?xí)斐上到y(tǒng)崩潰。而循環(huán)的優(yōu)點(diǎn)是運(yùn)行效率高,運(yùn)行時(shí)間只會(huì)因循環(huán)次數(shù)增加而增加,沒(méi)有其他資源消耗。6.5
遞歸【例6-11】例3-10用循環(huán)方法計(jì)算兀的近似值,也可以設(shè)計(jì)成用遞歸方法實(shí)現(xiàn)。輸入多項(xiàng)式的項(xiàng)數(shù),輸出π的近似值。公式如下:6.5
遞歸6.5
遞歸6.5
遞歸06函數(shù)的高級(jí)應(yīng)用PARTSIX6.6.1生成器前面介紹過(guò),使用列表解析語(yǔ)句可以創(chuàng)建列表,但如果這個(gè)列表中的元素很多,則會(huì)占用很多的內(nèi)存資源。如果程序僅需要訪問(wèn)其中的幾個(gè)元素,則絕大多數(shù)元素所占用的空
間都被浪費(fèi)了。生成器(generator)是能夠按照解析表達(dá)式逐次產(chǎn)生出數(shù)據(jù)集合中的數(shù)據(jù)項(xiàng)的函數(shù)。在Python中,利用生成器,可不必創(chuàng)建完整的數(shù)據(jù)集合,從而節(jié)省了存儲(chǔ)空間。生成器與普通函數(shù)的差別主要在于,生成器函數(shù)體中用關(guān)鍵字yield生成數(shù)據(jù)項(xiàng),而不是用print()函數(shù)輸出數(shù)據(jù)項(xiàng)。生成器用循環(huán)遍歷時(shí),可以用__next__()方法獲取yield生成的數(shù)據(jù)項(xiàng)(此處next的兩側(cè)分別為兩個(gè)半角下畫(huà)線)生成器與普通函數(shù)的執(zhí)行流程不同。普通函數(shù)是順序執(zhí)行的,遇到retum語(yǔ)句或最后一條語(yǔ)句就返回。而生成器在每次調(diào)用next__()方法的時(shí)候才會(huì)執(zhí)行,遇到y(tǒng)ield語(yǔ)句返回,再次執(zhí)行時(shí)不會(huì)從頭開(kāi)始,而是從上次返回的yield語(yǔ)句處繼續(xù)執(zhí)行。6.6.1生成器運(yùn)行結(jié)果:6.6.1生成器6.6.2裝飾器與閉包前面介紹高階函數(shù)時(shí)已提到,對(duì)象名可以指向函數(shù),函數(shù)對(duì)象名能夠作為參數(shù)傳入高階函數(shù)。這里進(jìn)一步利用包裝函數(shù)的函數(shù)——裝飾器(decorator)——為已經(jīng)存在的函數(shù)增加功能。如果需要添加輸出原始數(shù)據(jù)的功能,則必須重寫(xiě)return語(yǔ)句,并且會(huì)改變返回值的類型。對(duì)于已經(jīng)編寫(xiě)完成的程序,改動(dòng)一處可能會(huì)造成其他相關(guān)部分出錯(cuò)。利用裝飾器,則
可以在不必改動(dòng)原有函數(shù)的前提下增加功能。裝飾器經(jīng)常被用于事務(wù)處理、日志記錄、
權(quán)限驗(yàn)證、調(diào)試測(cè)試等有需求的場(chǎng)景。6.6.2裝飾器與閉包在上述裝飾器decorator()的函數(shù)定義中,又定義了一個(gè)新函數(shù)new_f()來(lái)包裝傳入的函數(shù)f,用retumf(x,y)在不改變?cè){(diào)用結(jié)果的前提下,增加了輸出原始數(shù)據(jù)的功能。裝飾器的返回值是一個(gè)函數(shù)對(duì)象。調(diào)用裝飾器時(shí),只需要在原函數(shù)定義前用“@”引導(dǎo)裝飾器即可。這種對(duì)原功能沒(méi)有影響,卻能方便程序員使用的語(yǔ)法稱為語(yǔ)法糖(syntacticsugar)。使用語(yǔ)法糖能夠增強(qiáng)程序的可讀性,減少代碼出錯(cuò)的概率。6.6.2裝飾器與閉包【例6-14】利用裝飾器為前述add()函數(shù)添加輸出原始數(shù)據(jù)的功能并進(jìn)行測(cè)試6.6.2裝飾器與閉包若調(diào)用某函數(shù)時(shí),該函數(shù)將其內(nèi)部定義的函數(shù)作為返回值,則所返回的函數(shù)稱為閉包(closure)?;蛘哒f(shuō),如果在一個(gè)內(nèi)部函數(shù)里,對(duì)外部作用域中的變量(非全局變量)進(jìn)行引用,這個(gè)內(nèi)部函數(shù)就是閉包。
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年河北省定州市輔警招聘考試試題題庫(kù)及答案詳解(奪冠)
- 2024年湖南安全技術(shù)職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)含答案
- 歷史●福建卷丨2022年福建省普通高中學(xué)業(yè)水平選擇性考試歷史試卷及答案
- 2025屆高考物理大一輪復(fù)習(xí)課件 第十五章 第82課時(shí) 熱力學(xué)定律與能量守恒定律
- DeepSeek人工智能大模型賦能數(shù)字醫(yī)療健康解決方案
- 數(shù)字糧倉(cāng)智慧糧庫(kù)與DeepSeek大模型融合方案
- 高三年級(jí)學(xué)期工作總結(jié)
- 消化內(nèi)科護(hù)理試題及答案
- 西式廚師試題及答案
- 河北省秦皇島市十中2024-2025學(xué)年下學(xué)期5月月考七年級(jí)數(shù)學(xué)試題(含部分答案)
- 巴蜀文化-知到答案、智慧樹(shù)答案
- 管材、管件包裝運(yùn)輸方案
- 《工程建設(shè)標(biāo)準(zhǔn)強(qiáng)制性條文電力工程部分2023年版》
- 鋰電池項(xiàng)目經(jīng)濟(jì)效益分析報(bào)告
- 工業(yè)污水處理廠項(xiàng)目經(jīng)濟(jì)效益和社會(huì)效益分析報(bào)告
- 2024供電營(yíng)業(yè)規(guī)則學(xué)習(xí)課件
- 老舍先生的成長(zhǎng)研究報(bào)告
- 臭氧發(fā)生器安全操作規(guī)程及維護(hù)保養(yǎng)
- 2024年上海市第二十七屆初中物理競(jìng)賽初賽試題及答案
- 赤峰紅山文化
- 第16課《看病用藥有學(xué)問(wèn)》 課件
評(píng)論
0/150
提交評(píng)論