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中执行此操作的好方法是什么?
尝试使用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函数.
使用functools.partial或lambda
那些基本相同:
[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表达的优秀选择是"一个不可能的任务".
你应该使用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)
| 归档时间: |
|
| 查看次数: |
447 次 |
| 最近记录: |