我正在开发一个程序来查找函数的积分,其中用户指定矩形的数量、起点和终点。
注意:我使用的是矩形的左端点。
我的功能运行良好(至少,它看起来很完美)。但是,我想看看我是否可以为它写一个单行,但不确定如何,因为我正在使用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。
谢谢!