函数式编程中,将映射转换为列表时出现Python错误

函数式编程中,将映射转换为列表时出现Python错误,python,python-3.x,functional-programming,Python,Python 3.x,Functional Programming,我需要重写一个用蒙特卡罗法计算面积的程序。 因此,我尝试使用函数式编程,但在将地图转换为列表时出错: 这是一个密码 a=list(map((lambda x,y: math.sqrt((25/100)-(x*x))-y)(random.uniform(-1/2, 0), random.uniform(0, 1/2)), [1]*1000)) 我得到一个错误 TypeError: 'float' object is not callable (lambda只是一个数学函数) 编辑 我这样重写

我需要重写一个用蒙特卡罗法计算面积的程序。 因此,我尝试使用函数式编程,但在将地图转换为列表时出错:

这是一个密码

a=list(map((lambda x,y: math.sqrt((25/100)-(x*x))-y)(random.uniform(-1/2, 0),  random.uniform(0, 1/2)), [1]*1000))
我得到一个错误

TypeError: 'float' object is not callable
(lambda只是一个数学函数)

编辑 我这样重写:

a = list(map(lambda x, y: math.sqrt((25 / 100) - (x * x)) - y,
         list(map(lambda a, b: random.uniform(a, b), [-1/2]*1000, [0]*1000)), list(map(lambda a, b: random.uniform(a, b), [0]*1000, [1/2]*1000))))
a=list(map(
    lambda _: (
        (lambda x,y: math.sqrt((25/100)-(x*x))-y)(
            random.uniform(-1/2, 0),  
            random.uniform(0, 1/2)
        ),
    )
    [1]*1000
))

也许你可以试试这个:

a = list(map(lambda x, y: math.sqrt((25 / 100) - (x * x)) - y,
         [random.uniform(-1 / 2, 0) for _ in range(1000)], [random.uniform(0, 1 / 2) for _ in range(1000)]))
错误是由于不正确地使用映射函数,而不是将映射结果转换为列表造成的

map的第一个参数应该是一个函数,而在您的例子中,它是通过调用函数计算的浮点数:

(lambda x,y: math.sqrt((25/100)-(x*x))-y)(random.uniform(-1/2, 0),  random.uniform(0, 1/2))
(lambda x,y: math.sqrt((25/100)-(x*x))-y)

map
的第一个参数应该是一个函数/可调用的

lambda
表达式是函数文本(返回函数):

但是你马上调用它,它返回一个浮点:

(lambda x,y: math.sqrt((25/100)-(x*x))-y)(random.uniform(-1/2, 0)
您需要修复表达式,使其不调用lambda,正确的格式通常会暴露这些问题,下面是格式更好的表达式:

a=列表(映射)(
(λx,y:数学sqrt((25/100)-(x*x))-y)(
随机。均匀(-1/2,0),
随机。均匀(0,1/2)
),
[1]*1000
))
这显然毫无意义

您可能需要以下内容:

a = list(map(lambda x, y: math.sqrt((25 / 100) - (x * x)) - y,
         list(map(lambda a, b: random.uniform(a, b), [-1/2]*1000, [0]*1000)), list(map(lambda a, b: random.uniform(a, b), [0]*1000, [1/2]*1000))))
a=list(map(
    lambda _: (
        (lambda x,y: math.sqrt((25/100)-(x*x))-y)(
            random.uniform(-1/2, 0),  
            random.uniform(0, 1/2)
        ),
    )
    [1]*1000
))

a=列表(映射)(
λx,y:数学sqrt((25/100)-(x*x))-y),
(随机均匀(-1/2,0)用于范围(1000)内的uu),
(范围(1000)内的随机均匀(0,1/2),
)

由于所有工作都是在线完成的,所以很难看到您在做什么。所以,让我们试着打开它,看看出了什么问题

这是lambda函数:

(lambda x,y: math.sqrt((25/100)-(x*x))-y)(random.uniform(-1/2, 0),  random.uniform(0, 1/2))
(lambda x,y: math.sqrt((25/100)-(x*x))-y)
def foo(x,y):
返回数学sqrt(25/100)-x*x-y
您正在点
random.uniform(-1/2,0),random.uniform(0,1/2)
中调用此函数。然后,您将应用一个
映射
——但您已经调用了lambda,因此它不再是一个函数,而是上述点的一个求值(例如
浮点
)。因此,由于
map
需要一个函数作为其第一个参数,因此会出现此错误

我假设你要做的是,从你的随机变量中提取1000个观察值,并将它们应用到你的函数中。您可以使用以下代码执行此操作:

def foo(x,y):
返回数学sqrt(25/100)-x*x-y
out=[]
对于范围(1000)内的i:
out.append(foo(random.uniform(-1/2,0),random.uniform(0,1/2)))
或者,作为一个衬里:

list(map(lambda u2;:math.sqrt(25/100)-random.uniform(-1/2,0)**2-random.uniform(0,1/2),[1]*1000))

我想这就是你想要的:

a=list(map((lambda x,y: math.sqrt((25/100)-(x*x))-y), [random.uniform(-1/2, 0) for i in range(1000)],  [random.uniform(0, 1/2) for i in range(1000)]))

因为lambda不便于阅读,现在不建议阅读。

映射函数中是否缺少逗号?介于lambda函数和iterable之间。我对函数编程是新手,我的老师不允许我们使用范围内的I或任何循环。for i是否在范围内正确?@KaczkaDziwaczka这里的for循环用于生成随机数。如果要避免使用for循环,一种方法是直接在函数中生成随机数:
a=list(map(lambda:math.sqrt((25/100)-(random.uniform(-1/2,0)**2))-random.uniform(0,1/2),['foobar']*1000))