中文字幕精品无码一区二区,成全视频在线播放观看方法,大伊人青草狠狠久久,亚洲一区影音先锋色资源

小學(xué)Python系列少兒編程課程《第5章 強大的函數(shù)積木》課件(共68張PPT)

資源下載
  1. 二一教育資源

小學(xué)Python系列少兒編程課程《第5章 強大的函數(shù)積木》課件(共68張PPT)

資源簡介

(共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.1
Python中定義函數(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型賦給time
print(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_min
score_min = min(chinese, math, english)
#使用max()函數(shù)計算最大值,并賦給score_max
score_max = max(chinese, math, english)
#計算總成績,并賦給score_total
score_total = chinese + math + english
#返回score_min、score_max和score_total
return 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ù),并將返回值賦給score
score = 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 = 10
print('函數(shù)內(nèi)a =', a)
a = 2
change(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.2
1.位置參數(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.2
1.位置參數(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.2
2.默認值參數(shù)
在定義函數(shù)時,可以為函數(shù)的參數(shù)設(shè)置默認值,此參數(shù)稱為默認值參數(shù)。在調(diào)用帶默認值參數(shù)的函數(shù)時,可以不用為默認值參數(shù)傳值,此時函數(shù)將會直接使用函數(shù)定義時設(shè)置的默認值,也可以通過顯式賦值來替換其默認值。定義帶有默認值參數(shù)函數(shù)的基本語法格式如下。
def 函數(shù)名(……,形參名=默認值):
函數(shù)體
參數(shù)類型
2.2
2.默認值參數(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.2
2.默認值參數(shù)
【運行結(jié)果】 程序運行結(jié)果如圖5-7所示。
圖5-7 例5-7程序運行結(jié)果
參數(shù)類型
2.2
2.默認值參數(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.2
2.默認值參數(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.2
2.默認值參數(shù)
【例5-9】 使用變量設(shè)置默認問候語。
【參考代碼】
s = 'hi!'
def greet(name, say=s):
print(name, say)
s = '你好!'
greet('小藍')
此外,如果在定義函數(shù)時某個參數(shù)的默認值為一個變量,那么參數(shù)的默認值只取決于函數(shù)定義時該變量的值。
參數(shù)類型
2.2
2.默認值參數(shù)
【運行結(jié)果】 程序運行結(jié)果如圖5-9所示。
圖5-9 例5-9程序運行結(jié)果
【程序說明】 函數(shù)的默認值參數(shù)只會初始化一次,即在函數(shù)定義時就確定值,所以,在定義函數(shù)greet()時,s的值為“hi!”,因此輸出為“小藍 hi!”。
參數(shù)類型
2.2
3.關(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.2
4.不定長參數(shù)
通常在定義一個函數(shù)時,若希望函數(shù)能夠處理比定義時更多的參數(shù),此時可在函數(shù)中使用“*”或“**”符號表示不定長參數(shù),其基本語法格式如下。
def 函數(shù)名([形參列表,] *args, **kwargs):
函數(shù)體
其中,“*args”和“**kwargs”為不定長參數(shù),“*”表示接收任意多個實參并將其放在一個元組中,“**”表示接收顯式賦值的多個實參并將其放入字典中,實參格式類似關(guān)鍵字參數(shù)。兩種形式可只使用其中一種或同時使用。
參數(shù)類型
2.2
4.不定長參數(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.2
4.不定長參數(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.1
Python允許函數(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 = 2
t = 1
while i <= k:
t *= i
i += 1
return t #返回階乘結(jié)果
函數(shù)的嵌套
3.1
【參考代碼】(續(xù))
def sum(n): #定義sum()函數(shù),計算累加
s = 0
i = 1
while i <= n:
s = s + fac(i) #調(diào)用fac()函數(shù)
i += 1
return s #返回累加結(jié)果
print('1!+2!+3!…10!=', sum(10)) #調(diào)用sum()函數(shù)
【運行結(jié)果】 程序運行結(jié)果如圖5-12所示。
圖5-12 例5-12程序運行結(jié)果
函數(shù)的遞歸
3.2
Python支持函數(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 1
elif n == 2:
return 1
else:
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)建全局變量num
def fun(): #定義fun()函數(shù)
num = 5 #創(chuàng)建局部變量num
print('函數(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.2
1. global關(guān)鍵字
【例5-15】 分析以下程序的運行結(jié)果。
【參考代碼】
num = 5 #創(chuàng)建全局變量num
def fun(): #定義fun()函數(shù)
global num #使用global關(guān)鍵字聲明num
num += 1 #num加1
print('函數(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.2
1. 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.2
2. nonlocal關(guān)鍵字
【例5-16】 分析以下程序的運行結(jié)果。
【參考代碼】
def outer():
num = 1
def inner():
nonlocal num #nonlocal關(guān)鍵字聲明變量
num = 2
print('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.2
2. 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ù)名賦給sum
sum = lambda arg1, arg2: arg1 + arg2
#調(diào)用sum()函數(shù),輸出返回值結(jié)果為30
print('兩數(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.1
import 模塊名 [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è)置別名為r
print(r.randint(1, 100)) #輸出1~100的隨機整數(shù),結(jié)果可能為20
模塊的導(dǎo)入
6.1
from 模塊名 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.0
from random import randint as r #給導(dǎo)入的randint()函數(shù)設(shè)置別名為r
print(r(1, 10)) #輸出1~10的隨機整數(shù),結(jié)果可能為7
模塊的導(dǎo)入
6.1
from 模塊名 import *
例如:
使用“*”符號可導(dǎo)入模塊中的所有內(nèi)容(包括函數(shù)和常量等),其基本語法格式如下。
3.導(dǎo)入模塊中所有內(nèi)容
from math import * #導(dǎo)入math模塊中的所有內(nèi)容
print(pi) #輸出常數(shù)π,結(jié)果為3.141592653589793
print(log2(8)) #計算并輸出以2為底的對數(shù)值,結(jié)果為3.0
print(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'] = num
newInfo['name'] = name
newInfo['sex'] = sex
stuInfos.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'] = num
newInfo['name'] = name
newInfo['sex'] = sex
stuInfos.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.py
main.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ù)覽

<pre id="tfb94"><li id="tfb94"></li></pre>

<bdo id="tfb94"><rt id="tfb94"></rt></bdo>
  • <menu id="tfb94"><dl id="tfb94"></dl></menu><i id="tfb94"><acronym id="tfb94"><sub id="tfb94"></sub></acronym></i>

    1. 主站蜘蛛池模板: 翁牛特旗| 岳阳市| 五莲县| 铜鼓县| 修水县| 马鞍山市| 冷水江市| 孝昌县| 沂南县| 微山县| 新乡市| 安远县| 建宁县| 建瓯市| 嵊泗县| 麦盖提县| 邵阳县| 前郭尔| 宝丰县| 当雄县| 鸡东县| 万宁市| 沐川县| 疏勒县| 阿图什市| 两当县| 淄博市| 淅川县| 胶南市| 黎川县| 进贤县| 咸宁市| 长海县| 肥东县| 酉阳| 长岛县| 广元市| 华宁县| 定州市| 阳新县| 泌阳县|