詳解Python傳入?yún)?shù)的幾種方法
Python傳入?yún)?shù)的方法有:位置參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)、和命名關(guān)鍵字參數(shù)、以及各種參數(shù)調(diào)用的組合
寫(xiě)在前面
Python唯一支持的參數(shù)傳遞方式是『共享傳參』(call by sharing)
多數(shù)面向?qū)ο笳Z(yǔ)言都采用這一模式,包括Ruby、Smalltalk和Java(Java的引用類(lèi)型是這樣,基本類(lèi)型按值傳遞)
共享傳參是指函數(shù)的各個(gè)形式參數(shù)獲得實(shí)參中各個(gè)引用的副本;也就是說(shuō),函數(shù)內(nèi)部的形參是實(shí)參的別名(alias)
這種方案的結(jié)果是,函數(shù)可能會(huì)修改作為參數(shù)傳入的可變對(duì)象,但是無(wú)法修改那些對(duì)象的標(biāo)識(shí)(即不能把一個(gè)對(duì)象替換為另一個(gè)對(duì)象)
位置參數(shù)
位置參數(shù)是最簡(jiǎn)單的傳入?yún)?shù)的方式,在其它的語(yǔ)言中也常常被使用
演示一:
def func(a, b): print(a+b) func(1, 2) #3
演示二:
def power(x, n):
s = 1
while(n > 0):
n -= 1
s *= n
return s
power(2, 3) #8
默認(rèn)參數(shù)
默認(rèn)參數(shù)就是在調(diào)用函數(shù)的時(shí)候使用一些包含默認(rèn)值的參數(shù)
def power(x, n=2):
s = 1
while(n > 0):
n -= 1
s *= n
reutrn s
power(3) #9
power(2, 3) #8
定義默認(rèn)參數(shù)要牢記一點(diǎn):默認(rèn)參數(shù)必須指向不變對(duì)象!
#以下這個(gè)函數(shù)如果被多次調(diào)用會(huì)在默認(rèn)添加多個(gè)END字符串
def add_end(l = []):
l.append('END')
return l
#為了避免這個(gè)問(wèn)題,應(yīng)該把傳入的默認(rèn)參數(shù)設(shè)置為不可變的
def add_end(l = None):
l = []
l.append('END')
return l
可變參數(shù)
可變參數(shù)就是允許在調(diào)用參數(shù)的時(shí)候傳入多個(gè)(≥0個(gè))參數(shù)(類(lèi)似于列表、字典)
#這才是可變參數(shù),雖然在使用上和列表沒(méi)有區(qū)別,但是參數(shù)nums接收到的是一個(gè)tuple(這些參數(shù)在傳入時(shí)被自動(dòng)組組裝為一個(gè)元祖)
def calc(*nums):
sum = 0
for n in nums:
sum += n
return sum
>>> calc(1,2,3)
7
>>> my_ls = [1,2,3]
>>> calc(*my_ls)
7
關(guān)鍵字參數(shù)
可變參數(shù)允許傳入0個(gè)~多個(gè)參數(shù),而關(guān)鍵字參數(shù)允許在調(diào)用時(shí)以字典形式傳入0個(gè)或多個(gè)參數(shù)(注意區(qū)別,一個(gè)是字典一個(gè)是列表);在傳遞參數(shù)時(shí)用等號(hào)(=)連接鍵和值
#用兩個(gè)星號(hào)表示關(guān)鍵字參數(shù)
def person_info(name, age, **kw):
print("name", name, "age", age, "other", kw)
>>> person_info("Xiaoming", 12)
name Xiaoming age 12 other{}
>>> person_info("Dahuang", 35, city = "Beijing")
name Dahuang age 35 other {'city':'Beijing'}
命名關(guān)鍵字參數(shù)
命名關(guān)鍵字參數(shù)在關(guān)鍵字參數(shù)的基礎(chǔ)上限制傳入的的關(guān)鍵字的變量名
和普通關(guān)鍵字參數(shù)不同,命名關(guān)鍵字參數(shù)需要一個(gè)用來(lái)區(qū)分的分隔符*,它后面的參數(shù)被認(rèn)為是命名關(guān)鍵字參數(shù)
#這里星號(hào)分割符后面的city、job是命名關(guān)鍵字參數(shù)
person_info(name, age, *, city, job):
print(name, age, city, job)
>>> person_info("Alex", 17, city = "Beijing", job = "Engineer")
Alex 17 Beijing Engineer #看來(lái)這里不再被自動(dòng)組裝為字典
不過(guò)也有例外,如果參數(shù)中已經(jīng)有一個(gè)可變參數(shù)的話,前面講的星號(hào)分割符就不要寫(xiě)了(其實(shí)星號(hào)是寫(xiě)給Python解釋器看的,如果一個(gè)星號(hào)也沒(méi)有的話就無(wú)法區(qū)分命名關(guān)鍵字參數(shù)和位置參數(shù)了,而如果有一個(gè)星號(hào)即使來(lái)自變長(zhǎng)參數(shù)就可以區(qū)分開(kāi)來(lái))
#args是變長(zhǎng)參數(shù),而city和job是命名關(guān)鍵字參數(shù)
person_info(name, age, *args, city, job):
print(name, age, args, city)
>>> person_info("Liqiang", 43, "balabala", city = "Wuhan", job = "Coder")
Liqiang 43 balabala Wuhan Coder
參數(shù)組合
總結(jié)一下,在Python中一種可以使用5中傳遞參數(shù)的方式(位置參數(shù)、默認(rèn)參數(shù)、變長(zhǎng)參數(shù)、關(guān)鍵字參數(shù)、命名關(guān)鍵字參數(shù))
注意,這些參數(shù)在書(shū)寫(xiě)時(shí)要遵循一定的順序即:位置參數(shù)、默認(rèn)參數(shù)、變長(zhǎng)參數(shù)、關(guān)鍵字參數(shù)、命名關(guān)鍵字參數(shù)(和本文的行文順序一致)
這里簡(jiǎn)單舉兩個(gè)栗子
def f1(a, b, c=0, *args, **kw):
print("a = ", a, "b = ", b, "args = ", args, "kw = ",kw)
def f2(a, b, c=0, *, d, **kw):
print("a = ", a, "b = ", b, "c = ", c, "d = ", d, "kw = ", kw)
>>> f1(1, 2)
a = 1 b = 2 c = 0 args =() kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x = 99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x':99}
>>> f2(1, 2, d = 99, ext = None)
a = 1 b =2 c = 0 d = 99 kw = {'ext':None}
寫(xiě)在后面
關(guān)于Python參數(shù)傳遞,有以下幾點(diǎn)提請(qǐng)注意:
1)參數(shù)的傳遞是通過(guò)自動(dòng)將對(duì)象賦值給本地變量名來(lái)實(shí)現(xiàn)的
函數(shù)參數(shù)在實(shí)際中只是Python賦值的另一個(gè)實(shí)例而已,因?yàn)橐每梢允且灾羔樀男问絹?lái)實(shí)現(xiàn)的,所有的參數(shù)實(shí)際上都是通過(guò)指針進(jìn)行傳遞的,作為參數(shù)被傳遞的對(duì)象從來(lái)不自動(dòng)拷貝
2)在函數(shù)內(nèi)部的參數(shù)名的賦值不會(huì)影響調(diào)用者
在函數(shù)運(yùn)行時(shí),在函數(shù)頭部的參數(shù)名時(shí)一個(gè)新的、本地的變量名,這個(gè)變量名是在函數(shù)的本地作用域內(nèi)的,函數(shù)參數(shù)名和調(diào)用者作用域中的變量是沒(méi)有區(qū)別的
3)改變函數(shù)的可變對(duì)象參數(shù)的值也許會(huì)對(duì)調(diào)用者有影響
換句話說(shuō),因?yàn)閰?shù)是簡(jiǎn)單地賦值給傳入的對(duì)象,函數(shù)就能夠就地改變傳入的可變對(duì)象,因此其結(jié)果會(huì)影響調(diào)用者;可變參數(shù)對(duì)函數(shù)來(lái)說(shuō)可以做輸入和輸出的
Python的通過(guò)賦值進(jìn)行傳遞的機(jī)制與C++的引用參數(shù)選項(xiàng)不完全相同,但是實(shí)際中,它與C語(yǔ)言的參數(shù)傳遞模型相當(dāng)類(lèi)似:
1)不可變參數(shù)“通過(guò)值”進(jìn)行傳遞
像整數(shù)和字符串這樣的對(duì)象是不可變對(duì)象,它們通過(guò)對(duì)象引用而不是拷貝進(jìn)行傳遞的,但是因?yàn)闊o(wú)論如何都不可能在原處改變不可變對(duì)象,實(shí)際的效果就很像創(chuàng)建了一份拷貝
2)可變對(duì)象是通過(guò)“指針”進(jìn)行傳遞的
列表和字典這樣的對(duì)象也是通過(guò)對(duì)象引用進(jìn)行傳遞的,這一點(diǎn)與C語(yǔ)言使用指針傳遞數(shù)組很相似,可變對(duì)象能夠在函數(shù)內(nèi)部進(jìn)行原處的改變,這一點(diǎn)和C數(shù)組很像


總而言之,理解Python的變量、函數(shù)的關(guān)鍵就是理解『綁定』的概念——綁定就是綁定對(duì)象,理解了這一點(diǎn)就好辦了
以上所述是小編給大家介紹的Python傳入?yún)?shù)的幾種方法詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
全CPU并行處理Pandas操作Pandarallel更快處理數(shù)據(jù)
我們?cè)谔幚頂?shù)據(jù)時(shí),通常小的數(shù)據(jù)對(duì)處理速度不敏感,但數(shù)據(jù)量一大,頓時(shí)會(huì)感覺(jué)數(shù)據(jù)處理效率不盡如人意,今天介紹的pandarallel就是一個(gè)簡(jiǎn)單高效的Pandas并行工具,幾行代碼就可以提高數(shù)據(jù)處理效率,2024-01-01
如何修改pycharm使用anaconda環(huán)境后的pip install安裝路徑問(wèn)題
本文主要介紹了如何修改pycharm使用anaconda環(huán)境后的pip install安裝路徑問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Python實(shí)現(xiàn)i人事自動(dòng)打卡的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)i人事自動(dòng)打卡的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
動(dòng)態(tài)設(shè)置django的model field的默認(rèn)值操作步驟
這篇文章主要介紹了動(dòng)態(tài)設(shè)置django的model field的默認(rèn)值操作步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
python基于pygame實(shí)現(xiàn)飛機(jī)大作戰(zhàn)小游戲
這篇文章主要為大家詳細(xì)介紹了python基于pygame實(shí)現(xiàn)飛機(jī)大作戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
關(guān)于微信小程序爬蟲(chóng)token自動(dòng)更新問(wèn)題
本文主要介紹了關(guān)于微信小程序爬蟲(chóng)關(guān)于token自動(dòng)更新問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Python實(shí)現(xiàn)3行代碼解簡(jiǎn)單的一元一次方程
這篇文章主要介紹了Python實(shí)現(xiàn)3行代碼解簡(jiǎn)單的一元一次方程,很適合Python初學(xué)者學(xué)習(xí)借鑒,需要的朋友可以參考下2014-08-08

