Python'da şöyle bir egzersiz yapıyorum:
bir polinom, güçler indeksler tarafından belirlenecek şekilde bir dizi katsayı olarak verilir, örneğin: (9,7,5), 9 + 7 * x + 5 * x ^ 2 anlamına gelir
verilen x için değerini hesaplamak için bir fonksiyon yazın
Son zamanlarda fonksiyonel programlamaya başladığım için yazdım
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)
okunamayan sayılırım, bu yüzden yazdım
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]
ki en azından okunamayacak kadar
def evaluate3(poly, x):
return poly[0]+x*evaluate(poly[1:],x) if len(poly)>0 else 0
bu daha az verimli olabilir (değiştir: yanlışmışım!) çünkü üs alma yerine birçok çarpma kullanır, prensip olarak, burada ölçümleri umursamıyorum (değiştir: Ne kadar aptalım! Ölçüm yanlış algımı işaret ederdi!) ve yine de yinelemeli çözüm kadar okunabilir (tartışmasız) değil:
def evaluate4(poly, x):
result = 0
for i in range(0,len(poly)):
result += poly[i] * x**i
return result
Zorunlu olduğu kadar okunabilir ve verimlilikte ona yakın, saf fonksiyonel bir çözüm var mı?
Kuşkusuz, bir temsil değişikliği yardımcı olacaktır, ancak bu tatbikat tarafından verildi.
Haskell veya Lisp de olabilir, sadece Python değil.
lambda
daha açık bir anonim sözdizimi işlevine sahip dillerle karşılaştırıldığında, kullanmaya başladığınızda çok çirkin . Bunun bir kısmı muhtemelen "kirli" görünüme katkıda bulunur.
for
örneğin döngülerin kullanılmaması anlamına gelir ) Python'da amaçlanan kötü bir hedeftir. Değişkenleri mantıklı bir şekilde yeniden bağlamak ve nesneleri mutasyona uğratmamak size neredeyse tüm avantajları sağlar ve kodu sonsuza kadar daha okunabilir hale getirir. Sayı nesneleri değişmez olduğundan ve yalnızca iki yerel adı yeniden hatırlattığından, "zorunlu" çözümünüz, herhangi bir "kesinlikle saf" Python kodundan daha işlevsel programlama erdemlerini daha iyi gerçekleştirir.