Python 通过*或将参数传递给函数**

Python 通过*或将参数传递给函数**,python,packing,Python,Packing,有(比如)两个函数,norm和uniform,它们都采用参数scale和loc。 我想要一个名为pick_a_distribution的函数,它选择要选择的分布,然后分配适当的参数,并执行其他一些操作。但我也希望用户能够为一个参数定义(比如)一个值并只传递该值,而不是必须定义整个参数列表 如果我传递完整的参数列表(因此我需要知道我不想传递的参数的默认值是什么),我已经成功地编写了一些代码 是否有更有效的方法(在上面的示例中,是否有方法只传递'loc'参数) 下面是一些有效的代码 from sci

有(比如)两个函数,norm和uniform,它们都采用参数scale和loc。 我想要一个名为pick_a_distribution的函数,它选择要选择的分布,然后分配适当的参数,并执行其他一些操作。但我也希望用户能够为一个参数定义(比如)一个值并只传递该值,而不是必须定义整个参数列表

如果我传递完整的参数列表(因此我需要知道我不想传递的参数的默认值是什么),我已经成功地编写了一些代码

是否有更有效的方法(在上面的示例中,是否有方法只传递'loc'参数)

下面是一些有效的代码

from scipy.stats import norm, genlogistic, uniform, expon
import math

distribution = {'1': 'normal', '2': 'uniform', '3': 'genlogistic', '4': 'exponential', '5': 'error'}
def mydistr(distr,numofsims, myargument):
    switcher = {
        '1': norm(*myargument),
        '2': uniform(*myargument),
        '3': genlogistic(*myargument),
        '4': expon(*myargument)
    }
    myobs = switcher.get(distr, 'Error in getting distribution')
    return myobs.rvs(numofsims)


print(mydistr( myargument = [2,80], numofsims = 100000, distr = '2' ).mean())
还有一些没有。(进口与以前相同)

我还尝试在最后一次调用中为myargument提供以下内容: =({loc:80}),=(loc,80)并尝试使用“loc”

我得到的名称“loc”没有定义,当我把它放在“”中时,我得到一些比较错误


非常感谢您的任何意见:)

这是否回答了您的问题?你能阐明你的目标吗?这似乎是一个错误。既然客户端代码无论如何都必须选择发行版,而且还必须传递其所有参数,那么为什么不采用完全构造的发行版呢?请注意,您的切换代码是有缺陷的:它会创建所有发行版(即使是未使用的发行版),并通过隐藏查找错误来延迟错误。您的第二个切换代码要求
myargument
同时是关键字(通过
**
)和位置(通过
*
)。我试图通过只传递非默认值来提高代码的效率。这只是一个例子,我可能有很多其他的函数,我想应用这个。对MisterMiyagi来说:第二个切换代码是匆忙编写的——目的是所有代码要么*要么**。哈伦:谢谢你的建议——我学到的一件事是,我应该把我的论点放在列表的末尾,而不是开头——但仍然不起作用。我知道uniform(loc=80)可以工作,但不确定如何通过将参数传递给另一个函数来获得相同的结果。
    def mydistr(distr,numofsims, myargument):
        switcher = {
            '1': norm(*myargument),
            '2': uniform(**myargument),
            '3': genlogistic(*myargument),
            '4': expon(*myargument)
        }
        myobs = switcher.get(distr, 'Error in getting distribution')
        return myobs.rvs(numofsims)

    print(mydistr( myargument = {loc:80}, numofsims = 100000, distr = '2' ).mean())