python 的函數(shù)參數(shù)類(lèi)型分為4種:
專(zhuān)業(yè)領(lǐng)域包括成都網(wǎng)站建設(shè)、成都做網(wǎng)站、購(gòu)物商城網(wǎng)站建設(shè)、微信營(yíng)銷(xiāo)、系統(tǒng)平臺(tái)開(kāi)發(fā), 與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開(kāi)發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷(xiāo)的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶(hù)提供全網(wǎng)互聯(lián)網(wǎng)整合方案。
1.位置參數(shù):調(diào)用函數(shù)時(shí)根據(jù)函數(shù)定義的參數(shù)位置來(lái)傳遞參數(shù),位置參數(shù)也可以叫做必要參數(shù),函數(shù)調(diào)用時(shí)必須要傳的參數(shù)。
當(dāng)參數(shù)滿足函數(shù)必要參數(shù)傳參的條件,函數(shù)能夠正常執(zhí)行:
add(1,2) #兩個(gè)參數(shù)的順序必須一一對(duì)應(yīng),且少一個(gè)參數(shù)都不可以
當(dāng)我們運(yùn)行上面的程序,輸出:
當(dāng)函數(shù)需要兩個(gè)必要參數(shù),但是調(diào)用函數(shù)只給了一個(gè)參數(shù)時(shí),程序會(huì)拋出異常
add(1)
當(dāng)我們運(yùn)行上面的程序,輸出:
當(dāng)函數(shù)需要兩個(gè)必要參數(shù),但是調(diào)用函數(shù)只給了三個(gè)參數(shù)時(shí),程序會(huì)拋出異常
add(1,2,3)
當(dāng)我們運(yùn)行上面的程序,輸出
2.關(guān)鍵字參數(shù):用于函數(shù)調(diào)用,通過(guò)“鍵-值”形式加以指定??梢宰尯瘮?shù)更加清晰、容易使用,同時(shí)也清除了參數(shù)的順序需求。
add(1,2) # 這種方式傳參,必須按順序傳參:x對(duì)應(yīng)1,y對(duì)應(yīng):2
add(y=2,x=1) #以關(guān)健字方式傳入?yún)?shù)(可以不按順序)
正確的調(diào)用方式
add(x=1, y=2)
add(y=2, x=1)
add(1, y=2)
以上調(diào)用方式都是允許的,能夠正常執(zhí)行
錯(cuò)誤的調(diào)用方式
add(x=1, 2)
add(y=2, 1)
以上調(diào)用都會(huì)拋出SyntaxError 異常
上面例子可以看出:有位置參數(shù)時(shí),位置參數(shù)必須在關(guān)鍵字參數(shù)的前面,但關(guān)鍵字參數(shù)之間不存在先后順序的
3.默認(rèn)參數(shù):用于定義函數(shù),為參數(shù)提供默認(rèn)值,調(diào)用函數(shù)時(shí)可傳可不傳該默認(rèn)參數(shù)的值,所有位置參數(shù)必須出現(xiàn)在默認(rèn)參數(shù)前,包括函數(shù)定義和調(diào)用,有多個(gè)默認(rèn)參數(shù)時(shí),調(diào)用的時(shí)候,既可以按順序提供默認(rèn)參數(shù),也可以不按順序提供部分默認(rèn)參數(shù)。當(dāng)不按順序提供部分默認(rèn)參數(shù)時(shí),需要把參數(shù)名寫(xiě)上
默認(rèn)參數(shù)的函數(shù)定義
上面示例第一個(gè)是正確的定義位置參數(shù)的方式,第二個(gè)是錯(cuò)誤的,因?yàn)槲恢脜?shù)在前,默認(rèn)參數(shù)在后
def add1(x=1,y) 的定義會(huì)拋出如下異常
默認(rèn)參數(shù)的函數(shù)調(diào)用
注意:定義默認(rèn)參數(shù)默認(rèn)參數(shù)最好不要定義為可變對(duì)象,容易掉坑
不可變對(duì)象:該對(duì)象所指向的內(nèi)存中的值不能被改變,int,string,float,tuple
可變對(duì)象,該對(duì)象所指向的內(nèi)存中的值可以被改變,dict,list
這里只要理解一下這個(gè)概念就行或者自行百度,后續(xù)會(huì)寫(xiě)相關(guān)的專(zhuān)題文章講解
舉一個(gè)簡(jiǎn)單示例
4.可變參數(shù)區(qū)別:定義函數(shù)時(shí),有時(shí)候我們不確定調(diào)用的時(shí)候會(huì)多少個(gè)參數(shù),j就可以使用可變參數(shù)
可變參數(shù)主要有兩類(lèi):
*args: (positional argument) 允許任意數(shù)量的可選位置參數(shù)(參數(shù)),將被分配給一個(gè)元組, 參數(shù)名前帶*,args只是約定俗成的變量名,可以替換其他名稱(chēng)
**kwargs:(keyword argument) 允許任意數(shù)量的可選關(guān)鍵字參數(shù),,將被分配給一個(gè)字典,參數(shù)名前帶**,kwargs只是約定俗成的變量名,可以替換其他名稱(chēng)
*args 的用法
args 是用來(lái)傳遞一個(gè)非鍵值對(duì)的可變數(shù)量的參數(shù)列表給函數(shù)
語(yǔ)法是使用 符號(hào)的數(shù)量可變的參數(shù); 按照慣例,通常是使用arg這個(gè)單詞,args相當(dāng)于一個(gè)變量名,可以自己定義的
在上面的程序中,我們使用* args作為一個(gè)可變長(zhǎng)度參數(shù)列表傳遞給add()函數(shù)。 在函數(shù)中,我們有一個(gè)循環(huán)實(shí)現(xiàn)傳遞的參數(shù)計(jì)算和輸出結(jié)果。
還可以直接傳遞列表或者數(shù)組的方式傳遞參數(shù),以數(shù)組或者列表方式傳遞參數(shù)名前面加(*) 號(hào)
理解* * kwargs
**kwargs 允許你將不定長(zhǎng)度的鍵值對(duì), 作為參數(shù)傳遞給函數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict
下篇詳細(xì)講解 *args, **kwargs 的參數(shù)傳遞和使用敬請(qǐng)關(guān)注
對(duì)象vs變量
在python中,類(lèi)型屬于對(duì)象,變量是沒(méi)有類(lèi)型的,這正是python的語(yǔ)言特性,也是吸引著很多pythoner的一點(diǎn)。所有的變量都可以理解是內(nèi)存中一個(gè)對(duì)象的“引用”,或者,也可以看似c中void*的感覺(jué)。所以,希望大家在看到一個(gè)python變量的時(shí)候,把變量和真正的內(nèi)存對(duì)象分開(kāi)。
類(lèi)型是屬于對(duì)象的,而不是變量。
這樣,很多問(wèn)題就容易思考了。
例如:
對(duì)象vs變量
12
nfoo = 1 #一個(gè)指向int數(shù)據(jù)類(lèi)型的nfoo(再次提醒,nfoo沒(méi)有類(lèi)型)lstFoo = [1] #一個(gè)指向list類(lèi)型的lstFoo,這個(gè)list中包含一個(gè)整數(shù)1
可更改(mutable)與不可更改(immutable)對(duì)象
對(duì)應(yīng)于上一個(gè)概念,就必須引出另了另一概念,這就是可更改(mutable)對(duì)象與不可更改(immutable)對(duì)象。
對(duì)于python比較熟悉的人們都應(yīng)該了解這個(gè)事實(shí),在python中,strings, tuples, 和numbers是不可更改的對(duì)象,而list,dict等則是可以修改的對(duì)象。那么,這些所謂的可改變和不可改變影響著什么呢?
可更改vs不可更改
12345
nfoo = 1nfoo = 2lstFoo = [1]lstFoo[0] = 2
代碼第2行中,內(nèi)存中原始的1對(duì)象因?yàn)椴荒芨淖?,于是被“拋棄”,另nfoo指向一個(gè)新的int對(duì)象,其值為2
代碼第5行中,更改list中第一個(gè)元素的值,因?yàn)閘ist是可改變的,所以,第一個(gè)元素變更為2。其實(shí)應(yīng)該說(shuō),lstFoo指向一個(gè)包含一個(gè)對(duì)象的數(shù)組。賦值所發(fā)生的事情,是有一個(gè)新int對(duì)象被指定給lstFoo所指向的數(shù)組對(duì)象的第一個(gè)元素,但是對(duì)于lstFoo本身來(lái)說(shuō),所指向的數(shù)組對(duì)象并沒(méi)有變化,只是數(shù)組對(duì)象的內(nèi)容發(fā)生變化了。這個(gè)看似void*的變量所指向的對(duì)象仍舊是剛剛的那個(gè)有一個(gè)int對(duì)象的list。
如下圖所示:
Python的函數(shù)參數(shù)傳遞:傳值?引用?
對(duì)于變量(與對(duì)象相對(duì)的概念),其實(shí),python函數(shù)參數(shù)傳遞可以理解為就是變量傳值操作,用C++的方式理解,就是對(duì)void*賦值。如果這個(gè)變量的值不變,我們看似就是引用,如果這個(gè)變量的值改變,我們看著像是在賦值。有點(diǎn)暈是吧,我們?nèi)耘f據(jù)個(gè)例子。
不可變對(duì)象參數(shù)調(diào)用
12345
def ChangeInt( a ): a = 10nfoo = 2 ChangeInt(nfoo)print nfoo #結(jié)果是2
這時(shí)發(fā)生了什么,有一個(gè)int對(duì)象2,和指向它的變量nfoo,當(dāng)傳遞給ChangeInt的時(shí)候,按照傳值的方式,復(fù)制了變量nfoo的值,這樣,a就是nfoo指向同一個(gè)Int對(duì)象了,函數(shù)中a=10的時(shí)候,發(fā)生什么?(還記得我上面講到的那些概念么),int是不能更改的對(duì)象,于是,做了一個(gè)新的int對(duì)象,另a指向它(但是此時(shí),被變量nfoo指向的對(duì)象,沒(méi)有發(fā)生變化),于是在外面的感覺(jué)就是函數(shù)沒(méi)有改變nfoo的值,看起來(lái)像C++中的傳值方式。
可變對(duì)象參數(shù)調(diào)用
12345
def ChangeList( a ): a[0] = 10lstFoo = [2]ChangeList(lstFoo )print nfoo #結(jié)果是[10]
當(dāng)傳遞給ChangeList的時(shí)候,變量仍舊按照“傳值”的方式,復(fù)制了變量lstFoo 的值,于是a和lstFoo 指向同一個(gè)對(duì)象,但是,list是可以改變的對(duì)象,對(duì)a[0]的操作,就是對(duì)lstFoo指向的對(duì)象的內(nèi)容的操作,于是,這時(shí)的a[0] = 10,就是更改了lstFoo 指向的對(duì)象的第一個(gè)元素,所以,再次輸出lstFoo 時(shí),顯示[10],內(nèi)容被改變了,看起來(lái),像C++中的按引用傳遞。
s=[3,2,5,1]
sorted(s,reverse=True)
默認(rèn)reverse=False,排序?yàn)檎?。傳入reverse=True,排序就是倒序
def a(): global q q=1+2 return q def b(): a() c=2+q print(c) b()5 q3 函數(shù)中的變量在外面調(diào)用,需要申明為全局變量
函數(shù)參數(shù)傳遞機(jī)制問(wèn)題在本質(zhì)上是調(diào)用函數(shù)(過(guò)程)和被調(diào)用函數(shù)(過(guò)程)在調(diào)用發(fā)生時(shí)進(jìn)行通信的方法問(wèn)題?;镜膮?shù)傳遞機(jī)制有兩
種:值傳遞和引用傳遞。
推薦:Python教程
值傳遞(passl-by-value)過(guò)程中,被調(diào)函數(shù)的形式參數(shù)作為被調(diào)函數(shù)的局部變量處理,即在堆棧中開(kāi)辟了內(nèi)存空間以存放由主調(diào)函數(shù)放
進(jìn)來(lái)的實(shí)參的值,從而成為了實(shí)參的一個(gè)副本。值傳遞的特點(diǎn)是被調(diào)函數(shù)對(duì)形式參數(shù)的任何操作都是作為局部變量進(jìn)行,不會(huì)影響主調(diào)函
數(shù)的實(shí)參變量的值。
引用傳遞(pass-by-reference)過(guò)程中,被調(diào)函數(shù)的形式參數(shù)雖然也作為局部變量在堆棧中開(kāi)辟了內(nèi)存空間,但是這時(shí)存放的是由主調(diào)函
數(shù)放進(jìn)來(lái)的實(shí)參變量的地址。被調(diào)函數(shù)對(duì)形參的任何操作都被處理成間接尋址,即通過(guò)堆棧中存放的地址訪問(wèn)主調(diào)函數(shù)中的實(shí)參變量。正
因?yàn)槿绱?,被調(diào)函數(shù)對(duì)形參做的任何操作都影響了主調(diào)函數(shù)中的實(shí)參變量。
更多技術(shù)請(qǐng)關(guān)注Python視頻教程。
有
b.傳參方式
i:位置傳參
就是在不知名傳參參數(shù)名的情況下直接利用參數(shù)的索引來(lái)進(jìn)行傳參,如上個(gè)栗子
ii:關(guān)鍵字傳參
與位置傳參相對(duì),直接利用參數(shù)名進(jìn)行傳參,如下:
當(dāng)前名稱(chēng):python向函數(shù)中傳參,python傳入函數(shù)參數(shù)
新聞來(lái)源:http://jinyejixie.com/article18/hsecdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、品牌網(wǎng)站設(shè)計(jì)、靜態(tài)網(wǎng)站、域名注冊(cè)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)