2012-02-28 17 views
27

semi-famous article written by Guido himself है कि reduce() को डोडो का रास्ता जाना चाहिए और भाषा छोड़ना चाहिए। यह पायथन 3 (instead getting stuffed in the functools module) में शीर्ष-स्तरीय फ़ंक्शन होने से भी डिमोट किया गया था।पाइथन विकल्प को कम करने के लिए विकल्प()

कई अन्य कार्यात्मक प्रोग्रामिंग स्टेपल (मानचित्र, आदि) के साथ आम स्पष्ट विकल्प उपलब्ध हैं। उदाहरण के लिए, अधिकांश समय map() सूची समझ के रूप में बेहतर लिखा जाता है।

मैं क्या जानना चाहता हूं कि कम करने के लिए एक समान "अधिक पायथनिक" विकल्प है। मेरे पास एक कार्यात्मक प्रोग्रामिंग पृष्ठभूमि (विशेष रूप से एमएल) की थोड़ी सी है, इसलिए reduce() अक्सर समाधान के बारे में सोचते समय मेरे दिमाग में स्प्रिंग्स होती है, लेकिन अगर उन्हें करने का बेहतर तरीका होता है (लूप के लिए कॉल को कम करने के लिए छोटा) I जानना पसंद है।

+5

ठीक है आप हमेशा 'functools आयात कम से' कर सकते हैं। –

+1

यदि 'कम करें', 'गुना', 'मानचित्र' आदि के मामले में सोचते हैं, तो मुझे नहीं लगता कि आपको अपनी सोच का तरीका बदलना चाहिए। आप पहले से ही अच्छे ट्रैक पर हैं। – Irfy

+0

@ निकलासबी .: मुझे पता है कि आप इसे functools से आयात कर सकते हैं (वह तथ्य मेरे प्रश्न में उल्लिखित था)। –

उत्तर

23

जैसा कि गिडो के लिंक किए गए आलेख में कहा गया है, यदि आप reduce() से बचना चाहते हैं तो आपको केवल लूप के लिए एक स्पष्ट लिखना चाहिए। आप मुझे पता है कि अगर वहाँ कम कर कार्य करने के लिए इसी तरह की एक "अधिक pythonic" विकल्प है चाहेंगे द्वारा

result = start 
for x in iterable: 
    result = function(result, x) 
+6

यह भी ध्यान दें, यह 100% समकक्ष नहीं है - मानक लाइब्रेरी में परिभाषित किए गए 'कम() 'को प्रारंभ तर्क की आवश्यकता नहीं है। तो फिर आपको लूप के चारों ओर एक गार्ड रखना होगा ताकि यह जांच सके कि क्या यह खाली है, अगर यह नहीं है, तो पहले आइटम को शुरुआत के रूप में लें, और शेष वस्तुओं पर लूप करें। अचानक, 1-लाइन 'कम()' Guido सोचने के बावजूद और भी आकर्षक लग रहा है। ;) –

+1

@AdamParkin: आपकी आखिरी टिप्पणी बहुत अधिक समझ नहीं लेती है। दो कोड स्निपेट 100% समकक्ष (व्यावहारिक उद्देश्यों के लिए) हैं। आप * 'प्रारंभ' तर्क के बिना 'कम करें') को कॉल कर सकते हैं, और उसके बाद समकक्ष अलग दिखाई देगा, लेकिन आपको 'कम() 'का उपयोग करते समय विशेष आवश्यकता वाले रिक्त पुनरावृत्तियों की आवश्यकता नहीं होगी बिना 'स्टार्ट' के। –

+1

'कम करें (set.intersection, list_of_some_sets)' list_of_some_sets में परिभाषित सभी सेटों के अंतर को कम कर देगा (यह स्पष्ट रूप से सूची के पहले एल्ट का उपयोग शुरू होता है)। इसे लूप में अनलॉक करने के लिए मुझे पहले एल्ट (अच्छी तरह से, कोई तत्व) निकालना होगा, जो कि "प्रारंभ" के रूप में उपयोग करता है, और फिर शेष एन -1 तत्वों पर लूप को फिर से दर्ज करना होगा। हालांकि, सूची से पहले (या जो कुछ भी) आइटम खींचना केवल तभी मान्य होगा यदि आपको पता है कि सूची खाली नहीं है, इसलिए गार्ड की आवश्यकता है। मेरे मतलब के लिए [दस्तावेज़ों में परिभाषा] (http://docs.python.org/library/functions.html#reduce) देखें। –

1

लाइन

result = reduce(function, iterable, start) 

बदल सकते हैं।

हां और नहीं। यह उपयोग के मामले पर निर्भर करता है।

लिंक किए गए आलेख में गिडो सुझाव देते हैं कि अधिकांश लेकिन सभी कटौती को लूप के रूप में नहीं लिखा जाना चाहिए। सीमित परिस्थितियां हैं जिनमें वह लागू होने के रूप में reduce देखता है।

मेरे मन में

तो, को कम करने की प्रयोज्यता() काफी साहचर्य ऑपरेटरों तक सीमित है, और अन्य सभी मामलों में यह पता संचय पाश स्पष्ट रूप से लिखने के लिए बेहतर है।

सहयोगी ऑपरेटरों के बहुत सारे नहीं हैं। (वे ऑपरेटर एक्स हैं जिसके लिए (एक्स एक्स) एक्स सी एक एक्स (बी एक्स सी) के बराबर है।) मुझे लगता है कि यह है, बस +, *, &, |, ^, और शॉर्टकट और/या तक सीमित है।

+0

ग्रेट प्वाइंट, और मैं सहमत हूं, हालांकि यह वास्तव में सवाल का जवाब नहीं है, बल्कि इस सवाल में उद्धृत आलेख से संबंधित एक (काफी अच्छी) अंतर्दृष्टि है। शायद यह सुझाए गए उत्तर से प्रश्न पर टिप्पणी के रूप में बेहतर होगा? –

+1

@AdamParkin मेला बिंदु। एक उत्तर के रूप में लिखा गया। – kkurian

+0

मैं यह तय करते समय आपके उत्तर में भाग गया कि मुझे अपने कोड में 'कम करें' का उपयोग करना चाहिए या नहीं। मेरे मामले में मैं एक बहुत बड़ी सूची से अद्वितीय मूल्यों के एक सेट को कम कर रहा हूं। तो इसके लायक होने के लिए, मैं अपने सहयोगी ऑपरेटरों के सेट में एक सेट यूनियन शामिल करना चाहता हूं। – Rich

संबंधित मुद्दे