अजगर में, यह करने के लिए बेहतर शैली माना जाता है:अजगर में, आंशिक समारोह आवेदन (currying) बनाम स्पष्ट फ़ंक्शन परिभाषा
- स्पष्ट रूप से अधिक सामान्य, संभवतः आंतरिक उपयोग, कार्य के संदर्भ में उपयोगी कार्यों को परिभाषित; या,
- फ़ंक्शन करीइंग का स्पष्ट रूप से वर्णन करने के लिए आंशिक फ़ंक्शन एप्लिकेशन का उपयोग करें?
मैं एक प्रश्न के उदाहरण के माध्यम से अपने प्रश्न की व्याख्या करूंगा।
मान लीजिए कि कोई एक फ़ंक्शन लिखता है, _sort_by_scoring, जिसमें दो तर्क होते हैं: एक स्कोरिंग फ़ंक्शन और आइटम की एक सूची। यह मूल सूची में प्रत्येक आइटम की स्थिति के आधार पर स्कोर द्वारा क्रमबद्ध मूल सूची की एक प्रति देता है। दो उदाहरण स्कोरिंग फ़ंक्शंस भी प्रदान किए जाते हैं।
def _sort_by_score(scoring, items_list):
unsorted_scored_list = [(scoring(len(items_list), item_position), item) for item_position, item in enumerate(items_list)]
sorted_list = [item for score, item in sorted(unsorted_scored_list)]
return sorted_list
def _identity_scoring(items_list_size, item_position):
return item_position
def _reversed_scoring(items_list_size, item_position):
return items_list_size - item_position
फ़ंक्शन _sort_by_score को सीधे कभी नहीं कहा जाता है; इसके बजाए, इसे अन्य सिंगल-तर्क फ़ंक्शंस द्वारा बुलाया जाता है जो स्कोरिंग फ़ंक्शन और उनके अकेले तर्क (आइटम्स की एक सूची) को _sort_by_scoring पर पास करते हैं और परिणाम लौटाते हैं।
# Explicit function definition style
def identity_ordering(items_list):
return _sort_by_score(_identity_scoring, items_list)
def reversed_ordering(items_list):
return _sort_by_score(_reversed_scoring, items_list)
जाहिर है, यह इरादा फ़ंक्शन करी के संदर्भ में बेहतर व्यक्त किया गया है। (या तो मामले में)
# Curried function definition style
import functools
identity_ordering = functools.partial(_sort_by_score, _identity_scoring)
reversed_ordering = functools.partial(_sort_by_score, _reversed_scoring)
उपयोग:
>>> foo = [1, 2, 3, 4, 5]
>>> identity_ordering(foo)
[1, 2, 3, 4, 5]
>>> reversed_ordering(foo)
[5, 4, 3, 2, 1]
स्पष्ट फ़ंक्शन परिभाषा शैली का स्पष्ट फायदे:
- उपयोगी कार्यों अधिक सामान्य कार्य हैं से पहले परिभाषित किया जा सकता है, को ऊपर उठाने के बिना NameErrors;
- सहायक फ़ंक्शन (उदा।, फ़ोरिंग फ़ंक्शन) फ़ंक्शन परिभाषा निकाय के भीतर परिभाषित किया जा सकता है;
- संभवतः डीबग करना आसान है;
- कोड "स्पष्ट से स्पष्ट स्पष्ट है" के आधार पर अच्छा लग रहा है।
curried समारोह परिभाषा शैली का स्पष्ट फायदे:
- कार्यात्मक प्रोग्रामिंग मुहावरे के इरादे को व्यक्त करता है;
- कोड संक्षिप्तता के आधार पर अच्छा लग रहा है।
"उपयोगी" फ़ंक्शंस को परिभाषित करने के लिए, दोनों शैलियों में से किस को प्राथमिकता दी जाती है? क्या ऐसी अन्य शैलियों हैं जो अधिक बेवकूफ/पायथनिक/आदि हैं?
एक, currying और आंशिक आवेदन दो हैं: इस प्रकार, आप भी निम्न कार्यान्वयन का उपयोग कर सकते अलग अलग बातें। करीबी कार्य एक समय में एक तर्क को काम करने के लिए फ़ंक्शन को बदलने का तात्पर्य है। तो जब आप पहली तर्क लागू करते हैं तो आपको एक समारोह मिलता है तो आप दूसरा तर्क लागू कर सकते हैं। आंशिक अनुप्रयोग फ़ंक्शन आमंत्रण – PuercoPop