函数式编程中,将映射转换为列表时出现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))