अपने मूल प्रश्न में, आप से पूछा "क्यों आप किसी अन्य विधि के माध्यम से एक विधि के लिए परिभाषा पास करना चाहते हैं?" फिर, एक टिप्पणी में, आपने पूछा "आप विधि के वास्तविक स्रोत कोड को अभी क्यों संशोधित नहीं करते?" मुझे वास्तव में लगता है कि यह एक बहुत अच्छा सवाल है, और हाथ से लहराए बिना जवाब देने में मुश्किल होती है, क्योंकि जब आपका कोड जटिलता के एक निश्चित स्तर तक पहुंच जाता है तो सजावटी केवल वास्तव में उपयोगी हो जाते हैं। हालांकि, मुझे लगता है कि यदि आप निम्न दो कार्यों पर विचार सज्जाकार की बात स्पष्ट हो जाएगा:
def add_x_to_sequence(x, seq):
result = []
for i in seq:
result.append(i + x)
return result
def subtract_x_from_sequence(x, seq):
result = []
for i in seq:
result.append(i - x)
return result
अब, इन दोनों उदाहरण कार्यों कुछ खामियां है - वास्तविक जीवन में, उदाहरण के लिए, तो आप शायद सिर्फ पुनर्लेखन था सूची comprehensions के रूप में उन्हें - लेकिन पल के लिए स्पष्ट खामियों पर ध्यान न दें, और नाटक है कि हम उन्हें इस तरह से लिखते हैं, for
छोरों दृश्यों से अधिक पुनरावृत्ति के रूप में होना चाहिए करते हैं। अब हम समस्या यह है कि हमारे दो कार्य लगभग एक ही बात कर सामना करते हैं, सिर्फ एक ही चाबी पल में अंतर होता है। इसका मतलब है कि हम खुद को दोहरा रहे हैं! और यह एक समस्या है। अब हमें कोड की अधिक लाइनों को बनाए रखना है, बग्स के लिए और अधिक जगह छोड़ना है, और दिखाई देने के बाद बग को छिपाने के लिए और अधिक जगह है।
इस समस्या का एक प्रमुख दृष्टिकोण एक समारोह बनाने के लिए लेता है कि एक समारोह है, और एक अनुक्रम में यह लागू होता है, इस तरह हो सकता है:
def my_map(func, x, seq):
result = []
for i in seq:
result.append(func(i, x))
return result
अब सब हम क्या करना है विशिष्ट funcs परिभाषित है my_map
को पारित करने के लिए (जो वास्तव में सिर्फ निर्मित map
समारोह की एक विशेष संस्करण है)।
def sub(a, b):
return a - b
def add(a, b):
return a + b
और हम उन्हें इस तरह का उपयोग कर सकते हैं:
added = my_map(sub, x, seq)
लेकिन इस दृष्टिकोण अपनी समस्या है। उदाहरण के लिए, हमारे मूल स्टैंड-अलोन फ़ंक्शंस से पढ़ने के लिए थोड़ा कठिन है; और हर बार जब हम जोड़ सकते हैं या मदों की एक सूची से x
घटाना चाहते हैं, हम समारोह और तर्क के रूप में मूल्य निर्दिष्ट करना होगा। कि पठनीयता में सुधार होता है, और यह आसान समझने के लिए हमारे कोड में हो रहा है बनाने - हम इस एक बहुत कुछ कर रहे हैं, हम इसके बजाए एक ही समारोह ऐसा नाम है जो हमेशा एक ही कार्रवाई के लिए संदर्भित करता होगा। हम एक और समारोह में ऊपर लपेट सकता है ...
def add_x_to_sequence(x, seq):
return my_map(add, x, seq)
लेकिन अब हम अपने आप को बार-बार दोहराने कर रहे हैं!और हम अपने नामस्थान को छेड़छाड़ करने, कार्यों का प्रसार भी कर रहे हैं।
डेकोरेटर इन समस्याओं से बाहर एक रास्ता प्रदान करते हैं। फ़ंक्शन को किसी अन्य फ़ंक्शन पर हर बार पर पास करने के बजाय, हम इसे एक बार पास कर सकते हैं।
def vectorize(func):
def wrapper(x, seq):
result = []
for i in seq:
result.append(func(i, x))
return result
return wrapper
अब सब हम क्या करना है एक समारोह को परिभाषित करने और यह ऊपर के पास है, यह लपेटकर है:
def add_x_to_sequence(a, b):
return a + b
add_x_to_sequence = vectorize(add_x_to_sequence)
या, डेकोरेटर सिंटैक्स का उपयोग:
पहले हम एक आवरण समारोह को परिभाषित
@vectorize
def add_x_to_sequence(a, b):
return a + b
अब हम कई अलग अलग vectorize
घ कार्यों में लिख सकते हैं, और उन्हें के सभी के लिए हमारे for
तर्क सिर्फ एक में होता है pl इक्का। अब हमें अलग-अलग कार्यों को अलग-अलग ठीक या अनुकूलित करने की आवश्यकता नहीं है; हमारे सभी लूप-संबंधित बग और लूप से संबंधित अनुकूलन एक ही स्थान पर होते हैं; और हम अभी भी विशेष रूप से परिभाषित कार्यों के सभी पठनीयता लाभ प्राप्त करते हैं।
आपकी सभी मदद के लिए बहुत बहुत धन्यवाद! मैं बहुत सराहना करता हूं कि यह कितना स्पष्ट था। –