我有一个简单的python 功能
def positiveGauss(mean,stdev):
result = -1
while result < 0:
result = mean + np.random.randn()*stdev
return result
是否可以使用 lambda 执行相同的操作?它需要在lambda中进行迭代,但我仍然相信它是可能的。
答案 0 :(得分:5)
为了多元化的目的:
lambda m, s: next(x for x in (m + np.random.randn() * s for _ in iter(int, 1)) if x >= 0)
利用iter
的两参数形式和两个生成器表达式的非递归解决方案。
iter(int, 1)
调用int()
,直到它返回1
,这根本不会发生。因此内部生成器表达式
(m + np.random.randn() * s for _ in iter(int, 1))
是一个无限期地评估和产生m + np.random.randn() * s
的生成器。外部生成器表达式逐个从内部表达式中获取值,但只生成等于或大于零的值。然后next
函数从外部生成器获取第一个值,这是内部生成器与条件匹配的第一个值。
答案 1 :(得分:4)
positive_gauss = lambda mean, stddev, result = -1: positive_gauss(mean, stddev, mean + np.random.randn()*stddev) if result < 0 else result
这是一个递归函数。我会把它分解 -
lambda mean, stddev, result = -1: # takes 3 parameters
positive_gauss(mean, stddev, mean + np.random.randn()*stddev) if result < 0
# ^ Your first condition, if its true call the same function modifying result
else result # if the above one fails just return result.
是的,作为@ juanpa.arrivillaga,不应该使用它,因为它失去了匿名函数的本质。