先來定義一個計算體重指數(BMI)的函式,體重指數就是體重與身高的平方之比,其中體重以千克為單位,身高以米為單位,
>>> def bmi(height, weight, name):
i = weight/height**2
print('%s的體重指數為%0.1f'%(name, i))
>>> bmi(1.75, 75, 'Xufive')
Xufive的體重指數為24.5
自定義函式bmi有三個引數,每個引數都有明確的含義,呼叫這個函式時,必須按照定義的順序傳入這三個引數,缺一不可,這也是Python函式最基本的引數傳遞規則,
接下來把bmi函式稍微改造一下,給name引數指定一個默認值,
>>> def bmi(height, weight, name='您'):
i = weight/height**2
print('%s的體重指數為%0.1f'%(name, i))
>>> bmi(1.75,75) # 可以不傳遞name引數,使用默認值
您的體重指數為24.5
>>> bmi(1.75,75,'Xufive') # 也可以傳遞name引數
Xufive的體重指數為24.5
現在bmi函式就有了兩種型別的引數:weight和height,它們是函式呼叫時必不可少的引數,且順序必須與函式定義的保持一致,這樣的引數稱為位置引數;name是函式呼叫時可有可無的引數(如未提供,則使用默認值),這樣的引數稱為默認引數,默認引數可以有多個,
為了使結果更準確,可以考慮使用最近一段時期內多個體重的均值來計算體重指數,這就意味著需要輸入多個體重值,我們固然可以一個體重的元組或串列傳給weight,但這樣weight和height就不是同一種型別了,在形式上失去了美感,在使用時也容易產生誤會,最好的方式就是讓函式可以接受不確定個數的體重引數,
>>> def bmi(height, *args, name='您'):
i = (sum(args)/len(args))/height**2
print('%s的體重指數為%0.1f'%(name, i))
>>> bmi(1.75, 75, name='xufive')
xufive的體重指數為24.5
>>> bmi(1.75, 75, 74)
您的體重指數為24.3
>>> bmi(1.75, 75, 74, 75.5, 74.7, name='xufive')
xufive的體重指數為24.4
實際上,像下面這樣呼叫函式也沒有問題,
>>> weight = [75, 74, 75.5, 74.7]
>>> bmi(1.75, *weight, name='xufive')
xufive的體重指數為24.4
這下就有點復雜了,bmi函式有了三種型別的引數,除了位置引數和默認引數,又多了一種可變引數,即bmi函式可以接受不限數量的引數,在函式定義時,可變引數名前面冠以“*”號;在函式體內,可變引數相當于一個元組,
如此一來,就產生了一個新的問題:三種型別的引數應該以怎樣的順序被定義呢?位置引數排在首位,這一點沒有異議,默認引數原則上放在最后,但呼叫時必須加上引數名(如上面的例子),否則函式無法區分究竟是可變引數還是默認引數,默認引數也可以放在可變引數之前(不建議這樣做),但呼叫時不能使用引數名,即便使用默認值也不能省略引數,否則函式會用后面的可變引數的第一個值(如果有的話)強制為其賦值,
下面說一說更復雜的情況,除了上面介紹的三種型別的引數外,Python函式還支持第四種型別的引數:關鍵字引數,關鍵字引數由不限數量的鍵值對組成,在函式定義時,關鍵字引數名前面冠以“**”號;在函式體內,關鍵字引數相當于一個字典,
>>> def bmi(height, *args, name='您', **kwds):
i = (sum(args)/len(args))/height**2
print('%s的體重指數為%0.1f'%(name, i))
for key in kwds:
print('%s的%s是%s'%(name, key, str(kwds[key])))
>>> bmi(1.75, 75, 74, 75.5, 74.7, name='Xufive')
Xufive的體重指數為24.4
>>> bmi(1.75, 75, 74, name='Xufive', 性別='男', 愛好='攝影')
Xufive的體重指數為24.3
Xufive的性別是男
Xufive的愛好是攝影
>>> bmi(1.75, 75, 74, 性別='男', 愛好='攝影', name='Xufive')
Xufive的體重指數為24.3
Xufive的性別是男
Xufive的愛好是攝影
>>> bmi(1.75, 75, 74, 75.5, 74.7, 性別='男', 愛好='攝影')
您的體重指數為24.4
您的性別是男
您的愛好是攝影
如果一個函式同時具備了上述四種型別的引數,函式定義時引數的正確順序應該是位置引數排在首位,可變引數次之,默認引數再次之,關鍵字引數排在末尾,函式呼叫時,如果需要指定默認引數,其引數名不能省略,位置在可變引數之后,可以在關鍵字引數之前,也可以在其后,也可以混雜其中,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271242.html
標籤:AI
上一篇:OpenCV-Python圖形影像處理:制作雪花飄落特效
下一篇:漫談socket-io的基本原理
