lambda函数中的python迭代过程

lambda函数中的python迭代过程,python,loops,lambda,Python,Loops,Lambda,我有一个简单的python函数 def positiveGauss(mean,stdev): result = -1 while result < 0: result = mean + np.random.randn()*stdev return result def positiveGauss(平均值,标准偏差): 结果=-1 结果

我有一个简单的python函数

def positiveGauss(mean,stdev):
        result = -1
        while result < 0:
                result = mean + np.random.randn()*stdev
        return result
def positiveGauss(平均值,标准偏差):
结果=-1
结果<0时:
结果=平均值+np.random.randn()*stdev
返回结果
是否可以使用lambda执行相同的技巧?它需要在lambda内部进行迭代,但我仍然相信这是可能的。

如果结果<0,则为正高斯=lambda平均值,stddev,result=-1:正高斯(平均值,stddev,mean+np.random.randn()*stddev)
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.
lambda-mean,stddev,result=-1:#取3个参数
如果结果小于0,则为正高斯(平均值,标准差分,平均值+np.random.randn()*标准差分)
#^如果第一个条件为真,则调用相同的函数修改结果
else result#如果上述方法失败,则返回结果。
是的,作为@juanpa.arrivillaga,不应该使用它,因为它失去了匿名函数的本质。

为了多样性:

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()。因此,内部生成器表达式

(m + np.random.randn() * s for _ in iter(int, 1))

是一个生成器,它计算并无限期地生成
m+np.random.randn()*s
。外部生成器表达式逐个从内部表达式获取值,但只生成等于或大于零的值。然后,
next
函数从外部生成器获取第一个值,这是内部生成器根据条件生成的第一个值。

AFAIK,no,这在lambdaDo中是不可能的。您绝对想在
时去掉
?因为有一种统计方法可以做到这一点。与逆规范化函数有关。从区间[0,t](其中0mean
stdev
@Elmex80s我需要截断正态分布。分布必须是正态分布。这是我以前的统计课本上的想法,也许不是最好的。很好,但你们应该指出,人们永远不会使用这个。事实上,由于您已经命名了lambda,它实际上并不符合lambda函数的精神。@hashcode55它真的很酷!非常感谢。我不知道lambda可以是递归的,是的,确实可以。Lambda函数的灵感来自函数编程,其中只有递归。没有循环。经过非常仔细的思考,我决定@vaultah解决方案更好。如果mean为负,这不是堆栈或内存溢出,我们寻找的是正态分布的一小部分。@是的,递归在python中确实会遇到这个问题(没有TCO)。我也喜欢vaultah的解决方案!看起来很有效,但为什么?!你能更好地解释一下整个结构吗?@rth:我加了解释,嗯,我也喜欢。真的不知道哪种解决方案更好,你的还是@hashcode55。两者都有道理。谢谢你。@啊,我真想用这个打高尔夫球!哈哈