使用地图和减少?
Using map and reduce?
我写了一个函数 mean_normal(n, m, sd) 来计算从正态分布中随机选择的 n 个值的平均值,平均值为 m,标准差为 sd。我想使用 map 和 normalvariate 来生成序列并使用 reduce 来计算平均值,但是我不确定如何执行此操作的语法。这是我目前所拥有的:
from random import normalvariate
average = lambda L: sum(L)/len(L)
mean_normal = lambda n, m, sd: average([normalvariate(m, sd) for i in range(n)])
print(mean_normal(10, 5, 2))
我知道我通常需要像 list(map(lambda i: ..., range(n)) 这样的东西,但我不太确定那是对的。
出于教育目的:
>>> mean_normal2 = lambda n, m, sd: average(map(lambda _: normalvariate(m, sd), range(n)))
>>> mean_normal2(10, 5, 2)
4.749961072139493
诀窍是忽略 lambda 的参数。但是,您最好使用 itertools
:
中的 repeatfunc
食谱之类的东西
def repeatfunc(func, times=None, *args):
"""Repeat calls to func with specified arguments.
Example: repeatfunc(random.random)
"""
if times is None:
return starmap(func, repeat(args))
return starmap(func, repeat(args, times))
我把它留作练习。
我写了一个函数 mean_normal(n, m, sd) 来计算从正态分布中随机选择的 n 个值的平均值,平均值为 m,标准差为 sd。我想使用 map 和 normalvariate 来生成序列并使用 reduce 来计算平均值,但是我不确定如何执行此操作的语法。这是我目前所拥有的:
from random import normalvariate
average = lambda L: sum(L)/len(L)
mean_normal = lambda n, m, sd: average([normalvariate(m, sd) for i in range(n)])
print(mean_normal(10, 5, 2))
我知道我通常需要像 list(map(lambda i: ..., range(n)) 这样的东西,但我不太确定那是对的。
出于教育目的:
>>> mean_normal2 = lambda n, m, sd: average(map(lambda _: normalvariate(m, sd), range(n)))
>>> mean_normal2(10, 5, 2)
4.749961072139493
诀窍是忽略 lambda 的参数。但是,您最好使用 itertools
:
repeatfunc
食谱之类的东西
def repeatfunc(func, times=None, *args):
"""Repeat calls to func with specified arguments.
Example: repeatfunc(random.random)
"""
if times is None:
return starmap(func, repeat(args))
return starmap(func, repeat(args, times))
我把它留作练习。