निम्नलिखित python2 कोड पर विचार करें
In [5]: points = [ (1,2), (2,3)]
In [6]: min(points, key=lambda (x, y): (x*x + y*y))
Out[6]: (1, 2)
यह python3 में समर्थित नहीं है और मुझे निम्नलिखित कार्य करने हैं:
>>> min(points, key=lambda p: p[0]*p[0] + p[1]*p[1])
(1, 2)
यह बहुत बदसूरत है। यदि लंबोदर एक समारोह था, तो मैं कर सकता था
def some_name_to_think_of(p):
x, y = p
return x*x + y*y
Python3 में इस सुविधा को हटाने से कोड को या तो बदसूरत तरीके से (जादू अनुक्रमित के साथ) करने या अनावश्यक कार्य करने के लिए मजबूर करता है (सबसे अधिक परेशान करने वाला हिस्सा इन अनावश्यक कार्यों के लिए अच्छे नामों के बारे में सोचना है)
मुझे लगता है कि कम से कम लैम्बदास को फीचर को वापस जोड़ा जाना चाहिए। क्या कोई अच्छा विकल्प है?
अद्यतन: मैं उत्तर में विचार का विस्तार करने वाले निम्नलिखित सहायक का उपयोग कर रहा हूं
def star(f):
return lambda args: f(*args)
min(points, key=star(lambda x,y: (x*x + y*y))
Update2: के लिए एक क्लीनर संस्करणstar
import functools
def star(f):
@functools.wraps(f):
def f_inner(args):
return f(*args)
return f_inner
lambdaउसी भावना से विरोध करता है जैसे वह विरोध करता है map, reduceऔर filter।
lambdapy3k में हटाने के लिए स्लेट किया गया था क्योंकि यह मूल रूप से भाषा पर एक दोष है। लेकिन कोई भी अनाम कार्यों को परिभाषित करने के लिए एक उचित विकल्प पर सहमत नहीं हो सकता है, इसलिए अंततः गुइडो ने हार में अपने हथियार फेंक दिए और वह यही था।
mapऔर filterसमझ से सबसे अच्छी जगह है, मुझे पसंद है reduce)
lambdaभाषा से पूरी तरह से हटा दिए जाने के बाद संभवतः उन परिवर्तनों को रिवर्स करने की संभावना है जो इसे उपयोग करने के लिए कठिन बना रहे हैं, लेकिन आप अजगर-विचारों पर पोस्ट करने का प्रयास कर सकते हैं यदि आप फीचर को वापस देखने की इच्छा व्यक्त करना चाहते हैं।