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

8

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中实现这一点?


你的意思我没有完全理解,你是在寻找可变数量参数吗?http://docs.python.org/2/tutorial/controlflow.html#arbitrary-argument-lists - Pheonix
3个回答

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函数。


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承认寻找lambda表达式的更好替代方案是“不可能的任务”。


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]()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接