将多个参数传递给python中的函数的方法

时间:2012-11-25 16:21:12

标签: python python-2.7 parameters parameter-passing

我编写了一个调用函数的python脚本。该函数将7个列表作为函数内部的参数,如下所示:

def WorkDetails(link, AllcurrValFound_bse, AllyearlyHLFound_bse, 
                AlldaysHLFound_bse, AllvolumeFound_bse, 
                AllprevCloseFound_bse, AllchangePercentFound_bse, 
                AllmarketCapFound_bse):

除了link之外的所有参数都是列表。但这使得我的代码看起来很丑陋。我将这些列表传递给此函数,因为该函数在所有这些列表中附加了几个值。我怎样才能以更易读的方式为其他用户做到这一点?

6 个答案:

答案 0 :(得分:4)

测试功能:

您可以使用由*args表示的多个参数和由**kwargs表示的多个关键字并传递给函数:

def test(*args, **kwargs):
    print('arguments are:')
    for i in args:
        print(i)

    print('\nkeywords are:')
    for j in kwargs:
        print(j)

示例:

然后使用任何类型的数据作为参数,并使用与函数关键字一样多的参数。该函数将自动检测它们并将它们分离为参数和关键字:

a1 = "Bob"      #string
a2 = [1,2,3]    #list
a3 = {'a': 222, #dictionary
      'b': 333,
      'c': 444}

test(a1, a2, a3, param1=True, param2=12, param3=None)

<强>输出:

arguments are:
Bob
[1, 2, 3]
{'a': 222, 'c': 444, 'b': 333}

keywords are:
param3
param2
param1

答案 1 :(得分:2)

您可以将其更改为:

def WorkDetails(link, details):

然后将其调用为:

details = [ AllcurrValFound_bse, AllyearlyHLFound_bse, 
            AlldaysHLFound_bse, AllvolumeFound_bse, 
            AllprevCloseFound_bse, AllchangePercentFound_bse, 
            AllmarketCapFound_bse ]
workDetails(link, details)

你可以通过以下方式获得不同的价值:

AllcurrValFound_bse = details[0]
AllyearlyHLFound_bse = details[1]
...

details转换为字典会更加健壮,将变量名称作为键,因此请在几行代码与防御性编程之间选择= p

答案 2 :(得分:1)

如果您不需要为列表使用名称,则可以使用*args

def WorkDetails(link, *args):
    if args[0] == ... # Same as if AllcurrValFound_bse == ...
        ...

 # Call the function:
 WorkDetails(link, AllcurrValFound_bse, AllyearlyHLFound_bse, AlldaysHLFound_bse, AllvolumeFound_bse, AllprevCloseFound_bse, AllchangePercentFound_bse, AllmarketCapFound_bs)

或者你可以使用字典

def WorkDetails(link, dict_of_lists):
    if dict_of_lists["AllcurrValFound_bse"] == ...
        ...

# Call the function
myLists = {
    "AllcurrValFound_bse": AllcurrValFound_bse,
    "AllyearlyHLFound_bse": AllyearlyHLFound_bse,
    ...,
    ...
}
WorkDetails(link, myLists)

答案 3 :(得分:1)

我认为** kwarg的用法更好。 看这个例子:

def MyFunc(**kwargs):
    print kwargs


MyFunc(par1=[1],par2=[2],par3=[1,2,3])

答案 4 :(得分:0)

通常,不建议将超过3个参数传递给函数。这不是python特有的,而是一般的软件设计。您可以阅读有关如何减少传递给函数here的参数数量的更多信息。

遵循先前答案的观点,但从更一般的角度来看,我想补充一点,有几种方法可以使您的代码更具可读性:

  • 将您的函数划分为具有较少参数的较简单函数(定义一个函数,该函数将变量linkspecific_listlist_type。通过执行此操作,您可以在{{{ 1}}函数您使用WorkDetails传递的列表,并将正确的元素添加到list_type
  • 创建传递给您的函数的参数对象/数据结构(这是之前的答案建议使用listsdictionaries ...)

希望得到这个帮助。

答案 5 :(得分:0)

你需要传递那么多列表,这表明你的函数不只做一件事,你应该通过将它分解为更小的函数和/或将它转换为类来重构它。您可以将参数作为关键字传递,或将任意数量的参数传递给函数,如this StackOverflow page所述,但如果您的函数执行的操作超过其他人,则其他人仍然难以阅读和理解一件事。