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 中做这件事的好方法是什么?

4

3 回答 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 函数。

于 2013-03-11T09:23:03.677 回答
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 表达式的更好替代方案是“不可能完成的任务”。

于 2013-03-11T09:23:46.797 回答
5

您应该使用来自 functools 的部分:

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]()
于 2013-03-11T09:33:38.123 回答