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