如何将随机函数作为参数传递?

时间:2013-03-11 09:18:11

标签: python function random arguments

Python非常灵活,我可以将函数用作列表元素或其他函数的参数。例如:

x = [sin, cos]
y = s[0](3.14) # It returns sin(3.14)

def func(f1, f2):
   return f1(2.0) + f2(3.0)

然而,我不清楚如何对随机函数做同样的事情。例如,我想使用高斯分布:[random.normalvariate(3.0, 2.0), random.normalvariate(1.0, 4.0)]。在这个例子中,我将得到一个包含两个元素的固定列表。但我想得到的是一个包含随机元素的列表。在python中这样做的好方法是什么?

3 个答案:

答案 0 :(得分:8)

使用lambda函数尝试:

[lambda: random.normalvariate(3.0, 2.0), lambda: random.normalvariate(1.0, 4.0)]

你看到与括号的区别。 sin是一个函数,sin(x)是此函数的返回值。由于无法在没有括号表示random.normalvariate(1.0, 4.0)的情况下创建函数,因此必须将其定义为lambda函数。

答案 1 :(得分:7)

使用functools.partiallambda

那些基本相同:

[lambda: normalvariate(3, 2), ...]
# or
[partial(normalvariate, 3, 2), ...]

它们都相当于:

def _function():
    return normalvariate(3, 2)

[_function, ...]

partial更灵活,可以更好地控制_function的创建,并让您避免lambda语法混乱。

顺便说一句,在Python社区中有一些关于lambda的争议,但最后Guido承认finding a superior alternative to the lambda expression is "an impossible quest."

答案 2 :(得分:5)

你应该使用functools中的partial:

import functools
arg_sets = [(3.0, 2.0), (1.0, 4.0)]
myfuncs = [functools.partial(random.normalvariate, *args) for args in arg_sets]
myfuncs[0]()