Python:函數(shù)的定義、參數(shù)傳入與函數(shù)的調(diào)用
點(diǎn)擊上方“小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
作為計(jì)算機(jī)代碼的一種抽象方式,函數(shù)在Python中扮演了極為重要的角色。本節(jié)介紹Python函數(shù)的定義、參數(shù)的傳入以及調(diào)用方式。其中函數(shù)參數(shù)的傳入方式為本節(jié)重點(diǎn)內(nèi)容。Python函數(shù)的參數(shù)形式包括必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)以及關(guān)鍵字參數(shù)。五類參數(shù)可單獨(dú)傳入也可組合傳入。
Python 函數(shù)的定義
與R語(yǔ)言中定義函數(shù)的function(x)不同的是,Python中使用def語(yǔ)句來(lái)定義函數(shù),然后依次寫(xiě)出函數(shù)名、括號(hào)、括號(hào)內(nèi)的參數(shù)以及最后不能忘記的冒號(hào),函數(shù)體需另起一行在縮進(jìn)塊中編寫(xiě),最后返回值用return語(yǔ)句執(zhí)行??匆焕蠼^對(duì)值的自編函數(shù):
def f_abs(x):
if x >=0:
return x
else:
return -x
當(dāng)然,如果你已經(jīng)通過(guò)pycharm將f_abs保存為abstest.py文件的話,可以通過(guò)cmd在當(dāng)前文件目錄下啟動(dòng)Python然后直接導(dǎo)入函數(shù)模塊來(lái)調(diào)用f_abs函數(shù):
C:\Users\Administrator>F:
F:\>cd pythoncode>python
>>> from abstest import f_abs
>>> f_abs(-1.0923)
-1.0923
另外我們?cè)诰帉?xiě)函數(shù)時(shí)也可以對(duì)函數(shù)做參數(shù)個(gè)數(shù)和參數(shù)類型的檢查,函數(shù)也可以返回多個(gè)值,但其本質(zhì)是一個(gè)tuple。
函數(shù)的參數(shù)傳入
函數(shù)參數(shù)傳入的靈活性使得Python函數(shù)十分強(qiáng)大,函數(shù)參數(shù)除了必選參數(shù)之外,還包括默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)以及關(guān)鍵字參數(shù)。函數(shù)參數(shù)傳遞順序?yàn)楸剡x參數(shù)>默認(rèn)參數(shù)>可變參數(shù)>命名關(guān)鍵字參數(shù)>關(guān)鍵字參數(shù)。
必選參數(shù):
先定義一個(gè)求平方的函數(shù):
def power(x):
return x*x
power(-10)
100
可見(jiàn)求平方函數(shù)定義起來(lái)很方便,但如果我們想求x的更高次冪的話,恐怕這個(gè)函數(shù)就得改改了,我們需要兩個(gè)必選參數(shù)才能搞定:
def power(x,n):
s = 1
while n >0:
n = n-1
s = s*x
return s
power(10,3)
1000默認(rèn)參數(shù):
當(dāng)我們重新定義power函數(shù)時(shí),原先的只傳入一個(gè)必選參數(shù)的函數(shù)就已經(jīng)失效了,這時(shí)候我們就需要默認(rèn)參數(shù)來(lái)幫忙了,將參數(shù)n的值定義為默認(rèn)值2:
def power(x,n=2):
s = 1
while n >0:
n = n-1
s = s*x
return s>>> power(10)
100
>>> power(10,2)
100
從上述例子我們可以看出,默認(rèn)參數(shù)的使用可以簡(jiǎn)化函數(shù)的調(diào)用。必選參數(shù)在前,默認(rèn)參數(shù)在后,當(dāng)傳入多個(gè)參數(shù)時(shí),變化大的參數(shù)放前面,變化小的參數(shù)可作為默認(rèn)參數(shù)放后面,最重要的一點(diǎn)是,默認(rèn)參數(shù)必須指向不變對(duì)象!這是設(shè)置默認(rèn)參數(shù)時(shí)需要注意的。
可變參數(shù):
我們對(duì)一組數(shù)的平方求和定義一個(gè)函數(shù),即a2+b2+c2+...利用可變參數(shù)我們可以編寫(xiě)函數(shù):
def jisuan(*numers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
由上面的命令可見(jiàn)可變參數(shù)僅僅需要在參數(shù)前加上一個(gè)*號(hào)就可完成對(duì)其定義,參數(shù)numbers接受的數(shù)據(jù)類型為一個(gè)list或者tuple。當(dāng)我們已有一個(gè)list或者tuple時(shí),我們可以直接將其當(dāng)作可變參數(shù)傳入函數(shù)中去:
>>> nums = [2,3,5]
>>> jisuan(*nums)
38
關(guān)鍵字參數(shù):
與可變參數(shù)可以傳入任意個(gè)參數(shù)不同的是,關(guān)鍵字參數(shù)可以傳入任意個(gè)含參數(shù)名的參數(shù),這樣key-value格式顯然是以dict的數(shù)據(jù)類型傳入的。且看示例:
def player(name,team,**kw):
print('name:',name,'team:',team,'other:',kw)
player('Harden','Rockets',city = 'Houston')
name: Harden team: Rockets other: {'city':'Houston'}
顯而易見(jiàn)的一點(diǎn)是,關(guān)鍵字參數(shù)增加了函數(shù)的靈活性,除去必選參數(shù)外,用戶可通過(guò)關(guān)鍵字參數(shù)輸入任何想要的參數(shù)。和可變參數(shù)類似的是,我們也可以先定義一個(gè)dict,然后將其作為關(guān)鍵字參數(shù)傳入函數(shù)中去:
>>> info = {'city': 'Golden states'}
>>> player('Curry','Worriors',**info)
name: Curry team: Worriors other: {'city':'Golden states'}
命名關(guān)鍵字參數(shù):
通過(guò)關(guān)鍵字參數(shù),我們可以傳入任意不受限制的參數(shù),但如果我們想要限制關(guān)鍵字參數(shù)的名字,可以使用命名關(guān)鍵字參數(shù),例如只接受city和age作為關(guān)鍵字參數(shù),定義方式如下:
def palyer(name,team,*,city,age):
print(name,team,city,age)
命名關(guān)鍵字參數(shù)需要一個(gè)*作為分隔,*后面的參數(shù)均為命名關(guān)鍵字參數(shù),這與關(guān)鍵字參數(shù)的**大不相同。但如果在此之前函數(shù)已有可變參數(shù)的話,再定義命名關(guān)鍵字參數(shù)的話就不需要*作為分隔符了。示例如下:
def palyer(name,team,*tec,city,age):
print(name,team,tec,city,age)
需要注意的是,命名關(guān)鍵字參數(shù)必需連同參數(shù)名一起傳入函數(shù)中,否則的話Python將會(huì)報(bào)錯(cuò)。
>>> player('Parker','Spurs',city = 'San Antonio',age = 32)
Parker Spurs San Antonio 32 需要說(shuō)明的一點(diǎn)是,各類參數(shù)可以組合傳入函數(shù)當(dāng)中,只是需要注意傳入的順序:必選參數(shù)>默認(rèn)參數(shù)>可變參數(shù)>命名關(guān)鍵字參數(shù)>關(guān)鍵字參數(shù)。
函數(shù)的調(diào)用
當(dāng)我們定義好函數(shù)后,相應(yīng)的函數(shù)調(diào)用也就十分簡(jiǎn)單了,直接使用函數(shù)名即可完成調(diào)用。當(dāng)然,并不是每個(gè)函數(shù)都需要我們?nèi)プ远x,Python基礎(chǔ)模塊和各類庫(kù)里面內(nèi)置了大量函數(shù),我們可直接調(diào)用,這一點(diǎn)和R也是類似的??磶讉€(gè)Python函數(shù)的例子:
>>> abs(-0.3)
0.3
>>> max(3,0,8,3)
8
>>> int(10.24)
10
好消息!
小白學(xué)視覺(jué)知識(shí)星球
開(kāi)始面向外開(kāi)放啦??????
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車(chē)道線檢測(cè)、車(chē)輛計(jì)數(shù)、添加眼線、車(chē)牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。 下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。 交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

