我在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
是否有一个纯功能性的解决方案像当务之急那样可读并且在效率上接近它?
诚然,更改表示形式会有所帮助,但这是通过练习给出的。
也可以是Haskell或Lisp,而不仅仅是Python。
lambda
与使用较轻的匿名语法功能的语言相比,使用时Python非常难看。部分原因可能是“不干净”的外观。
for
循环)的意义上,纯函数式代码是Python的目标。明智地重新绑定变量而不更改对象可以为您带来几乎所有的好处,并使代码无限地可读。由于数字对象是不可变的,并且仅重新绑定了两个本地名称,因此您的“命令式”解决方案比任何“严格的纯” Python代码更好地实现了功能编程的美德。