如何将随机函数作为参数传递?
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函数。