天天看點

Python3 自定義可變參數函數,用 input() 輸入參數的方法Python中的*可變參數與**關鍵字參數 1Python中自定義可變參數函數 multi()

目錄

  • Python中的*可變參數與**關鍵字參數 [^注]
    • *可變參數
    • **關鍵字參數
  • Python中自定義可變參數函數 multi()
    • 程式内設定參數
    • 程式外 input() 參數

Python中的*可變參數與**關鍵字參數 1

*可變參數

在Python中可以定義可變參數,顧名思義,可變參數就是傳入參數是可變的。可以是任意個,以一個簡單的數學程式設計為例,計算

sum = a * a + b * b + .....z * z
           

函數定義可以如下:

def getsum(num) :
    sum = 0
    for n in num :
        sum = sum + n * n
    return sum
           

但是調用的時候必須定義一個元組或者清單。比如getsum([1,2,3])

如果利用可變參數調用函數的方式可以變成這樣的話就友善的多比如getsum(1,2,3)

可以這麼修改

def getsum(*num) :
    sum = 0
    for n in num :
        sum = sum + n * n
    return sum
           

如果已經有一個list或者tuple,要調用一個可變參數怎麼辦?可以這樣做:

>>> nums = [1, 2, 3]
>>> calc(nums[0], nums[1], nums[2])
14
           

這種寫法當然是可行的,問題是太繁瑣,是以Python允許你在list或tuple前面加一個*号,把list或tuple的元素變成可變參數傳進去:

>>> nums = [1, 2, 3]
>>> calc(*nums)
14
           

**關鍵字參數

可變參數允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝為一個tuple。而關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數内部自動組裝為一個dict。請看示例:

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
           

函數person除了必選參數name和age外,還接受關鍵字參數kw。調用該函數時可以隻傳入必選參數

>>> person('Michael', 30)
name: Michael age: 30 other: {}
           
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
           

關鍵字參數有什麼用?它可以擴充函數的功能,比如在person函數裡,我們保證能接收到必選參數,但是如果調用者願意提供更多的參數,我們也能收到,

試想你正在做一個使用者注冊的功能,除了使用者名和年齡是必須的以外,其他的都是可選項目,利用關鍵字參數就可以完成這個要求。

和可變參數類似可以先組裝出一個字典dict,然後把dict傳進去。

>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, city=extra['city'], job=extra['job'])
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'
           

上面複雜的調用可以用簡化的寫法

>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
           

**extra表示把extra這個dict的所有key-value用關鍵字參數傳入到函數的 **kw參數,**kw将獲得一個dict,注意kw獲得的dict是extra的一個拷貝,對kw的改動不會影響到函數外的extra

命名關鍵字參數:

對于關鍵字參數,函數的調用者可以傳入任意不受限制的關鍵字參數。至于到底傳入了哪些,需要在函數内部對kw進行檢查

仍然以上述函數為例,我們需要檢查是否有city和job參數

def person(name, age, **kw):
    if 'city' in kw:
        # 有city參數
        pass
    if 'job' in kw:
        # 有job參數
        pass
    print('name:', name, 'age:', age, 'other:', kw)
           

但是調用者仍可以傳入不受限制的關鍵字參數:

>>> person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)
           

如果要限制關鍵字參數的名字,就可以用命名關鍵字參數,例如,隻接收city和job作為關鍵字參數。這種方式定義的函數如下:

def person(name, age, *, city, job):
    print(name, age, city, job)
           

和關鍵字參數**kw不同,命名關鍵字參數需要一個特殊分隔符*,*後面的參數被視為命名關鍵字參數。

Python中自定義可變參數函數 multi()

Python3 實作multi()函數,參數個數不限,傳回所有參數的乘積。

程式内設定參數

設定參數為2,3,4

def multi(*b):
    result=1
    if b:
        for e in b:
            result*=e
        return result
    else:
        return 0
print(multi(2,3,4))
           

輸出結果

24
           

程式外 input() 參數

首先用 list(map()) 将 input() 結果轉換為清單

測試下結果是否為清單

def multi(*b):
    result=1
    if b:
        for e in b:
            result*=e
        return result
    else:
        return 0
numlist=list(map(int,input().split()))
print(multi(numlist))
           

輸出結果

[2, 3, 4]
           

在numlist前加一個*号,*numlist,把清單元素變成可變參數,再測試下

(在程式中增加if判斷清單是否為空)

def multi(*b):
    result=1
    if b:
        for e in b:
            result*=e
        return result
    else:
        return 0
numlist=list(map(int,input().split()))
print(multi(*numlist))
           

輸出結果

24
           
  1. https://blog.csdn.net/qq_39521554/article/details/79069856 ↩︎