iT邦幫忙

0

*args 和 **kwargs 的使用時機

  • 分享至 

  • xImage

如題,使用的方法跟邏輯都能理解,但還是搞不太清楚該用在什麼樣的時機
想詢問版上的大神的看法

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
猴子
iT邦新手 4 級 ‧ 2022-02-18 18:20:13
最佳解答

我比較常用到的地方是 class 的 super

class A:
  def __init__(self, a, b = "b", c = "c"):
    self.a = a
    self.b = b
    self.c = c

class B(A):
  def __init__(self, *args, **kwargs):
    super(*args, **kwargs)
    print(self.a, self.b, self.c)
  
B("a", c="更新")

data = ["更新"]
dataDict = {
  "b": "更新"
}

B(*data, **dataDict)

不過主要還是看程式中有沒有需要用到這種語法
不用特別注意說在哪要用到


補充: 然後在 javascript 中沒有 ** 這種語法,
只有 類是 python * 的咚咚 -> ... 名字叫展開運算子(Spread syntax) 中文翻得很怪 ww

1
tryit
iT邦研究生 4 級 ‧ 2022-02-15 14:32:22

[Python] *args 和 **kwargs 是什麼?一次搞懂它們!
python 函數的可變參數 *args 和 **kwargs

當你沒有發現到使用時機的時候,就是用不到的時候
當你需要的時候就是使用的時機
我覺得啦,不用硬要去想使用時機是啥

4
froce
iT邦大師 1 級 ‧ 2022-02-15 16:24:33

應該這麼說,*和**代表[解開]

這兩個是在你函式接受的參數數量不固定的時候用,一個是將你的匿名參數依順序組成元組:

def acceptArgs(*args):
# acceptArgs接受[被解開的args(類型tuple)]當作參數
    print(args)
    # 所以這邊可以用args來取得這個tuple
    for i in args:
        print(i)
        
acceptArgs(1, 2, "a")
acceptArgs(1, 2)

一個是將具名參數組成dict

def acceptKargs(**kargs):
# acceptKargs接受[被解開的kargs(類型dict)]當作參數
    print(kargs)
    for i in kargs.items():
        print(i)
        
acceptKargs(a=1, b=2, c="c")
# kargs = {"a":1, "b":2, "c":"c"}

你可以混用,只是要遵守匿名參數在前,具名在後,固定個數參數在前,不固定在後的原則。

def whatEver(var1, var2, *args, ,var3=None, **kargs):
    print(args, kargs)
    
k(1, 2, "a", "b", k1=1, k2=2, k3="c")
# ('a', 'b') {'k2': 2, 'k3': 'c'}

譬如你要寫一個加總的函示,這樣寫你就可以自動將參數變成一個tuple,然後加起來。

def mySum(*args):
    return sum(arg)

也可以用來輸入參數

a = [1, 2, 3]
mySum(*a)
mySum(1, 2, 3)
# 上面兩個函式相同

b = {'a':1, 'b':2, 'c': "c"}
myPrint(**b)
myPrint(a=1, b=2, c="c")
# 上面兩個函式相同

我要發表回答

立即登入回答