摘要:默認參數(shù)的坑默認參數(shù)的默認值指向的必需時不變對象。舉一個例說明當函數(shù)的默認參數(shù)默認為一個可變對象時,會出現(xiàn)什么狀況。例如調(diào)用函數(shù)輸出結(jié)果當然,如果已經(jīng)又一個對象,也可以在傳入時的名前輸入,會自動將拆分成關鍵字參數(shù)。
函數(shù)就像是一個黑盒子,我們將相關的一些功能打包成一個函數(shù),后續(xù)再調(diào)用的時候,我們不再關心內(nèi)部如何實現(xiàn),而是只關心這個函數(shù)需要輸入(Input)什么,需要輸出(Output)什么。 其中函數(shù)的輸入就是參數(shù),輸出就是Return。
Python支持的參數(shù)有四種類型:
必選參數(shù)
默認參數(shù)
可變參數(shù)
關鍵字參數(shù)
下面我們來一一介紹一下。
必選參數(shù)就是調(diào)用一個函數(shù)時,必須輸入的參數(shù)。
例如我們定義一個函數(shù)
def my_sum(x,y): return x+y
此時,my_sum函數(shù)的x,y參數(shù)就是必選參數(shù),在調(diào)用該函數(shù)時候必須輸入,不可以省略。
默認參數(shù)默認參數(shù)是指在調(diào)用函數(shù)時可選擇性的輸入或者不輸入。不輸入時,則參數(shù)為默認值。例如我們定義一個用于打印學生信息的函數(shù)。學生的信息包括姓名、年齡、生源。這些學生大多數(shù)來自浙江省,那么這個函數(shù)可以這么定義:
def print_info(name,age=20,province="Zhejiang"): print name,age,province
對于大多數(shù)浙江的學生且年齡都是20,我們只需要這么調(diào)用函數(shù)即可:print_info("Lilei")。此時我們并沒有輸入province參數(shù),函數(shù)默認為年齡20,生源為Zhejiang。
對于少數(shù)來自外省的學生,且年齡不為20的學生,我們可以這么按順序排列默認參數(shù),即先年齡,后生源,順序與函數(shù)定義的時候一致:
print_info("Lucy",21,"Jiangsu")。此時province就修改成Jiangsu了。
如果需要跳過某個默認參數(shù)或則不按順序傳入默認參數(shù),我們則需要寫上參數(shù)名。例如:print_info("Tom",province="Hebei")。
使用默認參數(shù)可以大大降低函數(shù)調(diào)用的復雜性。例如對于有很多參數(shù)的函數(shù),某些參數(shù)在實際業(yè)務中經(jīng)常變化,有些參數(shù)缺較少變化。我們可以將這些參數(shù)按其在實際業(yè)務中的變化頻率從高到底排列,并對變化頻率低的參數(shù)設為默認參數(shù)。實際調(diào)用時,我們只需要傳入必要的參數(shù)值即可。這樣我們可以實現(xiàn)只定義一個函數(shù)卻能滿足多種情境。
默認參數(shù)的坑默認參數(shù)的默認值指向的必需時不變對象。
舉一個例說明當函數(shù)的默認參數(shù)默認為一個可變對象時,會出現(xiàn)什么狀況。
def add_item(items=[]): items.append("apple") return items
我們想要實現(xiàn)的功能是,調(diào)用該函數(shù),會對傳入的list最后添加一個apple元素。若 `items`參數(shù)未傳入,則默認是一個空list。
當我們第一次調(diào)用add_item()函數(shù)時,返回["apple"],沒什么錯誤。
但我們再一次調(diào)用add_item()函數(shù)時,卻返回了`["apple","apple"]。這與我們預期的不相符合。因為我們第二次調(diào)用也未傳入任何參數(shù)。
其原因是add_item()函數(shù)的默認參數(shù)在函數(shù)定義的時候就已經(jīng)在內(nèi)存生成。第一次、第二次的默認參數(shù)指向的是同一個list對象。其一次調(diào)用函數(shù)對該list對象的修改會影響后一次函數(shù)的調(diào)用。
可變參數(shù)在實際情況下,我們經(jīng)常會碰到某函數(shù)的參數(shù)個數(shù)不一定的情況。例如我們想要寫一個計算幾個數(shù)字的平方和的函數(shù)。
當然我們可以預先將這些數(shù)字組裝成一個list或者tuple再傳入函數(shù)。代碼如下:
# 定義函數(shù) def quadratic_sum(numbers): sum = 0 for number in numbers: sum = sum + number return sum # 先將數(shù)字組成一個list ns = [1,3,2,6,2] # 將list傳入函數(shù) quadratic_sum(ns)
在Python中,我們可以直接定義一個有可變參數(shù)的函數(shù),我們無需預先組裝一個list或者tuple,而直接傳入函數(shù)??勺儏?shù)的表示方法是在參數(shù)名前加一個*。
傳入的可變參數(shù)會被Python組裝成一個tuple,tuple名即為函數(shù)定義的可變參數(shù)名。
# 定義一個有可變參數(shù)的函數(shù) def quadratic_sum(*numbers): sum = 0 for number in numbers: sum = sum + number return sum # 直接調(diào)用函數(shù),無需預先組裝成一個list或者tuple。 quadratic_sum(1,3,2,6,2)
此時我們已經(jīng)有了一個支持可變參數(shù)的函數(shù),但是我們現(xiàn)在又有一個list比如[1,3,2,6,2]。我們還需要把這個list一個拆成一個數(shù)字傳入函數(shù)嗎?顯然這么做不科學。
Python提供了一個簡單的解決方案。我們只需要在傳入的list名前加一個*,Python就會幫我們把這個list或tuple拆成可變參數(shù)傳入。例如:
ns = [1,2,3,54,2] quadratic_sum(*ns)關鍵字參數(shù)
關鍵字參數(shù)于可變參數(shù)類似。關鍵字參數(shù)可以將傳入的參數(shù)組裝成一個字典Dict。
定義一個關鍵字參數(shù)的方法就是在關鍵字參數(shù)前寫**。例如
def user_info(name,age,**kw): print "Name:",name,"Age:",age,"Keyword:",kw # 調(diào)用函數(shù) user_info("Charlie",20,gender="male",city="Hangzhou")
輸出結(jié)果:
Name: Chalrie Age: 20 Keyword: {"gender": "male", "city": "Hanzhou"}
當然,如果已經(jīng)又一個dict對象,也可以在傳入時的dict名前輸入**,Python會自動將Dict拆分成關鍵字參數(shù)。
keyword = {"gender": "male", "city": "Hanzhou"} user_info("charlie",20,**keyword)參數(shù)組合
Python函數(shù)的參數(shù)可以是上述四種參數(shù)的任意組合,但是其順序必須是必選參數(shù)、默認參數(shù)、可變參數(shù)、關鍵字參數(shù)。Python會根據(jù)這個順序進行匹配。例如我們定義一個函數(shù):
def func(name,age=20,gender="female",*args,**kw): print "age:",age print "name:",name print args print kw
上面這個函數(shù),name是必選參數(shù)。調(diào)用該函數(shù)時若沒有傳入name參數(shù),則會報錯。
age,gender是默認函數(shù)。可以傳入也可以不傳入。不傳入則是默認值。
其余無關鍵字的參數(shù)會被組裝成一個叫argstuple。
其余有關鍵字的參數(shù)會被組裝成一個叫kw的dict。
例如:
func("Charlie",gender="male",2,3,4,city="hangzhou",province="Zhejiang")
關于更多參數(shù)類型的內(nèi)容,可以閱讀一篇文章:
http://www.qiangtaoli.com/boo...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44249.html
摘要:調(diào)用函數(shù)時常見的錯誤函數(shù)參數(shù)個數(shù)不正確會給我們返回,并給出確切的錯誤信息。例如將變量名指向這個取整函數(shù)調(diào)用函數(shù),即調(diào)用這個取整數(shù)的函數(shù) python有許多內(nèi)置的函數(shù)(Build-in Functions)例如abs()——求絕對值的函數(shù)供我們使用。那么我們?nèi)绾握{(diào)用這些函數(shù)呢?直接書寫函數(shù)名帶括號并在括號內(nèi)傳入?yún)?shù)即可。例如abs(-10.2)即可。python內(nèi)置的函數(shù)可以到https...
摘要:一等函數(shù)在中,函數(shù)是一等對象。匿名函數(shù)關鍵字在表達式內(nèi)創(chuàng)建匿名函數(shù)然而,簡單的句法限制了函數(shù)的定義體只能使用純表達式,即函數(shù)的定義體中不能賦值,不能使用等語句。匿名函數(shù)適合用于作為函數(shù)的參數(shù) 一等函數(shù) 在python中,函數(shù)是一等對象。編程語言理論家把一等對象定義為滿足以下條件的程序?qū)嶓w: 在運行時創(chuàng)建 能賦值給變量或數(shù)據(jù)結(jié)構(gòu)中的元素 能作為參數(shù)傳給函數(shù) 能作為函數(shù)的返回結(jié)果 在p...
摘要:空函數(shù)如果想要定義一個什么都不做的函數(shù),那么可以用語句。為函數(shù)添加參數(shù)檢查我們對作一些改寫。此時調(diào)用函數(shù)時傳入錯誤的參數(shù)則會拋出。函數(shù)返回多個值支持返回多個值。 python中定義函數(shù)的關鍵詞是def,例如定義一個叫my_function的函數(shù)我們可以這么定義, 其中括號內(nèi)的x,y為傳入的參數(shù)。 def my_function(): # function body 返回值 函數(shù)...
摘要:會依次將中的數(shù)據(jù)傳遞到中,根據(jù)返回的或者,留下或者拋棄這個值。而對于字符串,則是根據(jù)字符串對應的碼表進行排序。同時也是一個高階函數(shù),可以實現(xiàn)自定義的排序方式。 map/reduce是一種編程思想,在各個領域都有它的實踐。網(wǎng)上有一個簡單的例子解釋map/reduce。比如說你需要數(shù)一下某一個圖書館中有多少本藏書。最傻瓜的做法就是排一個人從頭數(shù)到尾。這樣速度慢,低效。另一種方法就是先將圖書...
摘要:返回該函數(shù)的時候,攜帶了該內(nèi)部函數(shù)引用的外部函數(shù)參數(shù)和局部變量。每次返回的函數(shù)都是不同的對象的結(jié)果為內(nèi)部函數(shù)本身被返回時,所攜帶的參數(shù)或局部變量時那一刻的值例如在函數(shù)內(nèi)有循環(huán),內(nèi)部函數(shù)引用的循環(huán)變量。 內(nèi)部函數(shù) Python可以在函數(shù)內(nèi)部再定義一個函數(shù)。這個定義的內(nèi)部函數(shù)可以引用外部函數(shù)的參數(shù)和局部變量。事實上,內(nèi)部函數(shù)還可以在其中再定義內(nèi)部函數(shù),實現(xiàn)內(nèi)部函數(shù)多重嵌套。例如: def ...
閱讀 1975·2023-04-25 15:45
閱讀 1214·2021-09-29 09:34
閱讀 2504·2021-09-03 10:30
閱讀 2009·2019-08-30 15:56
閱讀 1466·2019-08-29 15:31
閱讀 1273·2019-08-29 15:29
閱讀 3204·2019-08-29 11:24
閱讀 3061·2019-08-26 13:45