मैंने पायथन में एक अभ्यास किया है:
बहुपद को गुणांक के एक समूह के रूप में दिया जाता है, जैसे कि शक्तियां सूचकांक द्वारा निर्धारित की जाती हैं, जैसे: (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
क्या दक्षता के रूप में पठनीय के रूप में एक शुद्ध-कार्यात्मक समाधान है और दक्षता में इसके करीब है?
बेशक, एक प्रतिनिधित्व परिवर्तन में मदद मिलेगी, लेकिन यह अभ्यास द्वारा दिया गया था।
केवल पायथन ही नहीं, हास्केल या लिस्प भी हो सकते हैं।
lambda
हल्के अनाम सिंटैक्स फ़ंक्शन वाली भाषाओं की तुलना में पायथन थोड़े बदसूरत रूप से बदसूरत हो जाते हैं । इसका एक हिस्सा संभवतः "अशुद्ध" उपस्थिति में योगदान देता है।
for
लूप का उपयोग नहीं करना है, उदाहरण के लिए) पायथन के लिए लक्ष्य करना एक बुरा लक्ष्य है। वैरिएबल को पुन: बाइंड करना और ऑब्जेक्ट को म्यूट नहीं करना आपको लगभग सभी लाभ देता है और कोड को असीम रूप से अधिक पठनीय बनाता है। चूंकि नंबर ऑब्जेक्ट अपरिवर्तनीय हैं और यह केवल दो स्थानीय नामों को याद दिलाता है, इसलिए आपके "अनिवार्य" समाधान किसी भी "सख्ती से शुद्ध" पायथन कोड की तुलना में कार्यात्मक प्रोग्रामिंग गुणों का एहसास करता है।