私は、ユーザーが長方形の量、開始、および停止を指定する関数の積分を見つけるためのプログラムに取り組んでいました。
注:長方形の左端の点を使用しています。
私は機能が完璧に機能しています(少なくとも、完璧に見えます)。しかし、私はそれのためにワンライナーを書くことができるかどうかを見たかったのですが、私が使用しているのでどのようにすればいいのかわかりません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
ます。
ありがとう!