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

8 投票
3 回答
942 浏览
提问于 2025-04-17 18:40

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 个回答

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

使用 functools.partial 或者 lambda

这两者基本上是一样的:

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

它们都可以看作是:

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

[_function, ...]

partial 更灵活,能让你更好地控制 _function 的创建,并且可以避免使用 lambda 语法时的繁琐。

顺便提一下,Python 社区对 lambda 有过一些争论,但最后 Guido 承认,找到一个比 lambda 表达式更好的替代方案是“一个不可能的任务”。

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

撰写回答