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