python * args和** kwargs

时间:2016-09-20 14:27:21

标签: python args kwargs

我已经在这个主题上看过以前的堆栈溢出帖子,但是当我尝试运行我的函数时,我仍然无法创建使用这两个命令。我编写了一个简单移动平均线的演示示例,我想通过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

然而第二次我尝试添加args和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

我错误地在* args ** kwargs逻辑中究竟是什么?我已经尝试输入元组和字典,但这些似乎都不起作用。

4 个答案:

答案 0 :(得分:2)

*args**kwargs传递给您的函数而不是参数和命名参数:

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

答案 1 :(得分:2)

在使用* args和** kwargs的示例中:

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

datalookbackSMA不再定义。它可能是:

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

答案 2 :(得分:2)

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)这样的调用不起作用,因为参数全部在argskwargs中没有。)

您的功能也可以完全按照收到的参数传递参数:

return moving_average(*args, **kwargs)

虽然有效,但test1函数没有任何好处,只需调用moving_average并返回结果,为什么不直接调用moving_average

答案 3 :(得分:-2)

你可以在PyMentor中了解python中的args和kwargs。希望它能帮助你理解。

how to understand args and kwargs in python