如何传递不同长度的参数(元组)

2024-05-16 09:50:43 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题可能看起来很基本,但是,我想改进我写的代码。我有一个函数,将需要2或3个参数,取决于一些其他条件。我正在检查长度并用and if语句传递2或3(参见代码)。我确信一定有一种更好、更简洁的方法来重写一行/一句话,而不是使用IIFs。抱歉,我对python还比较陌生

dist = distr.gum 
# ... or: dist = distr.gev 

# parFitHist has length 2 for distr.gum or 3 for distr.gev 
parFitHist = dist.fit(ppt_hist) 

# now I check if 
if len(parFitBase) > 2: 
    # 3 parameters for distr.gev
    t_mp = dist.cdf(ppt_fut, parFitFut[0], parFitFut[1],  parFitBase[2]) 
else:
    # 2 parameters for distr.gum
    t_mp = dist.cdf(ppt_fut, parFitFut[0], parFitFut[1])  

Tags: or代码forifdistmpparameterscdf
3条回答

不确定您拥有什么数据类型以及方法的外观,但使用*args可以解决这个问题:

def cdf(ppt_fut, *params):
    print(ppt_fut)
    print(params)

你可以这样称呼它:

cdf(1, 2, 3, 4) # -> prints: 1 (2,3,4)
cdf(1, 2, 3) # -> prints: 1 (2,3)

在本例中,params是一个元组,包含除第一个参数外的所有参数

可以使用*将列表元素解压到函数调用中

你不需要知道列表中有多少项就可以做到这一点。但这意味着如果项数与函数参数不匹配,则可能会引入错误。因此,检查数据是否有基本的合理性也是一个好主意

例如:

if 1 < len(parFitBase) < 4:
    t_mp = dist.cdf(ppt_fut, *parFitFut)
else:
    raise ValueError('Array must have length 2 or 3')

你可以在这里阅读更多信息:Unpacking Argument Lists

欢迎使用python。请考虑使用pep8格式化代码。这是一个很好的方法来尊重约定,让你的代码更容易被其他人阅读

Variable names应该是小写,并用下划线分隔

关于您的问题,一种改进方法是将len(par_fit_base)传递给函数并在那里执行if子句。这将使它更流畅地阅读代码。这是假设par_fit_fut总是具有相同的长度,而不管par_fit_base

def my_function(par_fit_fut, n):
    if n > 2:
        # one set of routines using par_fit_fut[0:3]
    else:
        # another set of routines using par_fit_fut[0:2]

my_function(par_fit_fut, len(par_fit_base))

相关问题 更多 >