函數(shù)主要分為三個(gè)部分,函數(shù)名沾谜、參數(shù)和代碼塊。函數(shù)名沒什么可講的胀莹,只要起一個(gè)通俗易懂的名稱就行了基跑。今天,將重點(diǎn)介紹參數(shù)和代碼塊的內(nèi)容描焰。
def 函數(shù)名(參數(shù)):
代碼塊
參數(shù)傳遞
參數(shù)的作用是提供函數(shù)實(shí)現(xiàn)功能所必備的數(shù)據(jù)媳否。參數(shù)根據(jù)傳遞方式的不同,分為:必備參數(shù)栈顷、關(guān)鍵字參數(shù)、默認(rèn)參數(shù)嵌巷、不定長(zhǎng)參數(shù)[1]萄凤。
必備參數(shù)
它在參數(shù)傳遞時(shí)有兩個(gè)要求:數(shù)量相同,順序一致搪哪。任何一個(gè)條件不滿足就會(huì)出錯(cuò)靡努。
def calculate_healthy_index(height, weight):
index = weight/height**2
if index < 18.5:
return "偏瘦"
elif index < 24 and index >= 18.5:
return "正常"
elif index < 27 and index >= 24:
return "偏胖"
elif index >= 27:
return "肥胖"
調(diào)用函數(shù)calculate_healthy_index時(shí),它的兩個(gè)參數(shù)一個(gè)不能少晓折,并且順序也不能顛倒惑朦。當(dāng)參數(shù)的個(gè)數(shù)缺少時(shí)會(huì)出現(xiàn)TypeError,提示缺少參數(shù)漓概;當(dāng)順序顛倒時(shí)漾月,函數(shù)的工作異常,甚至不能工作胃珍。
# 身高的單位是m梁肿,體重的單位是kg
>>> calculate_healthy_index(1.8, 75)
正常
# 必備參數(shù)缺失,函數(shù)不能工作
>>> calculate_healthy_index(1.8)
TypeError: calculate_healthy_index() missing 1
required positional argument: 'weight'
# 必備參數(shù)觅彰,順序顛倒吩蔑,函數(shù)工作異常
>>> calculate_healthy_index(75, 1.8)
偏瘦
關(guān)鍵字參數(shù)
在傳遞參數(shù)時(shí)需要給出參數(shù)名稱。由于參數(shù)可以通過關(guān)鍵字匹配到填抬,它對(duì)參數(shù)傳遞只有一個(gè)要求:數(shù)量相同烛芬。
>>> # 關(guān)鍵字參數(shù),順序可以顛倒
>>> calculate_healthy_index(weight=75, height=1.8)
正常
默認(rèn)參數(shù)
對(duì)于默認(rèn)參數(shù)而言,是否傳遞都沒有太大的影響赘娄,因?yàn)樗幸粋€(gè)默認(rèn)值仆潮。
# height和weight都有默認(rèn)值
def calculate_healthy_index(height=1.8, weight=75):
index = weight/height**2
if index < 18.5:
return "偏瘦"
elif index < 24 and index >= 18.5:
return "正常"
elif index < 27 and index >= 24:
return "偏胖"
elif index >= 27:
return "肥胖"
>>> calculate_healthy_index()
正常
此時(shí)的函數(shù)calculate_healthy_index()
有了兩個(gè)默認(rèn)參數(shù)height
和weight
,兩者的默認(rèn)值分別是1.8和75擅憔。直接調(diào)用calculate_healthy_index()
也不會(huì)出錯(cuò)鸵闪,返回值是“正常”暑诸。
不定長(zhǎng)參數(shù)
不定長(zhǎng)參數(shù)分為*args
和**kwargs
兩種蚌讼。*args
可以看作一個(gè)不定長(zhǎng)度的列表,**kwargs
可以看作一個(gè)不定長(zhǎng)度的字典个榕。下面僅舉一個(gè)簡(jiǎn)單的例子篡石,感興趣的同學(xué)可以查閱相關(guān)資料。
def add(*args):
total = 0
for index in args:
total = total + index
return total
>>> add(1,2,3,4,5,6,7,8,9,10)
55
>>> add(224, 375, 678, 491)
1768
上面的例子中西采,不能使用列表傳遞參數(shù)凰萨,因?yàn)榱斜肀豢醋饕粋€(gè)參數(shù)。
如何實(shí)現(xiàn)多個(gè)返回值
上期我們講到械馆,不管函數(shù)中有多少個(gè)return語句胖眷,return語句都只能執(zhí)行一次。顯然霹崎,如果我們想讓函數(shù)有多個(gè)返回值珊搀,用多個(gè)return語句的方法是行不通的。
實(shí)際上尾菇,我們可以換個(gè)思路境析,既然不能多次,能不能靠一個(gè)返回值來達(dá)成目的呢派诬?答案是可以的劳淆,用列表、元組或者字典默赂。
返回字典
# 獲得一串?dāng)?shù)字的平均數(shù)和總數(shù)
def evaluate(numbers):
total = 0
for i in numbers:
total = total + i
avg = total/len(numbers)
# 返回一個(gè)字典沛鸵,推薦使用,因?yàn)榭梢苑庋b成json數(shù)據(jù)缆八,用于傳輸
out = {"average":avg, "total":total}
return out
>>> numbers = [77, 65, 83, 94, 88, 91, 72]
>>> evaluate(numbers)
{'average': 81.42857142857143, 'total': 570}
返回元組
# 獲得一串?dāng)?shù)字的平均數(shù)和總數(shù)
def evaluate(numbers):
total = 0
for i in numbers:
total = total + i
avg = total/len(numbers)
# 返回一個(gè)元組
return avg, total
>>> numbers = [77, 65, 83, 94, 88, 91, 72]
>>> evaluate(numbers)
(81.42857142857143, 570)
匿名函數(shù)
前面講過谒臼,函數(shù)主要由三個(gè)部分組成,函數(shù)名耀里,參數(shù)和表達(dá)式蜈缤。匿名函數(shù),顧名思義冯挎,就是缺少了函數(shù)名的函數(shù)底哥。實(shí)際上咙鞍,函數(shù)名就是一個(gè)標(biāo)記,真正發(fā)揮函數(shù)功能的是參數(shù)和表達(dá)式趾徽。
匿名函數(shù)的標(biāo)記是lambda续滋,lambda后面接函數(shù)的參數(shù),各個(gè)參數(shù)之間用逗號(hào)隔開孵奶。和一般的函數(shù)相比疲酌,匿名函數(shù)沒有代碼塊,只有一個(gè)表達(dá)式了袁,所以功能上較弱朗恳。表達(dá)式的結(jié)果就是匿名函數(shù)的返回值[2]。
# 基本形式
lambda 參數(shù): 表達(dá)式
# 該函數(shù)接受以一個(gè)人名载绿,返回hello
>>> fun = lambda person: print("Hello, %s!" % person)
>>> fun("jack")
Hello, jack!
# 該函數(shù)接受兩個(gè)參數(shù)粥诫,兩者之和或兩個(gè)的連接
>>> fun = lambda x, y: x + y
>>> fun(2,3)
5
在python中,函數(shù)也可以賦值給一個(gè)變量崭庸。至此怀浆,我們知道:可以賦值給變量的有:數(shù)字、字符串怕享、列表执赡、元組、字典函筋、函數(shù)沙合。
匿名函數(shù)涉及到了函數(shù)式編程。python雖然支持函數(shù)式編程驻呐,但并不是強(qiáng)項(xiàng)灌诅。流行的函數(shù)式編程語言有haskell芳来,scala等含末。
總結(jié)
- 函數(shù)參數(shù)的傳遞有以下幾種:必備參數(shù)、關(guān)鍵字參數(shù)即舌、默認(rèn)參數(shù)佣盒、不定長(zhǎng)參數(shù)
- 推薦使用字典來返回多個(gè)值,有利于封裝為json數(shù)據(jù)傳輸
- 匿名函數(shù)比較精煉顽聂,一行就包含了函數(shù)的所有要素
思考
# 1.編寫一個(gè)函數(shù)肥惭,實(shí)現(xiàn)將輸入的若干個(gè)參數(shù)翻倍,
# 倍數(shù)由第一個(gè)參數(shù)決定紊搪,結(jié)果作為列表輸出
# 例如蜜葱,輸入 2,1,2,3,4,5,耀石,則輸出[2,4,6,8,10]
# 2.嘗試用匿名函數(shù)實(shí)現(xiàn)上述功能
# 提示:需要用到列表推導(dǎo)式
# 翻倍函數(shù)
def convert(times, *args):
output = []
for i in args:
output = output + [i]*times
return output
# 匿名翻倍函數(shù)
lambda times, *args : [i*times for i in args]
列表推導(dǎo)式:用一個(gè)表達(dá)式來處理列表中的數(shù)據(jù)牵囤,生成一個(gè)新的列表[3]。一般形式為:
[表達(dá)式 for 變量 in 列表]
。舉個(gè)例子:list_a = [1,2,3,4]
揭鳞,可以利用列表推導(dǎo)式生成list_b
炕贵。推導(dǎo)如下:list_b = [i-1 for i in list_a]
,生成的list_b
就是[0,1,2,3]
野崇。
參考資料
- Python函數(shù)中定義參數(shù)的四種方式 原文鏈接:http://www.jb51.net/article/58010.htm
- python 匿名函數(shù) 原文鏈接:http://www.cnblogs.com/ghgyj/p/3997549.html
- Python的列表推導(dǎo)式 原文鏈接:http://www.cnblogs.com/yupeng/p/3428556.html
掃一掃這個(gè)二維碼称开,關(guān)注公眾號(hào):聰哥python,獲取最新python3基礎(chǔ)教程