我正在开发一个程序来查找函数的积分,其中用户指定矩形的数量、起点和终点。
注意:我使用的是矩形的左端点。
我的功能运行良好(至少,它看起来很完美)。但是,我想看看我是否可以为它写一个单行,但不确定如何,因为我正在使用eval()
. 这是我的原始代码:
def integral(function, n=1000, start=0, stop=100):
"""Returns integral of function from start to stop with 'n' rectangles"""
increment, rectangles, x = float((stop - start)) / n, [], start
while x <= stop:
num = eval(function)
rectangles.append(num)
if x >= stop: break
x += increment
return increment * sum(rectangles)
这工作正常:
>>> integral('x**2')
333833.4999999991
实际答案是1000000/3
,所以我的函数给出了一个很好的估计(仅适用于 1000 个矩形)。
我对单线的尝试:
def integral2(function, n=1000, start=0, stop=100): rectangles = [(float(x) / n) for x in range(start*n, (stop*n)+1)]; return (float((stop-start))/n) * sum([eval(function) for x in rectangles])
但是,这并不是真正的单行,因为我使用的是分号。此外,它有点慢(需要几秒钟的时间,这非常重要)并且给出了错误的答案:
>>> integral2('x**2')
33333833.334999967
那么,是否可以为该功能使用单线解决方案?我不确定如何在eval()
同float(x)/n
一个列表理解中实现。float(x)/n
在函数中实现了一个虚拟的“步骤” range
。
谢谢!