Python可變長參數

引言

假如我們已經從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】,分享有意思的乾貨。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章