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