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中这样做的好方法是什么?
答案 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.partial或lambda
那些基本相同:
[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]()