Python - 将一个参数的多个值发送给函数

时间:2015-07-23 14:04:28

标签: python

我是Python新手,所以如果这很愚蠢,请原谅..

是否有方法将多个变量发送到单个函数?举个例子:

pe.plot_chart(conn,7760,'DataSource1',123,save=True)

上面的函数连接到SQL,它从datasource1(uniqueid 123)中提取唯一ID 7760的数据。我可以使用某种方法为DataSource1字段发送多个条件吗? e.g。

pe.plot_chart(conn,7760,['DataSource1','DataSource2'],[123,345],save=True)

pe.plot_chart是由我创建的,因此必须对其进行任何修改以使其正常工作

这种操作是否可以执行?

编辑:添加一些额外的信息。

plot_chart函数..它绘制了一个图表,并将其保存到上面的位置。函数的每次调用都产生一个图形,我希望通过为参数发送多个值,我可以让函数动态地向图中添加更多的序列。

因此,如果我将4个数据源发送到该函数,我将在图上最终得到4行。出于这个原因,我不确定循环数据源集合会不会很好(只用一行产生4个图?)

3 个答案:

答案 0 :(得分:2)

是的,您可以在python中向函数发送多个参数,但这不应该是一个惊喜。你不能做的是在关键字参数之后使用位置参数,即不允许f(1, foo=2, 3)之类的调用(因为这个原因,你的例子是无效的)。

此外,严格意义上说,您不能为单个参数提供多个值,但是您可以为单个参数提供列表或元组,例如f(1, foo=(2, 3))是可接受的,并且您的函数可能会将其解释为正在为foo参数提供两个值(但实际上它只是一个元组)。

缺点是函数必须能够区分元组作为参数和作为单个参数的元素。最简单的方法是坚持认为参数应该是一个元组或者至少是可迭代的。该功能必须看起来像:

def f(foo, bar):
    for x in foo:
        do_something(bar, x)

f(bar=fubar, foo=(arg1, arg2, arg3))
f((arg1, arg2, arg3), bar=fubar) # same as previous line
f((arg1, arg2, arg3), fubar) # same as previous line

另一个更高级的替代方法是使用关键字参数除了使用变量参数列表的多个参数之外的所有内容,但是这在python2中有些笨重,因为除非你手动解包,否则你需要提供所有参数作为位置关键字参数,在python3中有一些缓解,因为你可以强制使用关键字参数:

def f(*args, bar=fubar):
    for x in args:
        do_something(bar, x)

f(arg1, arg2, arg3, bar=fubar) 
# f(fubar, arg1, arg2, arg3) is not allowed

然后每个不是关键字参数的参数(仍然是那些位置参数必须是第一个参数)将以args结尾,并且bar参数需要作为关键字参数传递。

在python2中,上面需要:

def f(*args, **kwds):
    bar = kwds.get("bar", fubar)

    for x in args:
        do_something(bar, x)

答案 1 :(得分:0)

data_sources = [data_source1, data_source2, data_source3]

for source in data_sources:
   pe.plotchart(connection, uniqueid = 7760, source...)

有各种方法可以解决这个问题 - 如果你想将一个可迭代的(如列表)发送到你的函数并让函数迭代它们,你可以这样做。您也可以从循环中调用该函数。如果其他参数将在每次迭代时发生变化,请查看" zip",这对于配对数据进行循环非常有用。

答案 2 :(得分:0)

在您的案例中,可以将数据源规范与唯一ID配对。这是一个包含元组列表的简单方法:

def myFunc(values):
    for v in values:
        print v[0], v[1]

myFunc([("hello", 1), ("world", 2)])

如果需要对每一行进行更多描述,列表元素也可以扩展为类。这个翻转的好处是你正在处理一个行描述符列表(由元组表示),而不是松散耦合的“参数”。

输出BTW是这样的:

hello 1
world 2

您的具体案例将更改为此

pe.plot_chart(conn,7760,[('DataSource1',123),('DataSource2',345)],save=True)