摘要:調(diào)用函數(shù)時,必須傳入且傳入的兩個值按照位置順序依次賦給參數(shù)和,若缺省,則會報錯。例如二默認參數(shù)在函數(shù)定義中,為參數(shù)預先定義默認值。執(zhí)行相當于調(diào)用如果要求的四次方,則需要執(zhí)行設置默認參數(shù)的好處默認參數(shù)可以簡化函數(shù)的調(diào)用,降低調(diào)用函數(shù)的難度。
題外話:因為時間關系,沒能保持一定的更新頻率。但還是會一直堅持的~
之前介紹了Python函數(shù)的定義,今天分享一下Python函數(shù)的參數(shù)吧!內(nèi)容會有點多~
Python的函數(shù)定義比較簡單,借助于關鍵字def進行實現(xiàn),但是參數(shù)的靈活度卻非常大。除了正常定義的必選參數(shù)外,還可以使用默認參數(shù)、可變參數(shù)、關鍵字參數(shù)、命名關鍵字參數(shù)以及參數(shù)組合,這使得函數(shù)定義出來的接口,不僅能處理復雜的參數(shù),還能簡化調(diào)用者的代碼。
在函數(shù)定義的時候,指定參數(shù)的位置順序。位置參數(shù)必須在被調(diào)用函數(shù)定義中的準確順序來進行傳遞。
例如:計算x的n次方
def powern(x,n): s = 1 while n >0: s = s * x n = n -1 return s
x與n這兩個參數(shù)都是位置參數(shù)。調(diào)用函數(shù)時,必須傳入且傳入的兩個值按照位置順序依次賦給參數(shù)x和n,若缺省,則會報錯。例如:
>>> powern(5) Traceback (most recent call last): File "二、默認參數(shù)", line 1, in TypeError: powern() missing 1 required positional argument: "n"
在函數(shù)定義中,為參數(shù)預先定義默認值。當在函數(shù)調(diào)用時,若沒有為參數(shù)提供指定值,則使用默認值。
例如:仍舊是求x的n次方,但是默認為x的3次方。
def powern( x,n = 3): s = 1 while n >0: s = s * x n = n -1 return s
執(zhí)行:powern(2),相當于調(diào)用powern(2,3)
如果要求2的四次方,則需要執(zhí)行:powern(2,4)
設置默認參數(shù)的好處?
默認參數(shù)可以簡化函數(shù)的調(diào)用,降低調(diào)用函數(shù)的難度。無論是簡單調(diào)用還是復雜調(diào)用,函數(shù)只需定義一個。
例如上述powern()的例子,當傳入n的其他值時,則可以實現(xiàn)x的其他n次方。
但是在使用默認參數(shù)的時候,如果使用不當,也會有坑。先來了解一下可變參數(shù)和不可變參數(shù)作為函數(shù)參數(shù)時的不同:
不可變參數(shù)作為函數(shù)參數(shù)
>>> a = 1 >>> def func(a): ... print("func_id:",id(a)) ... a = 2 ... print("after_func_id:",id(a),"id(2):",id(2)) ... >>> print("out_of_func_id:",id(a),"id(1):",id(1)) out_of_func_id: 501962480 id(1): 501962480 # 全局變量a的id >>> func(a) # 將全局參數(shù)a傳入函數(shù) func_id: 501962480 # a=1 的id after_func_id: 501962496 id(2): 501962496 >>> print(a) # 退出函數(shù),a的值仍為1 1
當把全局a傳遞給函數(shù)后,函數(shù)自動復制一份引用。執(zhí)行完a=2之后,id(a)的內(nèi)存地址發(fā)生變化。但是跟外層的a沒有關系。
可變對象作為函數(shù)參數(shù)
>>> a = [] >>> def func2(a): ... print("func2_id:",id(a)) ... a.append(1) ... >>> print("out_of_func2_id",id(a)) out_of_func2_id 59694296 >>> func2(a) func2_id: 59694296 >>> print(a) [1]
變量a的類型為list,是可變對象。函數(shù)的引用指向的是可變對象,地址沒有發(fā)生變化,所以函數(shù)操作后,a的內(nèi)容發(fā)生了改變。
所以當再次操作func2(a)函數(shù)時,產(chǎn)生跟預期不一樣的結果:
>>> func2(a) func2_id: 59694296 # a地址不變 >>> print(a) [1, 1] # 因為第一次執(zhí)行func2(a)時,已經(jīng)修改了a=[1],再次調(diào)用時,在[1]里新增
使用可變對象作為默認參數(shù)
例如:
def add_end( L=[] ): # 設置為一個list變量L(對象可變) L.append("end") return L >>> add_end( ) ["end"] >>> add_end() ["end", "end"]
當連續(xù)重復使用默認參數(shù)調(diào)用時,結果出現(xiàn)錯誤。
Python函數(shù)在定義的時候,默認參數(shù)L的值就被計算出來了,即[]。L也是一個變量,它指向對象[],每次調(diào)用該函數(shù),如果改變了L的內(nèi)容,則下次調(diào)用時,默認參數(shù)的內(nèi)容就變了,不再是函數(shù)定義時的[]了。
可以改為:
def add_end( L=None ): # L為不變對象 if L is None: L = [] L.append("end") return L
則無論調(diào)用多少次,都不會出現(xiàn)問題。
所以,定義默認參數(shù)要牢記一點:默認參數(shù)必須指向不變對象!因為不變對象一旦創(chuàng)建,對象內(nèi)部的數(shù)據(jù)就不能修改,這樣就減少了由于修改數(shù)據(jù)導致的錯誤。此外,由于對象不變,多任務環(huán)境下同時讀取對象不需要加鎖。
設置默認參數(shù)時,有幾點需要注意
一.必選參數(shù)在前,默認參數(shù)在后,否則Python的解釋器會報錯。
二.如何設置默認參數(shù)?當函數(shù)有多個參數(shù)時,把變化大的參數(shù)放前面,變化小的參數(shù)放后面。變化小的參數(shù)就可以作為默認參數(shù)。
三.不要使用可變對象作為默認參數(shù)。
可變參數(shù),即傳入的參數(shù)個數(shù)是可變的,0至任意個。
因為參數(shù)個數(shù)不確定,則可以使用一個list 或者tuple傳進來。之后在函數(shù)調(diào)用時會自動組裝為一個tuple。
例如:
def calc(numbers): # 變量 sum = 0 for n in numbers: sum = sum + n * n return sum >>> calc( [1,2,3] ) # 傳入的是一個list 14
利用可變參數(shù) *args:
def calc( *numbers ): sum = 0 for n in numbers: # 在函數(shù)內(nèi)部,numbers組裝成一個tuple sum = sum + n * n return sum >>> calc( ) # 0個參數(shù) 0 >>> calc( 1,3,5,7 ) # 多個參數(shù) 84 >>> num = [1,2,3] # list >>> calc( *num ) # *list –> tuple 14 >>> t = (1,3,5) >>> calc( t ) # tuple(錯誤) Traceback (most recent call last): File "", line 1, in File " ", line 4, in calc TypeError: can"t multiply sequence by non-int of type "tuple" >>> calc( *t ) 35
函數(shù)代碼完全不變。但是,調(diào)用該函數(shù)時,可以傳入任意個參數(shù),包括0個參數(shù)。
四、關鍵字參數(shù)**kw關鍵字參數(shù)**kw允許傳入0個至任意個含參數(shù)名的參數(shù),這些關鍵字參數(shù)在函數(shù)內(nèi)部自動組裝為一個dict。例如:
def person(name , age , **kw ): print("name:",name,"age:",age,"other:",kw) >>> person("xiong",18) name: xiong age: 18 other: {} >>> person("xiong",18,city = "SH") # city是原本沒有的參數(shù),但是因為有**kw name: xiong age: 18 other: {"city": "SH"}
關鍵參數(shù)有什么用?可以擴展函數(shù)的功能。比如在person()函數(shù)里面,可以保證接收到name和age這兩個參數(shù)。但是如果提供更多參數(shù),也能收到。當然也可以先組裝一個dict,再把該dict轉換為關鍵字參數(shù)傳遞進去:
>>> extra ={"city":"shanghai","job":"SET"} # dict的定義 >>> person("xiong",18,city = extra["city"],job=extra["job"]) # dict的使用 name: xiong age: 18 other: {"city": "shanghai", "job": "SET"} # dict的內(nèi)容 >>> person("xiong",18,**extra) name: xiong age: 18 other: {"city": "shanghai", "job": "SET"}
【總結】**extra表示把extra這個dict的所有key-value用關鍵字參數(shù)傳入到函數(shù)的**kw參數(shù),kw將獲得一個dict,注意kw獲得的dict是extra的一份拷貝,對kw的改動不會影響到函數(shù)外的extra。
五、命名關鍵字參數(shù)如果要限制關鍵字參數(shù)的名字,就可以用命名關鍵字參數(shù)。需要一個特殊分隔符“”,“”后面的參數(shù)被視為命名關鍵字參數(shù)。如果缺少“*”,Python解釋器則無法識別位置參數(shù)和命名關鍵字參數(shù)。在調(diào)用時,必須指定參數(shù)名字與參數(shù)值。
例如,只接收city和job作為關鍵字參數(shù),可以使用如下定義:
def person( name ,age,*,city,job): print(name , age , city , job ) >>> person("xiong", 18, city="shanghai", job="tester") xiong 18 shanghai tester
如果函數(shù)定義中已經(jīng)有了一個可變參數(shù),后面跟著的命名關鍵字參數(shù)就不再需要一個特殊分隔符*了:
>>> def person( name,age,*args,city,job ): # 此處city和job也是命名關鍵字參數(shù) ... print(name, age, city, job)
命名關鍵字參數(shù)必須傳入?yún)?shù)名,如果沒有傳入?yún)?shù)名,調(diào)用將會報錯:
>>> person("xlp",18,"shanghai","tester") # 錯誤調(diào)用 Traceback (most recent call last): File "", line 1, in TypeError: person() missing 2 required keyword-only arguments: "city" and "job" >>> person("xlp",18,city="shanghai",job="tester") # 正確調(diào)用 xlp 18 shanghai tester
命名關鍵字參數(shù)可以有缺省值,從而簡化調(diào)用:
>>> def person1(name,age,*,city="shanghai",job): ... print(name,age,city,job) ... >>> person1("xlp",18,job="engineer") xlp 18 shanghai engineer六、參數(shù)組合
在Python中定義函數(shù),可以用位置參數(shù)、默認參數(shù)、可變參數(shù)、關鍵字參數(shù)和命名關鍵字參數(shù),這5種參數(shù)都可以組合使用。
但是要注意,參數(shù)定義的順序必須是:位置參數(shù)、默認參數(shù)、可變參數(shù)、命名關鍵字參數(shù)和關鍵字參數(shù)。
(1)定義可變參數(shù)和關鍵字參數(shù)的語法:
*args是可變參數(shù),args接收的是一個list、tuple;
**kw是關鍵字參數(shù),kw接收的是一個dict;
(2)調(diào)用函數(shù)時如何傳入可變參數(shù)和關鍵字參數(shù)的語法:
可變參數(shù)直接傳入:func(1,2,3)
可變參數(shù)間接傳入:先組裝成list或tuple,l=(1,2,3),再通過args傳入,func(l)
關鍵字參數(shù)直接傳入:func(a=1,b=2)
關鍵字參數(shù)間接傳入:先組裝成dict,d={‘a(chǎn)’:1,’b’:2},再通過kw傳入,func(d)
(3)命名關鍵字參數(shù) 是為了限制調(diào)用者可以傳入的參數(shù)名,同時可以提供默認值。
(4)定義命名的關鍵字參數(shù)在沒有可變參數(shù)的情況下,不要忘記寫分隔符*,否則定義的將是位置參數(shù)。
? thanks for watching, keep on updating...
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42370.html
摘要:在定義函數(shù)時給定的名稱稱作形參,在調(diào)用函數(shù)時你所提供給函數(shù)的值稱作實參。調(diào)用函數(shù)要調(diào)用一個函數(shù),需要知道函數(shù)的名稱和參數(shù)。默認參數(shù)值可以有效幫助解決這一情況。是默認參數(shù)定義默認參數(shù)要牢記一點默認參數(shù)必須指向不變對象。 關于數(shù)據(jù)科學在做什么,我們已經(jīng)在前兩篇文章中進行了總結,即專題概述和描述性統(tǒng)計分析。要進行數(shù)據(jù)科學的探索,需要一個好工具,就是Python。從本篇開始,將總結學習Pyth...
摘要:調(diào)用以回調(diào)函數(shù)地址為參數(shù)的函數(shù)這個主題就稍微繞一些了,也就是說在接口中,需要傳入回調(diào)函數(shù)作為參數(shù)。這個問題在中也可以解決,并且回調(diào)函數(shù)可以用定義。代碼代碼很簡單回調(diào)函數(shù)的傳入?yún)?shù)為,返回參數(shù)也是。 項目中要對一個用 C 編寫的 .so 庫進行邏輯自測。這項工作,考慮到靈活性,我首先考慮用 Python 來完成。 研究了一些資料,采用 python 的 ctypes 來完成這項工作。已經(jīng)...
摘要:主要是庫文件頭文件文件不一致的問題。定義模塊函數(shù)其中函數(shù)參數(shù)是模塊自身,是傳遞的參數(shù)列表,返回值定義了一個整形數(shù),這里會申請空間增加引用計數(shù),交由來管理這個引用。 C++開發(fā)python windows版本的擴展模塊示例測試環(huán)境介紹和準備測試環(huán)境:操作系統(tǒng):windows10Python版本:3.7.0VS版本:vs2015社區(qū)版(免費)相關工具下載:VS版本vs2015社區(qū)版(免費)...
摘要:主要是庫文件頭文件文件不一致的問題。定義模塊函數(shù)其中函數(shù)參數(shù)是模塊自身,是傳遞的參數(shù)列表,返回值定義了一個整形數(shù),這里會申請空間增加引用計數(shù),交由來管理這個引用。 C++開發(fā)python windows版本的擴展模塊示例測試環(huán)境介紹和準備測試環(huán)境:操作系統(tǒng):windows10Python版本:3.7.0VS版本:vs2015社區(qū)版(免費)相關工具下載:VS版本vs2015社區(qū)版(免費)...
摘要:函數(shù)返回值支持多個,返回多個時,使用逗號分隔。如上,與這個參數(shù)按照由左到右依次賦值給形參和供函數(shù)內(nèi)部使用。在傳入函數(shù)時,便是將這個引用傳入了函數(shù)。需要使用關鍵字聲明將變量作用域變?yōu)楹瘮?shù)外部非全局變量,及閉包作用域。 < 返回索引頁 函數(shù) 函數(shù)定義 返回值 函數(shù)的調(diào)用 函數(shù)的參數(shù) 順序參數(shù) 參數(shù)的默認值 可變參數(shù) 關鍵字參數(shù) 參數(shù)的組合 參數(shù)的專遞 函數(shù)作用域 內(nèi)建...
摘要:為我們提供了許多內(nèi)置函數(shù),例如并提供了創(chuàng)建用戶定義函數(shù)的能力。會將該變量視為函數(shù)級作用域中的局部變量。回到目錄中函數(shù)的用途是什么是中的內(nèi)置函數(shù)之一。請注意,這種類型的參數(shù)語法不允許將命名參數(shù)傳遞給函數(shù)。函數(shù)接受一個稱為的可選參數(shù)。 ...
閱讀 922·2021-10-13 09:48
閱讀 3907·2021-09-22 10:53
閱讀 3114·2021-08-30 09:41
閱讀 1943·2019-08-30 15:55
閱讀 2920·2019-08-30 15:55
閱讀 1839·2019-08-30 14:11
閱讀 2205·2019-08-29 13:44
閱讀 764·2019-08-26 12:23