資源簡介 (共68張PPT)Python少兒編程第五章 強大的函數(shù)積木目錄1.1創(chuàng)建積木1.2靈活的積木參數(shù)1.3積木嵌套積木1.4我的地盤聽我的1.5隱藏名字的積木1.6積木盒子PART 01創(chuàng)建積木函數(shù)的定義1.1Python中定義函數(shù)的基本語法格式如下。其中,def是Python的關(guān)鍵字,用于定義函數(shù);函數(shù)名可以是任何有效的Python標識符;形式參數(shù)列表(簡稱形參)是調(diào)用該函數(shù)時傳遞給函數(shù)的參數(shù),可以是零個、一個或多個,當傳遞多個參數(shù)時各參數(shù)之間使用逗號隔開,[ ]表示可選內(nèi)容;函數(shù)體是每次調(diào)用函數(shù)執(zhí)行的代碼,由一行或多行語句組成。定義函數(shù)時須注意以下幾點。(1)當函數(shù)參數(shù)為零個時,也必須保留一對空的圓括號。(2)圓括號后面的冒號不能省略。(3)函數(shù)體相對于def關(guān)鍵字必須保持一定的空格縮進。def 函數(shù)名([形式參數(shù)列表]):函數(shù)體函數(shù)的調(diào)用1.2函數(shù)定義后,須調(diào)用函數(shù)才能執(zhí)行函數(shù)體,實現(xiàn)特定的功能。函數(shù)調(diào)用的基本語法格式如下。函數(shù)名([實際參數(shù)列表])其中,實際參數(shù)列表(簡稱實參)表示要傳遞給函數(shù)的具體值。【例5-1】 小藍的日常活動。【問題分析】 定義函數(shù)封裝日?;顒?,然后按作息時間調(diào)用函數(shù)。例如,定義eat()函數(shù),輸出“吃飯......”,定義school()函數(shù)輸出“上課......”等。函數(shù)的調(diào)用1.2【參考代碼】def eat(): #定義eat()函數(shù),表示吃飯print('吃飯......')def school(): #定義school()函數(shù),表示上課print('上課......')def homework(): #定義homework()函數(shù),表示做作業(yè)print('做作業(yè)......')def exercise(): #定義exercise()函數(shù),表示運動print('運動......')print('小藍的日常活動‘)函數(shù)的調(diào)用1.2【參考代碼】(續(xù))#按作息時間調(diào)用函數(shù)eat()school()eat()school()exercise()eat()homework()函數(shù)的調(diào)用1.2【運行結(jié)果】 程序運行結(jié)果如圖5-1所示。圖5-1 例5-1程序運行結(jié)果【程序說明】 由于函數(shù)只有在調(diào)用時才執(zhí)行,因此,前面定義函數(shù)的代碼不會直接執(zhí)行。當調(diào)用函數(shù)時,當前執(zhí)行暫停,轉(zhuǎn)去執(zhí)行函數(shù)體。當函數(shù)執(zhí)行完畢后,重新回到調(diào)用函數(shù)位置,繼續(xù)執(zhí)行后面的語句。函數(shù)的返回值1.3函數(shù)除了可以在函數(shù)體中直接輸出數(shù)據(jù),還可以返回一個或多個值,稱為函數(shù)的返回值。在Python中,函數(shù)使用return語句返回值。return語句用于退出函數(shù)并將程序返回到函數(shù)調(diào)用的位置繼續(xù)執(zhí)行,同時返回零個、一個或多個值。【例5-2】 根據(jù)時間判斷吃早飯、午飯還是晚飯。【問題分析】定義eat()函數(shù),參數(shù)為時間,根據(jù)時間范圍判斷吃早飯、午飯還是晚飯,返回字符串。函數(shù)的返回值1.3【參考代碼】def eat(time): #定義eat()函數(shù),參數(shù)為時間time#如果time在6點~8點,返回吃早飯if time >= 6 and time <= 8:return '{}點吃早飯......'.format(time)#如果time在11點~13點,返回吃午飯elif time >= 11 and time <= 13:return '{}點吃午飯......'.format(time)#如果time在17點~19點,返回吃晚飯elif time >= 17 and time <= 19:return '{}點吃晚飯......'.format(time)else: #不滿足上述條件,返回不在吃飯時間return '不在吃飯時間'time = int(input('請輸入時間:')) #輸入時間,并轉(zhuǎn)換為int型賦給timeprint(eat(time)) #調(diào)用eat()函數(shù),輸出返回值函數(shù)的返回值1.3【運行結(jié)果】 程序運行結(jié)果如圖5-2所示。圖5-2 例5-2程序運行結(jié)果如果函數(shù)沒有return語句,將默認以return None結(jié)束,即返回空值。函數(shù)也可使用return語句返回多個值,每個值之間使用逗號隔開。函數(shù)調(diào)用后,返回值以元組形式保存。函數(shù)的返回值1.3【例5-3】 計算小藍的最低成績、最高成績和總成績。【問題分析】 定義函數(shù)score_compute(),參數(shù)為小藍的各科成績,使用min()函數(shù)計算最小值,max()函數(shù)計算最大值,然后返回最小值、最大值及總成績。【參考代碼】#定義score_compute()函數(shù)def score_compute(chinese, math, english):#使用min()函數(shù)計算最小值,并賦給score_minscore_min = min(chinese, math, english)#使用max()函數(shù)計算最大值,并賦給score_maxscore_max = max(chinese, math, english)#計算總成績,并賦給score_totalscore_total = chinese + math + english#返回score_min、score_max和score_totalreturn score_min, score_max, score_total函數(shù)的返回值1.3【參考代碼】(續(xù))#輸入各科成績chinese = float(input('請輸入語文成績:'))math = float(input('請輸入數(shù)學(xué)成績:'))english = float(input('請輸入英語成績:'))#調(diào)用score_compute()函數(shù),并將返回值賦給scorescore = score_compute(chinese, math, english)print(score, type(score)) #輸出score及其類型print('小藍的最低成績?yōu)椋?, score[0],'\n小藍的最高成績?yōu)椋?, score[1],'\n小藍的總成績?yōu)椋?, score[2]) #輸出最低成績、最高成績和總成績函數(shù)的返回值1.3【運行結(jié)果】 程序運行結(jié)果如圖5-3所示。圖5-3 例5-3程序運行結(jié)果【程序說明】 本例題中return語句返回多個值,通過語句“print(score, type(score))”輸出變量score及其類型,可以看出,多個值以元組形式保存。因此,可以通過下標來訪問元組中的元素,從而分別得到最低成績、最高成績和總成績。PART 02靈活的積木參數(shù)實參和形參2.1定義函數(shù)時,圓括號內(nèi)的參數(shù)為形參;調(diào)用函數(shù)時,圓括號內(nèi)的參數(shù)為實參,根據(jù)參數(shù)的不同數(shù)據(jù)類型,將實參的值或引用傳遞給形參。在Python中,函數(shù)參數(shù)的數(shù)據(jù)類型可分為不可變數(shù)據(jù)類型(如整數(shù)、浮點數(shù)、字符串、元組等)和可變數(shù)據(jù)類型(如列表、字典、集合等)。實參和形參2.1【例5-4】 閱讀下面程序,分析輸出結(jié)果。【參考代碼】def change(a):a = 10print('函數(shù)內(nèi)a =', a)a = 2change(a)print('函數(shù)外a =', a)當參數(shù)數(shù)據(jù)類型為不可變數(shù)據(jù)類型時,在函數(shù)內(nèi)直接修改形參的值不會影響實參。實參和形參2.1【運行結(jié)果】 程序運行結(jié)果如圖5-4所示。圖5-4 例5-4程序運行結(jié)果【程序說明】 從運行結(jié)果可以看出,在函數(shù)內(nèi)修改了形參a的值,但是當函數(shù)運行結(jié)束后,實參a的值并沒有改變。實參和形參2.1【例5-5】 閱讀以下程序,分析輸出結(jié)果。【參考代碼】def change(mylist):mylist.append([1, 2, 3, 4])print('函數(shù)內(nèi)mylist = ', mylist)mylist = [10, 20, 30]print('調(diào)用函數(shù)前,函數(shù)外mylist = ', mylist)change(mylist)print('調(diào)用函數(shù)后,函數(shù)外mylist = ', mylist)但當參數(shù)數(shù)據(jù)類型為可變數(shù)據(jù)類型時,在函數(shù)內(nèi)使用下標或其他方式增加、刪除或修改元素時,實參也會相應(yīng)地修改。實參和形參2.1【運行結(jié)果】 程序運行結(jié)果如圖5-5所示。圖5-5 例5-5程序運行結(jié)果【程序說明】 從運行結(jié)果可以看出,在函數(shù)內(nèi)修改了形參mylist的元素,當函數(shù)運行結(jié)束以后,實參mylist的值也修改了。參數(shù)類型2.21.位置參數(shù)【例5-6】 定制問候語。對不同的人說不同的問候語。【參考代碼】def greet(name, say):print(name, say)greet('小藍', '你好!')greet('hello!', '小舞')greet('小明')位置參數(shù)是比較常用的形式,調(diào)用函數(shù)時,實參和形參的順序應(yīng)一致,且實參和形參的數(shù)量必須相同。【問題分析】 定義函數(shù)greet(name, say),其中,name表示人名,say表示問候語。參數(shù)類型2.21.位置參數(shù)【運行結(jié)果】 程序運行結(jié)果如圖5-6所示。圖5-6 例5-6程序運行結(jié)果【程序說明】 當?shù)谝淮握{(diào)用greet()函數(shù)時,將實參“小藍”和“你好!”分別傳遞給形參name和say,實現(xiàn)輸出。當?shù)诙握{(diào)用greet()函數(shù)時,將實參“hello!”和“小舞”分別傳遞給形參name和say,雖然也可以正常輸出,但實參和形參的含義不一致,將會影響數(shù)據(jù)的理解和使用,因此,位置參數(shù)的實參和形參的順序須一致。當?shù)谌握{(diào)用greet()函數(shù)時,實參和形參的數(shù)量不同,程序運行到該條語句時提示錯誤信息(缺少要求的位置參數(shù)say)。參數(shù)類型2.22.默認值參數(shù)在定義函數(shù)時,可以為函數(shù)的參數(shù)設(shè)置默認值,此參數(shù)稱為默認值參數(shù)。在調(diào)用帶默認值參數(shù)的函數(shù)時,可以不用為默認值參數(shù)傳值,此時函數(shù)將會直接使用函數(shù)定義時設(shè)置的默認值,也可以通過顯式賦值來替換其默認值。定義帶有默認值參數(shù)函數(shù)的基本語法格式如下。def 函數(shù)名(……,形參名=默認值):函數(shù)體參數(shù)類型2.22.默認值參數(shù)【例5-7】 使用不可變數(shù)據(jù)類型設(shè)置默認問候語。【參考代碼】def greet(name, say='hi!'): #設(shè)置默認問候語為“hi!”print(name, say)print(greet.__defaults__) #輸出函數(shù)默認值參數(shù)greet('小藍', '你好!')greet('小舞', 'hello!')greet('小紅')greet('小明')參數(shù)類型2.22.默認值參數(shù)【運行結(jié)果】 程序運行結(jié)果如圖5-7所示。圖5-7 例5-7程序運行結(jié)果參數(shù)類型2.22.默認值參數(shù)【例5-8】 使用可變數(shù)據(jù)類型設(shè)置默認問候語。【參考代碼】def greet(name, say=['hi!']): #使用列表設(shè)置默認問候語say.append('見到你很開心') #列表添加元素print(name, say)greet('小藍', ['你好!'])greet('小舞', ['hello!'])greet('小明')greet('小紅')多次調(diào)用函數(shù)且不為默認值參數(shù)傳遞值時,默認值參數(shù)只在定義時進行一次解釋和初始化,而對于列表、字典等可變數(shù)據(jù)類型的默認值參數(shù),可能會導(dǎo)致邏輯錯誤。因此,一般來說,要避免使用列表、字典、集合或其他可變數(shù)據(jù)類型作為函數(shù)參數(shù)的默認值。參數(shù)類型2.22.默認值參數(shù)【運行結(jié)果】 程序運行結(jié)果如圖5-8所示。圖5-8 例5-8程序運行結(jié)果【程序說明】 使用列表作為默認值參數(shù),且連續(xù)多次調(diào)用該函數(shù)而不給該參數(shù)傳值時,再次調(diào)用將保留上一次調(diào)用結(jié)果。因此,執(zhí)行語句“greet('小紅')”時,輸出的列表say中包含兩個“見到你很開心”,即在上一次調(diào)用結(jié)果的基礎(chǔ)上增加了同一元素。參數(shù)類型2.22.默認值參數(shù)【例5-9】 使用變量設(shè)置默認問候語。【參考代碼】s = 'hi!'def greet(name, say=s):print(name, say)s = '你好!'greet('小藍')此外,如果在定義函數(shù)時某個參數(shù)的默認值為一個變量,那么參數(shù)的默認值只取決于函數(shù)定義時該變量的值。參數(shù)類型2.22.默認值參數(shù)【運行結(jié)果】 程序運行結(jié)果如圖5-9所示。圖5-9 例5-9程序運行結(jié)果【程序說明】 函數(shù)的默認值參數(shù)只會初始化一次,即在函數(shù)定義時就確定值,所以,在定義函數(shù)greet()時,s的值為“hi!”,因此輸出為“小藍 hi!”。參數(shù)類型2.23.關(guān)鍵字參數(shù)【例5-10】 使用關(guān)鍵字參數(shù)設(shè)置問候語。【參考代碼】def greet(name, say):print(name, say)greet('你好!', '小藍')greet(say='hello!', name='小舞')關(guān)鍵字參數(shù)是指調(diào)用函數(shù)時按參數(shù)名傳遞值。使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時參數(shù)的順序與定義時不一致,Python解釋器能夠使用參數(shù)名匹配參數(shù)值。【運行結(jié)果】 程序運行結(jié)果如圖5-10所示。圖5-10 例5-10程序運行結(jié)果參數(shù)類型2.24.不定長參數(shù)通常在定義一個函數(shù)時,若希望函數(shù)能夠處理比定義時更多的參數(shù),此時可在函數(shù)中使用“*”或“**”符號表示不定長參數(shù),其基本語法格式如下。def 函數(shù)名([形參列表,] *args, **kwargs):函數(shù)體其中,“*args”和“**kwargs”為不定長參數(shù),“*”表示接收任意多個實參并將其放在一個元組中,“**”表示接收顯式賦值的多個實參并將其放入字典中,實參格式類似關(guān)鍵字參數(shù)。兩種形式可只使用其中一種或同時使用。參數(shù)類型2.24.不定長參數(shù)【例5-11】 使用不定長參數(shù)同時和多人說問候語。【參考代碼】def greet(say, *names, **name_say):print('say:', say)print('names:', names)print('name_say:', name_say)for name in names:print(name, say)for key in name_say.keys():print(key, name_say[key])greet('hi!', '小藍', '小舞', 小紅='你好!', 小明='hello!')參數(shù)類型2.24.不定長參數(shù)【運行結(jié)果】 程序運行結(jié)果如圖5-11所示。圖5-11 例5-11程序運行結(jié)果【程序說明】 在調(diào)用greet()函數(shù)時,傳入多個值,這些值會自左往右依次匹配函數(shù)定義時的參數(shù),首先將“hi!”傳遞給say,接著將“'小藍', '小舞'”組成一個元組,傳遞給names,最后將“小紅='你好!', 小明='hello!'”轉(zhuǎn)換為字典傳遞給name_say。PART 03積木嵌套積木函數(shù)的嵌套3.1Python允許函數(shù)的嵌套定義,即在函數(shù)內(nèi)可以再定義另外一個函數(shù)。例如,在fun1()函數(shù)中嵌套定義fun2()函數(shù),可以用下面代碼實現(xiàn)。def fun1(): #定義fun1()函數(shù)print('************')def fun2(): #嵌套定義fun2()函數(shù)print('Hello world!')fun2() #調(diào)用fun2()函數(shù)fun1() #調(diào)用fun1()函數(shù)這里需要注意的是,fun2()函數(shù)只在定義開始到fun1()函數(shù)結(jié)束范圍內(nèi)有效。Python還允許在一個函數(shù)中調(diào)用另外一個函數(shù),這就是函數(shù)的嵌套調(diào)用。例如,上述代碼中,在fun1()函數(shù)中嵌套調(diào)用fun2()函數(shù)。當然,函數(shù)也可以嵌套調(diào)用外部定義的另一個函數(shù)。函數(shù)的嵌套3.1【例5-12】 計算1!+2!+3!+…+10!的值并輸出。【問題分析】 使用函數(shù)的嵌套調(diào)用實現(xiàn),定義sum()函數(shù)計算累加,以及fac()函數(shù)計算階乘。執(zhí)行時首先調(diào)用sum()函數(shù),然后sum()函數(shù)中再調(diào)用fac()函數(shù)。【參考代碼】def fac(k): #定義fac()函數(shù),計算階乘i = 2t = 1while i <= k:t *= ii += 1return t #返回階乘結(jié)果函數(shù)的嵌套3.1【參考代碼】(續(xù))def sum(n): #定義sum()函數(shù),計算累加s = 0i = 1while i <= n:s = s + fac(i) #調(diào)用fac()函數(shù)i += 1return s #返回累加結(jié)果print('1!+2!+3!…10!=', sum(10)) #調(diào)用sum()函數(shù)【運行結(jié)果】 程序運行結(jié)果如圖5-12所示。圖5-12 例5-12程序運行結(jié)果函數(shù)的遞歸3.2Python支持函數(shù)的遞歸調(diào)用,它是一種函數(shù)嵌套調(diào)用的特殊形式,即函數(shù)直接或間接地調(diào)用其本身。直接遞歸調(diào)用是在函數(shù)中調(diào)用自身,例如:def fun(): #定義fun()函數(shù)fun() #調(diào)用fun()函數(shù)間接遞歸調(diào)用是在fun()函數(shù)中調(diào)用fun1()函數(shù),而fun1()函數(shù)又調(diào)用了fun()函數(shù),例如:def fun(): #定義fun()函數(shù)fun1() #調(diào)用fun1()函數(shù)def fun1(): #定義fun1()函數(shù)fun() #調(diào)用fun()函數(shù)函數(shù)的遞歸3.2【例5-13】 計算斐波那契數(shù)列的第n項。斐波那契數(shù)列從第3項開始,元素的值為前兩個元素相加得到,如1、1、2、3、5、8、13、21、34、55。【問題分析】 定義函數(shù)fib(n)計算數(shù)列的第n項,由題可知fib(n)=fib(n-1)+fib(n-2),因此可使用遞歸函數(shù)解決該問題。【參考代碼】def fib(n):if n == 1:return 1elif n == 2:return 1else:return fib(n - 1) + fib(n - 2)n = int(input('請輸入一個正整數(shù):'))print('斐波那契數(shù)列的第{}項為:{}'.format(n, fib(n)))函數(shù)的遞歸3.2【運行結(jié)果】 程序運行結(jié)果如圖5-13所示。圖5-13 例5-13程序運行結(jié)果【程序說明】 本例題中,n=1和n=2時都返回1,這就是該函數(shù)的終止條件。當n等于5時,該程序的執(zhí)行過程如圖5-14所示。圖5-14 計算斐波那契數(shù)列第5項的執(zhí)行過程PART 04我的地盤聽我的局部變量和全局變量4.1局部變量是定義在函數(shù)內(nèi)的變量,只能在變量定義開始到函數(shù)結(jié)束的范圍內(nèi)使用,它與函數(shù)外具有相同名稱的其他變量沒有任何關(guān)系。不同函數(shù)中,可以使用相同名稱的局部變量,它們代表不同的對象,互不干擾。此外,函數(shù)的形參也屬于局部變量,作用范圍僅限于函數(shù)內(nèi)部。在函數(shù)外定義的變量稱為全局變量,它在變量定義開始到整個程序結(jié)束的范圍內(nèi)有效。局部變量和全局變量4.1【例5-14】 分析下面程序的運行結(jié)果。【問題分析】 定義函數(shù)fib(n)計算數(shù)列的第n項,由題可知fib(n)=fib(n-1)+fib(n-2),因此可使用遞歸函數(shù)解決該問題。【參考代碼】num = 3 #創(chuàng)建全局變量numdef fun(): #定義fun()函數(shù)num = 5 #創(chuàng)建局部變量numprint('函數(shù)內(nèi)局部變量num的值:', num) #輸出局部變量num的值fun() #調(diào)用fun()函數(shù)print('函數(shù)外全局變量num的值:', num) #輸出全局變量num的值局部變量和全局變量4.1【運行結(jié)果】 程序運行結(jié)果如圖5-15所示。圖5-15 例5-14程序運行結(jié)果【程序說明】 在此程序中,定義了兩個名為num的變量。在函數(shù)內(nèi)的num變量為局部變量,調(diào)用函數(shù)后num的值為5,故函數(shù)內(nèi)的輸出為5;離開函數(shù)后,在函數(shù)內(nèi)定義的num變量失效,此時全局變量num有效,故函數(shù)外的輸出為3。global和nonlocal關(guān)鍵字4.2使用global關(guān)鍵字可分為以下兩種情況。(1)變量已在函數(shù)外創(chuàng)建,如果需要在函數(shù)內(nèi)使用或修改該變量,須在函數(shù)內(nèi)使用關(guān)鍵字global聲明該全局變量。(2)變量沒有在函數(shù)外創(chuàng)建,在函數(shù)內(nèi)直接使用global關(guān)鍵字聲明全局變量,然后賦值,調(diào)用該函數(shù)后,會創(chuàng)建新的全局變量,在函數(shù)外也可以使用或修改該變量。1. global關(guān)鍵字global和nonlocal關(guān)鍵字4.21. global關(guān)鍵字【例5-15】 分析以下程序的運行結(jié)果。【參考代碼】num = 5 #創(chuàng)建全局變量numdef fun(): #定義fun()函數(shù)global num #使用global關(guān)鍵字聲明numnum += 1 #num加1print('函數(shù)內(nèi)num的值:', num) #函數(shù)內(nèi)輸出num的值fun() #調(diào)用fun()函數(shù)print('函數(shù)外num的值:', num) #函數(shù)外輸出num的值【運行結(jié)果】 程序運行結(jié)果如圖5-16所示。圖5-16 例5-15程序運行結(jié)果global和nonlocal關(guān)鍵字4.21. global關(guān)鍵字【程序說明】 在fun()函數(shù)外創(chuàng)建全局變量num,然后在fun()函數(shù)內(nèi)使用global關(guān)鍵字聲明num,此時,函數(shù)內(nèi)的num就是函數(shù)外的全局變量num。因此,在函數(shù)內(nèi)num的初始值為5,執(zhí)行“num += 1”語句后,num的值為6,函數(shù)外的num值也為6。如果沒有“global num”這條語句,函數(shù)內(nèi)的num為局部變量,執(zhí)行“num += 1”這條語句前須對num賦值,否則,執(zhí)行程序時將提示“l(fā)ocal variable 'num' referenced before assignment”錯誤信息,即“在賦值前引用了局部變量num”,如圖5-17所示。圖5-17 錯誤信息global和nonlocal關(guān)鍵字4.22. nonlocal關(guān)鍵字【例5-16】 分析以下程序的運行結(jié)果。【參考代碼】def outer():num = 1def inner():nonlocal num #nonlocal關(guān)鍵字聲明變量num = 2print('inner函數(shù)中num的值:',num)inner()print('outer函數(shù)中num的值:',num)outer()【運行結(jié)果】 程序運行結(jié)果如圖5-18所示。圖5-18 例5-16程序運行結(jié)果global和nonlocal關(guān)鍵字4.22. nonlocal關(guān)鍵字【程序說明】 在inner()函數(shù)中使用了nonlocal關(guān)鍵字聲明num,即inner()函數(shù)中的num就是outer()函數(shù)中的num。因此,將num修改為2后,inner()函數(shù)和outer()函數(shù)中的輸出都是2。如果沒有“nonlocal num”這條語句,那么在inner()函數(shù)中的num就是局部變量,其值為2,在outer()函數(shù)中的num值為1,運行結(jié)果如圖5-19所示。圖5-19 沒有“nonlocal num”語句的運行結(jié)果PART 05隱藏名字的積木隱藏名字的積木5關(guān)鍵字lambda用于定義一種特殊的函數(shù)——匿名函數(shù),又稱lambda函數(shù)。匿名函數(shù)并非沒有名字,而是將函數(shù)名作為函數(shù)結(jié)果返回,其基本語法格式如下。函數(shù)名 = lambda [參數(shù)列表]:表達式簡單地說,lambda函數(shù)用于定義簡單的、能夠在一行內(nèi)表示的函數(shù),返回一個函數(shù)名。例如:#定義lambda函數(shù),用于計算兩個數(shù)的和,并將函數(shù)名賦給sumsum = lambda arg1, arg2: arg1 + arg2#調(diào)用sum()函數(shù),輸出返回值結(jié)果為30print('兩數(shù)相加后的值為:', sum(10, 20))lambda函數(shù)常用在臨時需要一個類似于函數(shù)的功能,但又不想定義函數(shù)的場合。例如,作為內(nèi)置函數(shù)sorted()和列表方法sort()的key參數(shù)。隱藏名字的積木5【例5-17】 將學(xué)生信息(包括學(xué)號、姓名和成績)按成績升序排序后輸出。【參考代碼】#定義學(xué)生信息列表,元素為字典stu = [{'num': '201801', 'name': '王五', 'score': 89},{'num': '201802', 'name': '劉軍', 'score': 95},{'num': '201803', 'name': '李夢', 'score': 85}]stu.sort(key=lambda x: x['score']) #按成績升序排序for s in stu:#輸出列表中的元素print('學(xué)號:',s['num'],'姓名:',s['name'],'成績:',s['score'])【問題分析】 首先使用字典存儲每個學(xué)生的信息,再用列表存儲多個學(xué)生信息。然后使用sort()方法對列表按學(xué)生成績進行升序排序,并使用lambda函數(shù)作為參數(shù)key的值。隱藏名字的積木5【運行結(jié)果】 程序運行結(jié)果如圖5-20所示。圖5-20 例5-17程序運行結(jié)果PART 06積木盒子模塊的導(dǎo)入6.1import 模塊名 [as 別名]使用這種方式導(dǎo)入模塊后,調(diào)用模塊中的函數(shù)時須在函數(shù)名前加上模塊名作為前綴,其語法格式如下。使用import關(guān)鍵字導(dǎo)入整個模塊的基本語法格式如下。1.導(dǎo)入整個模塊模塊名.函數(shù)名因為在多個模塊中,可能存在名稱相同的函數(shù),此時如果只通過函數(shù)名來進行調(diào)用,解釋器將無法知道到底要調(diào)用哪個函數(shù)。例如:print(math.sqrt(4)) #輸出4的開方,結(jié)果為2.0當模塊名很長時,可為導(dǎo)入的模塊設(shè)置別名,然后使用“別名.函數(shù)名”的方式調(diào)用函數(shù)。例如:import random as r #導(dǎo)入random模塊,并設(shè)置別名為rprint(r.randint(1, 100)) #輸出1~100的隨機整數(shù),結(jié)果可能為20模塊的導(dǎo)入6.1from 模塊名 import 函數(shù)名 [as 別名]使用這種方式僅導(dǎo)入明確指定的函數(shù),并且可以為導(dǎo)入的函數(shù)設(shè)置別名。這種導(dǎo)入方式可以減少查詢次數(shù),提高訪問速度,同時也可以減少代碼量。在調(diào)用函數(shù)時,不需要使用模塊名作為前綴。例如:當只需要用到模塊中的某個函數(shù)時,可只導(dǎo)入特定的函數(shù),其基本語法格式如下。2.導(dǎo)入特定的函數(shù)from math import sqrt #只導(dǎo)入math中的指定函數(shù)sqrt()print(sqrt(9)) #輸出9的開方,結(jié)果為3.0from random import randint as r #給導(dǎo)入的randint()函數(shù)設(shè)置別名為rprint(r(1, 10)) #輸出1~10的隨機整數(shù),結(jié)果可能為7模塊的導(dǎo)入6.1from 模塊名 import *例如:使用“*”符號可導(dǎo)入模塊中的所有內(nèi)容(包括函數(shù)和常量等),其基本語法格式如下。3.導(dǎo)入模塊中所有內(nèi)容from math import * #導(dǎo)入math模塊中的所有內(nèi)容print(pi) #輸出常數(shù)π,結(jié)果為3.141592653589793print(log2(8)) #計算并輸出以2為底的對數(shù)值,結(jié)果為3.0print(sqrt(16)) #計算并輸出16的開方,結(jié)果為4.0這種方式可以直接使用模塊中的所有函數(shù)而不需要再使用模塊名作為前綴。但一般并不推薦這樣使用,因為這樣做會降低代碼的可讀性,同時會導(dǎo)致命名空間的混亂。模塊的創(chuàng)建6.2每個Python文件都可以作為一個模塊,模塊名就是文件名。例如,現(xiàn)有一個文件“add.py”,其中定義了添加學(xué)生信息的函數(shù)addStuInfo(),代碼如下。#添加一個學(xué)生信息def addStuInfo(stuInfos):num = input('請輸入新學(xué)生的學(xué)號:') #提示并獲取學(xué)生的學(xué)號name = input('請輸入新學(xué)生的姓名:') #提示并獲取學(xué)生的姓名sex = input('請輸入新學(xué)生的性別(男/女):') #提示并獲取學(xué)生的性別newInfo = {} #定義字典#將學(xué)生信息保存在字典中newInfo['num'] = numnewInfo['name'] = namenewInfo['sex'] = sexstuInfos.append(newInfo) #將字典添加到列表中模塊的創(chuàng)建6.2【例5-18】 調(diào)用上述add模塊中的addStuInfo()函數(shù),添加3個學(xué)生信息并輸出。【參考代碼】import add #導(dǎo)入add模塊stuInfos = [] #創(chuàng)建空列表for i in range(3): #循環(huán)3次add.addStuInfo(stuInfos) #調(diào)用addStuInfo()函數(shù),添加學(xué)生信息for info in stuInfos: #遍歷列表print(info) #輸出列表的元素模塊的創(chuàng)建6.2【運行結(jié)果】 程序運行結(jié)果如圖5-21所示。圖5-21 例5-18程序運行結(jié)果__name__屬性6.3在實際開發(fā)過程中,開發(fā)人員為了測試模塊的效果,會自行在模塊中添加測試信息。例如,在“add.py”文件中添加測試代碼如下。#添加一個學(xué)生信息def addStuInfo(stuInfos):num = input('請輸入新學(xué)生的學(xué)號:') #提示并獲取學(xué)生的學(xué)號name = input('請輸入新學(xué)生的姓名:') #提示并獲取學(xué)生的姓名sex = input('請輸入新學(xué)生的性別(男/女):') #提示并獲取學(xué)生的性別newInfo = {} #定義字典__name__屬性6.3此時,如果在其他程序中導(dǎo)入此模塊,測試代碼會在導(dǎo)入時自動運行。重新運行例5-18程序,運行結(jié)果如圖5-22所示。#將學(xué)生信息保存在字典中newInfo['num'] = numnewInfo['name'] = namenewInfo['sex'] = sexstuInfos.append(newInfo) #將字典添加到列表中#測試代碼stuInfos = [] #創(chuàng)建空列表addStuInfo(stuInfos) #調(diào)用addStuInfo()函數(shù)print('測試信息', stuInfos) #輸出測試信息__name__屬性6.3圖5-22 “add.py”文件中添加測試代碼后例5-18程序運行結(jié)果__name__屬性6.3【程序說明】 從上述結(jié)果可以看出,“add.py”中的測試代碼也運行了。但這并不合理,測試代碼應(yīng)只在單獨執(zhí)行“add.py”文件時執(zhí)行,而不應(yīng)在其他文件中作為模塊導(dǎo)入時執(zhí)行。為解決這個問題,Python提供了一個__name__屬性。通過__name__屬性可以識別程序的使用方式:當作為模塊導(dǎo)入時,則其__name__屬性的值被自動設(shè)置為模塊名;如果作為程序直接運行,則其__name__屬性被自動設(shè)置為字符串“__main__”。因此,如果想要在模塊被導(dǎo)入時,模塊中的某一代碼塊不執(zhí)行,可以通過判斷__name__屬性的值來實現(xiàn)。例如,如果將“add.py”作為程序直接運行時,執(zhí)行測試代碼,而“add.py”作為模塊導(dǎo)入時,不執(zhí)行測試代碼,可將“add.py”文件中的測試代碼修改如下。#測試代碼if __name__ == '__main__': #識別當前的運行方式stuInfos = [] #創(chuàng)建空列表addStuInfo(stuInfos) #調(diào)用addStuInfo()函數(shù)print('測試信息', stuInfos) #輸出測試信息__name__屬性6.3再次運行例5-18程序,可以看到“add.py”文件中的測試代碼沒有執(zhí)行,程序運行結(jié)果如圖5-23所示。圖5-23 “add.py”文件中添加__name__屬性后例5-18程序運行結(jié)果包6.4為了更好地組織模塊,通常會將多個模塊放在一個目錄中,該目錄稱為包。且該目錄下必須存在__init__.py文件(文件內(nèi)容可以為空)。例如,有下面包結(jié)構(gòu)。package_1|—— __init__.py|—— module_1.py|—— module_2.py|—— module_3.pymain.py包6.4此時,如果“main.py”想要調(diào)用package_1包中模塊module_1中的fun()函數(shù),可以用下面代碼實現(xiàn)。import package_1.module_1 #導(dǎo)入模塊package_1.module_1.fun() #調(diào)用函數(shù)也可以用下面代碼實現(xiàn)。from package_1 import module_1 #導(dǎo)入模塊module_1.fun() #調(diào)用函數(shù)感謝觀看 展開更多...... 收起↑ 資源預(yù)覽 縮略圖、資源來源于二一教育資源庫