2016-09-20 116 views
-1

我已經看到了關於此主題的先前的堆棧溢出帖子,但是當我嘗試運行我的函數時,仍然無法創建使用這兩個命令。我編寫了一個簡單移動平均值的演示示例,我想通過參數kwargs命令來運行。python * args和** kwargs

import numpy as np 
def moving_average(data,lookback=7,SMA=True): #MA function 
    if SMA==True: 
     weights=np.repeat(1.0,lookback)/lookback 
     smas=np.convolve(data,weights,'valid') 
     return smas 

只要運行此功能就能按預期工作。

data=np.random.randn(100) #randomly 
moving_average(data,lookback=7,SMA=True) #this outputs the correct set of numbers 

但是,第二次我嘗試添加參數和kwargs它打破。

def test1(*args,**kwargs): 
    return moving_average(data,lookback,SMA) 
test1(data,lookback=7,SMA=True) #this returns an error, saying my global lookback is not defined 

究竟是什麼在*參數** kwargs邏輯我錯了嗎?我試着輸入一個元組和一個字典,但都沒有工作。

+5

這就是...不是args和kwargs的用途。如果你知道參數名稱,而你只是想傳遞它們,爲什麼要使用args/kwargs? –

回答

1

傳遞*args**kwargs你沒有的功能參數(S)和命名參數(S):使用*指定參數和** kwargs

def test1(*args,**kwargs): 
    return moving_average(*args, **kwargs) 
1

在您的例子:

def test1(*args,**kwargs): 
    return moving_average(data,lookback,SMA) 

data,lookbackSMA不再定義。這可能是:

def test1(*args, **kwargs): 
    return moving_average(args[0], kwargs['lookback'], kwargs['SMA']) 

def test1(*args, **kwargs): 
    return moving_average(*args, **kwargs) 

Python的教程有一節,這可能有助於:Unpacking Argument Lists

1
def test1(*args,**kwargs): 

您的功能現在有兩個局部變量,argskwargs。一個保存傳入的位置參數(作爲元組),另一個保存關鍵字參數(作爲字典)。

return moving_average(data,lookback,SMA) 

在這裏,你用三個變量名(數據,回溯和SMA)沒有在你的函數存在,所以你得到一個錯誤。

你可以做

return moving_average(args[0], kwargs['lookback'], kwargs['SMA']) 

但隨後你test1的功能將只與像test1(data,lookback=7,SMA=True)一個確切的調用工作。像test1(data, 7, True)這樣的呼叫將不起作用,因爲那麼參數全部在args中,沒有在kwargs中。

你的功能也可以傳遞參數,正是因爲它接待了他們:

return moving_average(*args, **kwargs) 

這樣的作品,但有向test1功能沒有益處,它只是調用moving_average並返回其結果,爲什麼不叫moving_average直。

相關問題