私はPythonで次のような練習をしています。
多項式は、指数によって指数が決定されるような係数のタプルとして与えられます。例:(9,7,5)は、9 + 7 * x + 5 * x ^ 2を意味します
与えられたxの値を計算する関数を書く
最近関数型プログラミングに夢中になっているので、私は書きました
def evaluate1(poly, x):
coeff = 0
power = 1
return reduce(lambda accu,pair : accu + pair[coeff] * x**pair[power],
map(lambda x,y:(x,y), poly, range(len(poly))),
0)
私はそれを読めないと思うので、私は書きました
def evaluate2(poly, x):
power = 0
result = 1
return reduce(lambda accu,coeff : (accu[power]+1, accu[result] + coeff * x**accu[power]),
poly,
(0,0)
)[result]
少なくとも読めないので、私は書きました
def evaluate3(poly, x):
return poly[0]+x*evaluate(poly[1:],x) if len(poly)>0 else 0
これはあまり効率的ではないかもしれません(編集:私は間違っていました!)指数の代わりに多くの乗算を使用するため、原則として、ここでは測定について気にしません(編集:私の愚かさ!測定は私の誤解を指摘したでしょう)。それでも、反復的なソリューションほど(おそらく)読み取り可能ではありません。
def evaluate4(poly, x):
result = 0
for i in range(0,len(poly)):
result += poly[i] * x**i
return result
命令型と同じくらい読みやすく、効率が近い純粋に機能的なソリューションはありますか?
確かに、表現の変更は役立ちますが、これは演習によって与えられました。
Pythonだけでなく、HaskellまたはLispにすることもできます。
lambda
、匿名構文関数がより軽い言語と比較して、を使い始めると悪名高いものになります。その一部はおそらく「汚れた」外観に貢献しています。
for
ループを使用しないという意味で純粋に機能的なコード(たとえば、ループを使用しないことも意味します)は、Pythonで目指すのが悪い目標です。変数を慎重に再バインドし、オブジェクトを変更しないことで、ほとんどすべての利点が得られ、コードが無限に読みやすくなります。数値オブジェクトは不変であり、2つのローカル名のみを再バインドするため、「命令型」ソリューションは、「厳密に純粋な」Pythonコードよりも関数型プログラミングの利点をよりよく実現します。