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

Rom*_*man 8 python random arguments function

Python非常灵活,我可以将函数用作列表元素或其他函数的参数.例如:

x = [sin, cos]
y = s[0](3.14) # It returns sin(3.14)
Run Code Online (Sandbox Code Playgroud)

要么

def func(f1, f2):
   return f1(2.0) + f2(3.0)
Run Code Online (Sandbox Code Playgroud)

但是,我不清楚如何对随机函数进行相同的操作.例如,我想使用高斯分布:[random.normalvariate(3.0, 2.0), random.normalvariate(1.0, 4.0)].在这个例子中,我将得到一个包含两个元素的固定列表.但我想得到的是一个包含随机元素的列表.在python中执行此操作的好方法是什么?

eum*_*iro 8

尝试使用lambda功能:

[lambda: random.normalvariate(3.0, 2.0), lambda: random.normalvariate(1.0, 4.0)]
Run Code Online (Sandbox Code Playgroud)

你看到与括号的区别.sin是一个函数,sin(x)是这个函数的返回值.由于无法在没有括号表示的情况下创建函数random.normalvariate(1.0, 4.0),因此必须将其定义为lambda函数.


Jak*_* M. 7

使用functools.partiallambda

那些基本相同:

[lambda: normalvariate(3, 2), ...]
# or
[partial(normalvariate, 3, 2), ...]
Run Code Online (Sandbox Code Playgroud)

它们都相当于:

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

[_function, ...]
Run Code Online (Sandbox Code Playgroud)

partial更灵活,可以更好地控制创建,_function并让您避免lambda语法混乱.

顺便说一下,在Python社区中有一些关于lambda的争议,但最后Guido承认,找到一个替代lambda表达的优秀选择是"一个不可能的任务".


Sim*_*got 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]()
Run Code Online (Sandbox Code Playgroud)