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

