我编写了一个调用函数的python脚本。该函数将7个列表作为函数内部的参数,如下所示:
def WorkDetails(link, AllcurrValFound_bse, AllyearlyHLFound_bse,
AlldaysHLFound_bse, AllvolumeFound_bse,
AllprevCloseFound_bse, AllchangePercentFound_bse,
AllmarketCapFound_bse):
除了link
之外的所有参数都是列表。但这使得我的代码看起来很丑陋。我将这些列表传递给此函数,因为该函数在所有这些列表中附加了几个值。我怎样才能以更易读的方式为其他用户做到这一点?
答案 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的参数数量的更多信息。
遵循先前答案的观点,但从更一般的角度来看,我想补充一点,有几种方法可以使您的代码更具可读性:
link
,specific_list
,list_type
。通过执行此操作,您可以在{{{ 1}}函数您使用WorkDetails
传递的列表,并将正确的元素添加到list_type
)希望得到这个帮助。
答案 5 :(得分:0)
你需要传递那么多列表,这表明你的函数不只做一件事,你应该通过将它分解为更小的函数和/或将它转换为类来重构它。您可以将参数作为关键字传递,或将任意数量的参数传递给函数,如this StackOverflow page所述,但如果您的函数执行的操作超过其他人,则其他人仍然难以阅读和理解一件事。