引言
假如我們已經(jīng)從Excel中讀取到了一列數(shù)據(jù),比如說是一隊人的分?jǐn)?shù)。我們嘗試用Python來編寫一個求總分的函數(shù)。
如果事先已知人數(shù)
如果人數(shù)實現(xiàn)已知,比如說只有兩個人的時候,我們可能會編寫如下函數(shù):
def sum1(a,b):
print('a = ',a)
print('b = ',b)
print('sum = ',a+b)
# a = 10
# sum1(a) # TypeError: sum1() missing 1 required positional argument: 'b'
# b = 20
# sum1(a,b)
這個函數(shù)的級別等同“hello world“。讓我們來看下這個函數(shù)的參數(shù)。這個函數(shù)的這種參數(shù)稱為必選參數(shù)。也就是活,你必須給函數(shù)sum1傳遞兩個確定的參數(shù),他才能輸出正確結(jié)果。如果你只傳遞了一個,對不起,函數(shù)撂挑子不干了。而且會給你拽一句英文:
TypeError: sum1() missing 1 required positional argument: 'b'。
如果某人分?jǐn)?shù)也已知
標(biāo)題中”也“的意思是說,人數(shù)已知的同時某人分?jǐn)?shù)也已知,比如為10。這時候也許你會編寫出下面這樣的函數(shù):
def sum2(a,b=10):
print('a = ',a)
print('b = ',b)
print('sum = ',a+b)
這個時候,再遇到上一節(jié)的只傳遞一個函數(shù)的情況,函數(shù)就不會撂挑子了,而是會給出正確結(jié)果。
但是,轉(zhuǎn)折來了:一般情況下,我們很有可能不知道我們到底從excel讀取了多少個數(shù)據(jù),而且一般數(shù)量還還不小,即使知道了也不能用上面的方式去寫了。論括號里到底可以寫多少個參數(shù)??
可變長參數(shù)
當(dāng)函數(shù)參數(shù)不可知的時候,也許,就需要寫一個可變長參數(shù)的函數(shù)了。
在Python中,有兩種可變長常數(shù)可選,分別是:
- 元組變長參數(shù),參數(shù)名前面有一個
*號 - 字典變長參數(shù),參數(shù)名前面有兩個
*號
我們分別來看一下。
元組變長參數(shù)
我們用元組變長參數(shù)重寫一個上面的那個求總分的函數(shù):
def sum3(*nums):
print('nums: ',nums)
sum = 0
for num in nums:
sum += num
print('sum = ',sum)
a = 11
b = 22
c = 33
sum3(a,b,c)
運行下試試,結(jié)果如下:
nums: (11, 22, 33)
sum = 66
可以看到輸出的nums是被圓括號包含的三個數(shù)字,大家都知道,在Python中圓括號括起來的正是元組tuple(圓括號,元組......感覺名字還挺符合的,都是yuan)。
不定長參數(shù),沒有參數(shù)可不可以呢?
運行sum()試試看。
輸出結(jié)果:
nums: ()
sum = 0
字典可變長參數(shù)
我們用字典變長參數(shù)重寫一個上面的那個求總分的函數(shù):
def sum4(a=0,**nums):
print('nums: ',nums)
sum = a
for key in nums:
sum += nums[key]
print('sum = ',sum)
sum4(a=11,b=22,c=33)
運行一下,輸出結(jié)果如下:
a = 11
nums: {'b': 22, 'c': 33}
sum = 66
可以看到輸出的nums是被花括號包含的三個數(shù)字,大家都知道,在Python中花括號括起來的正是字典。
字典可變長參數(shù),或者叫關(guān)鍵字參數(shù),允許你將不定長度的鍵值對, 作為參數(shù)傳遞給一個函數(shù)。
當(dāng)然,與元組可變參數(shù)一樣,這個參數(shù)也是可以為空的。
如果我們按照元組可變長參數(shù)的方式給sum4傳遞參數(shù)會發(fā)生什么呢?
比如我們運行下這么一句:
sum4(a,b,c)
結(jié)果函數(shù)又撂挑子不干了,而且對你說了一句英語:
TypeError: sum4() takes from 0 to 1 positional arguments but 3 were given。
公眾號【CVPy】,分享有意思的干貨。
