第9關(guān) 函數(shù)
課程目標(biāo)
- 了解函數(shù)的作用
- 熟練掌握函數(shù)的參數(shù)類型以及參數(shù)傳遞
- 掌握函數(shù)的返回值及return語(yǔ)句的運(yùn)用
- 了解全局變量和局部變量,以及將局部變量轉(zhuǎn)換為全局變量的方法
課程難點(diǎn)
- 函數(shù)中參數(shù)的傳遞順序
- 函數(shù)的返回值及return語(yǔ)句的運(yùn)用
課程重要內(nèi)容重現(xiàn)
一、函數(shù)
函數(shù)是組織好的、可以重復(fù)使用的、用來(lái)實(shí)現(xiàn)單一功能的代碼。寫(xiě)為:函數(shù)名(參數(shù)名),注:括號(hào)內(nèi)可以為空,也可以為多個(gè)參數(shù),多個(gè)參數(shù)間用逗號(hào)隔開(kāi)即可。
- 參數(shù)
函數(shù)中需要使用的變量,數(shù)量視情況而定。
1)位置參數(shù)
位置參數(shù)是描述總體最常用的一種參數(shù)。參數(shù)的順序和個(gè)數(shù)要和函數(shù)定義中一致。例如:
def menu(appetizer,course):
print('一份開(kāi)胃菜:'+appetizer)
print('一份主食:'+course)
menu('話梅花生','牛肉拉面')
#'話梅花生'和'牛肉拉面'是對(duì)應(yīng)參數(shù)appetizer和course的位置順序傳遞的,所以被叫作【位置參數(shù)】
2)默認(rèn)參數(shù)
默認(rèn)參數(shù)必須放在位置參數(shù)之后。若調(diào)用函數(shù)時(shí)沒(méi)有傳遞參數(shù)就為默認(rèn)值,但如果調(diào)用時(shí)向默認(rèn)參數(shù)傳遞了數(shù)據(jù),則默認(rèn)參數(shù)被新參數(shù)代替。
def menu(appetizer,course,dessert='綠豆沙'):
print('一份開(kāi)胃菜:'+appetizer)
print('一份主食:'+course)
print('一份甜品:'+dessert)
menu('話梅花生','牛肉拉面')
#結(jié)果顯示為:因?yàn)檎{(diào)用時(shí)只給了兩個(gè)參數(shù),第三個(gè)參數(shù)為默認(rèn)值
#一份開(kāi)胃菜:話梅花生
#一份主食:牛肉拉面
#一份甜品:綠豆沙
menu('話梅花生','牛肉拉面','銀耳羹')
#結(jié)果顯示為:因?yàn)檎{(diào)用時(shí)給了三個(gè)參數(shù),第三個(gè)參數(shù)被更新
#一份開(kāi)胃菜:話梅花生
#一份主食:牛肉拉面
#一份甜品:銀耳羹
3)不定長(zhǎng)參數(shù)
一個(gè)星號(hào)*加上參數(shù)名。當(dāng)傳入此處的參數(shù)數(shù)量不確定時(shí)使用,數(shù)據(jù)類型為元組(元組(tuple):寫(xiě)法是把數(shù)據(jù)放在小括號(hào)()中,它的用法和列表用法類似,主要區(qū)別在于列表中的元素可以隨時(shí)修改,但元組中的元素不可更改。列表一樣,元組是可迭代對(duì)象,這意味著我們可以用for循環(huán)來(lái)遍歷它)。
- 當(dāng)默認(rèn)參數(shù)在不定長(zhǎng)參數(shù)后時(shí),若想更改默認(rèn)參數(shù),需要注明dessert='銀耳羹',例如:
def menu(appetizer,course,*barbeque,dessert='綠豆沙'):
print('一份開(kāi)胃菜:'+appetizer)
print('一份主菜:'+course)
print('一份甜品:'+dessert)
for i in barbeque:
print('一份烤串:'+i)
menu('話梅花生','牛肉拉面','烤雞翅','烤茄子','烤玉米',dessert='銀耳羹')
#結(jié)果顯示為:
#一分開(kāi)胃菜:話梅花生
#一份主菜:牛肉拉面
#一份甜品:銀耳羹
#一份烤串:烤雞翅
#一份烤串:烤茄子
#一份烤串:烤玉米
- 當(dāng)默認(rèn)參數(shù)在不定長(zhǎng)參數(shù)之前,則默認(rèn)按順序傳遞參數(shù)(默認(rèn)參數(shù)會(huì)改變),剩下的參數(shù)均傳遞給不定長(zhǎng)參數(shù)。
def menu(appetizer,course,dessert='綠豆沙',*barbeque):
print('一份開(kāi)胃菜:'+appetizer)
print('一份主菜:'+course)
print('一份甜品:'+dessert)
for i in barbeque:
print('一份烤串:'+i)
menu('話梅花生','牛肉拉面','銀耳羹','烤雞翅','烤茄子','烤玉米')
#結(jié)果顯示為:
#一分開(kāi)胃菜:話梅花生
#一份主菜:牛肉拉面
#一份甜品:銀耳羹
#一份烤串:烤雞翅
#一份烤串:烤茄子
#一份烤串:烤玉米
- 定義函數(shù)
語(yǔ)法:
def 函數(shù)名(參數(shù)1,參數(shù)2,...參數(shù)n):
函數(shù)體
return 語(yǔ)句
函數(shù)內(nèi)部一旦遇到return語(yǔ)句,就會(huì)停止執(zhí)行并返回結(jié)果。沒(méi)有return語(yǔ)句的函數(shù),Python也會(huì)在末尾隱性地加上return None,即返回None值(return None可以簡(jiǎn)寫(xiě)為return。)
- 調(diào)用函數(shù)
1)語(yǔ)法:函數(shù)名(參數(shù))
參數(shù)從0個(gè)到多個(gè)都可以實(shí)現(xiàn)。但當(dāng)參數(shù)個(gè)數(shù)為0時(shí),括號(hào)也不能省略。
2)math(10)的意思是將整數(shù)10賦值給參數(shù)x并運(yùn)行該函數(shù)。函數(shù)執(zhí)行完畢后最終返回了y的值即110,然后將這個(gè)結(jié)果賦值給變量a,再用print()將變量a打印出來(lái)。
def math(x):
y = x ** 2 + x
return y
a = math(10)
print(a)
3)也可以只用一行代碼print(math(10))來(lái)表示同樣的意思。
二、return語(yǔ)句
- return是返回值,當(dāng)輸入?yún)?shù)給函數(shù),函數(shù)就會(huì)返回一個(gè)值,事實(shí)上每個(gè)函數(shù)都會(huì)有返回值。
- 如果不是立即要對(duì)函數(shù)返回值做操作,可以用return語(yǔ)句保留返回值。
需要多次調(diào)用函數(shù)時(shí),可以定義一個(gè)主函數(shù)main(),調(diào)用非主函數(shù)的返回值。下面例子中的傳參:main()函數(shù)中的李若彤→dream_face(位置參數(shù))→face()函數(shù)的參數(shù)name,最終返回name + '的臉蛋'即李若彤的臉蛋。
def face(name):
return name + '的臉蛋'
def body(name):
return name + '的身材'
def main(dream_face,dream_body):
return '我的夢(mèng)中情人:' + face(dream_face) + ' + ' + body(dream_body)
print(main('李若彤','林志玲'))
- 若需要返回多個(gè)值,在return后用逗號(hào)隔開(kāi)即可,此時(shí)返回的是一個(gè)元組。元組與列表其實(shí)都是數(shù)據(jù)的“序列”,元組取某個(gè)位置的值的操作,與列表是一模一樣的,即元組名[i]。
def lover(name1,name2):
face = name1 + '的臉蛋'
body = name2 + '的身材'
return face,body
a=lover('李若彤','林志玲')
#此時(shí)return的值為元組 ('李若彤的臉蛋', '林志玲的身材'),并賦值給變量 a 。
print('我的夢(mèng)中情人:'+a[0]+' + '+a[1])
- 沒(méi)有return語(yǔ)句的函數(shù)會(huì)默認(rèn)返回None值。
- 一旦函數(shù)內(nèi)部遇到return語(yǔ)句,就會(huì)停止執(zhí)行并返回結(jié)果。
三、變量的作用域
- 局部變量
在函數(shù)內(nèi)定義的變量,僅能在函數(shù)內(nèi)部使用(局部作用域)
- 全局變量
所有函數(shù)之外賦值的變量,可以在程序的任何位置使用(全局作用域)
- 局部變量和全局變量不要取相同的名字,以免混淆。
- global語(yǔ)句:可以將局部變量轉(zhuǎn)換為全局變量,一般寫(xiě)在函數(shù)體的第一行。
def egg():
global quantity
#global語(yǔ)句將變量quantity聲明為全局變量
quantity = 108
egg()
print(quantity)
四、函數(shù)的嵌套
sum = rent + cost() 的結(jié)果就是sum = rent + variable_cost(cost()函數(shù)的返回值)。最后調(diào)用函數(shù)時(shí),也只需調(diào)用sum_cost()即可。
rent = 3000
def cost():
utilities = int(input('請(qǐng)輸入本月的水電費(fèi)用'))
food_cost = int(input('請(qǐng)輸入本月的食材費(fèi)用'))
variable_cost = utilities + food_cost
print('本月的變動(dòng)成本是' + str(variable_cost))
return variable_cost
def sum_cost():
sum = rent + cost()#調(diào)用函數(shù)
print('本月的總成本是' + str(sum))
sum_cost()
五、其他
- list()函數(shù)
可以將數(shù)據(jù)轉(zhuǎn)換為列表。
- extend()函數(shù)
- append() ,方法用于在列表末尾添加新的對(duì)象,只能添加一個(gè)值(多個(gè)值作為一個(gè)整體也行)。
- extend() 函數(shù)用于在列表末尾一次性追加另一個(gè)序列中的多個(gè)值(用新列表擴(kuò)展原來(lái)的列表)如果extend的是字符串,則字符串會(huì)被拆分成字符數(shù)組,如果extend的是字典,則字典的key會(huì)被加入到ist中。
list1=[1,2]
list2=[2,4,5]
list3=[]
list2.append(list1)
print(list2)
#結(jié)果顯示為:
#[2,4,5,[1,2]] list1的元素作為一個(gè)列表整體被加入list2
list3.extend(list1)
print(list3)
#結(jié)果顯示
#[1,2] list1的元素獨(dú)立加入list3中
- (拓展一下下,感興趣可以查一查哦~)*reversed()函數(shù)
reversed()函數(shù)可以將數(shù)據(jù)反轉(zhuǎn),從后往前迭代。
reversed()之后,第二次for循環(huán)、list()、tuple()以及join()得到的結(jié)果都為空,原因就是b不是反轉(zhuǎn)列表本身,而是一個(gè)列表反向迭代器,所以直接輸出函數(shù)返回值會(huì)是類似于亂碼,且reversed()之后,只在第一次遍歷時(shí)返回值。
#參數(shù)是列表1:
a=[1,2,3,4,5]
b=reversed(a)
print(a)
#結(jié)果顯示為:
#[1, 2, 3, 4, 5]
print(b)
#結(jié)果顯示為:
#<listreverseiterator object at 0x06A9E930>
for i in b:#第一次遍歷
print(i)
#結(jié)果顯示為:
#5 4 3 2 1
for i in b:#第二次遍歷為空
print(i)
#結(jié)果顯示為:啥也沒(méi)有
#參數(shù)是列表2:
a=[1,2,3,4,5]
b=reversed(a)
print(list(b))#第一次轉(zhuǎn)換為列表
#結(jié)果顯示為:
#[5,4,3,2,1]
print(list(b))#第二次
#結(jié)果顯示為:
#[]
#參數(shù)是元組
t=(4,5,6)
tt=reversed(t)
print(t)
#結(jié)果顯示為:
#(4, 5, 6)
print(tt)
#結(jié)果顯示為:
#<reversed object at 0x06A07E50>
print(tuple(tt))
#第一次轉(zhuǎn)換為元組
#結(jié)果顯示為
#(6, 5, 4)
print(tuple(tt))
#第二次為空
#結(jié)果顯示為
#()
#參數(shù)是字符串
s='cba'
ss=reversed(s)
print(s)
#結(jié)果顯示為
#'cba'
print(ss)
#結(jié)果顯示為
#<reversed object at 0x06A07E70>
print(list(ss))#第一次轉(zhuǎn)換為列表
#結(jié)果顯示為
#['a', 'b', 'c']
print(list(ss))#第二次為空
#結(jié)果顯示為
#[]