python入門:你所不知道的函數(shù)特性

函數(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ù)heightweight,兩者的默認(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é)

  1. 函數(shù)參數(shù)的傳遞有以下幾種:必備參數(shù)、關(guān)鍵字參數(shù)即舌、默認(rèn)參數(shù)佣盒、不定長(zhǎng)參數(shù)
  2. 推薦使用字典來返回多個(gè)值,有利于封裝為json數(shù)據(jù)傳輸
  3. 匿名函數(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]野崇。

參考資料

  1. Python函數(shù)中定義參數(shù)的四種方式 原文鏈接:http://www.jb51.net/article/58010.htm
  2. python 匿名函數(shù) 原文鏈接:http://www.cnblogs.com/ghgyj/p/3997549.html
  3. Python的列表推導(dǎo)式 原文鏈接:http://www.cnblogs.com/yupeng/p/3428556.html

掃一掃這個(gè)二維碼称开,關(guān)注公眾號(hào):聰哥python,獲取最新python3基礎(chǔ)教程

聰哥python

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乓梨,一起剝皮案震驚了整個(gè)濱河市鳖轰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌督禽,老刑警劉巖脆霎,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異狈惫,居然都是意外死亡睛蛛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門胧谈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忆肾,“玉大人,你說我怎么就攤上這事菱肖】透裕” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵稳强,是天一觀的道長(zhǎng)场仲。 經(jīng)常有香客問我,道長(zhǎng)退疫,這世上最難降的妖魔是什么渠缕? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮褒繁,結(jié)果婚禮上亦鳞,老公的妹妹穿的比我還像新娘。我一直安慰自己棒坏,他們只是感情好燕差,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坝冕,像睡著了一般徒探。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喂窟,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天测暗,我揣著相機(jī)與錄音吵血,去河邊找鬼。 笑死偷溺,一個(gè)胖子當(dāng)著我的面吹牛蹋辅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挫掏,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼侦另,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了尉共?” 一聲冷哼從身側(cè)響起褒傅,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袄友,沒想到半個(gè)月后殿托,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剧蚣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年支竹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸠按。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡礼搁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出目尖,到底是詐尸還是另有隱情馒吴,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布瑟曲,位于F島的核電站饮戳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏洞拨。R本人自食惡果不足惜扯罐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扣甲。 院中可真熱鬧篮赢,春花似錦齿椅、人聲如沸琉挖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽示辈。三九已至,卻和暖如春遣蚀,著一層夾襖步出監(jiān)牢的瞬間矾麻,已是汗流浹背纱耻。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留险耀,地道東北人弄喘。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像甩牺,于是被迫代替她去往敵國(guó)和親蘑志。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容