我已经在这个主题上看过以前的堆栈溢出帖子,但是当我尝试运行我的函数时,我仍然无法创建使用这两个命令。我编写了一个简单移动平均线的演示示例,我想通过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逻辑中究竟是什么?我已经尝试输入元组和字典,但这些似乎都不起作用。
答案 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)
data
,lookback
和SMA
不再定义。它可能是:
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):
您的函数现在有两个局部变量args
和kwargs
。一个包含传入的位置参数(作为元组),另一个包含关键字参数(作为字典)。
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
。
答案 3 :(得分:-2)
你可以在PyMentor中了解python中的args和kwargs。希望它能帮助你理解。