2008-10-08 9 views
58

पाइथन 3.0 में कम() फ़ंक्शन में परिवर्तनों के बारे में नेट पर बहुत गर्म चर्चा हुई है और इसे कैसे हटाया जाना चाहिए। मुझे समझ में थोड़ा कठिनाई हो रही है कि यह मामला क्यों है; मुझे विभिन्न मामलों में इसका उपयोग करना काफी उचित लगता है। अगर अवमानना ​​केवल व्यक्तिपरक था, तो मैं कल्पना नहीं कर सकता कि इस तरह की बड़ी संख्या में लोग इसकी परवाह करेंगे।कम() के साथ समस्या क्या है?

मुझे क्या याद आ रही है? कम() के साथ समस्या क्या है?

उत्तर

62

गुइडो के रूप में उसकी The fate of reduce() in Python 3000 पोस्ट में कहते हैं:

तो अब कम हो()। यह वास्तव में वह है जिसे मैंने हमेशा से नफरत की है, क्योंकि, + या * से जुड़े कुछ उदाहरणों के अलावा, लगभग हर बार जब मैं एक गैर-मामूली फ़ंक्शन तर्क के साथ कम() कॉल करता हूं, तो मुझे पेन और पेपर को पकड़ना होगा आरेख वास्तव में उस कार्य में खिलाया जा रहा है इससे पहले कि मैं समझता हूं कि कम() को क्या करना है। तो मेरे दिमाग में, कम करने की प्रयोज्यता() को सहयोगी ऑपरेटरों तक काफी सीमित है, और अन्य सभी मामलों में संचय लूप को स्पष्ट रूप से लिखना बेहतर होता है।

त्वरित, क्या निम्नलिखित कोड कर रहा है:

Functional Programming HOWTO लेख में एक भ्रामक reduce का एक उत्कृष्ट उदाहरण है?

total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1] 

आप यह पता लगा सकते हैं, लेकिन यह अभिव्यक्ति सुलझाना यह पता लगाने की क्या हो रहा है समय लगता है। एक छोटी नेस्टेड डीईएफ़ बयानों का उपयोग करते हुए बातें एक छोटा सा बेहतर बनाता है:

def combine (a, b): 
    return 0, a[1] + b[1] 

total = reduce(combine, items)[1] 

लेकिन अगर मैं बस पाश के लिए एक का इस्तेमाल किया था यह सब का सबसे अच्छा होगा:

total = 0 
for a, b in items: 
    total += b 

या योग() अंतर्निहित में और एक जनरेटर अभिव्यक्ति: जब छोरों के लिए के रूप में लिखा

total = sum(b for a,b in items) 

को कम से कई का उपयोग करता है() साफ कर रहे हैं।

+4

उस स्थिति में यह और भी आसान हो सकता है: योग (बी के लिए बी, वस्तुओं में बी) –

+0

@ जॉन मिलिकिन: अच्छा! :-) – DzinX

+0

आह, डरावना - अब जब मैं लिंक में देखता हूं, तो योग() लाइन सीधे आपके उद्धरण है। इसे पहली बार याद किया होगा। –

8

लोग चिंता यह प्रोग्रामिंग की एक अस्पष्ट शैली को प्रोत्साहित करती है, कुछ है कि स्पष्ट तरीके से प्राप्त किया जा सकता कर।

मैं खुद को कम करने के खिलाफ नहीं हूं, मुझे कभी-कभी यह एक उपयोगी टूल भी मिलता है।

31

reduce() हटाया जा रहा नहीं है - यह बस functools मॉड्यूल में ले जाया जा रहा है। Guido का तर्क यह है कि संक्षेप में मामूली मामलों को छोड़कर, reduce() का उपयोग करके लिखे गए कोड आमतौर पर एक संचय लूप के रूप में लिखे जाने पर स्पष्ट होते हैं।

+24

गाह, यह भयानक तर्क है :( – TraumaPony

+16

क्या यह है? अधिकांश पाइथन का दर्शन स्पष्ट कोड और स्पष्ट कोड के बारे में है। (आमतौर पर) को कम करने के लिए एक सामान्य कॉल के लिए मुझे एक पेंसिल तोड़ने और ग्राफ को कार्य करने की आवश्यकता होती है के साथ बुलाया –

+23

जब तक कि आप मुझे * महत्वपूर्ण * प्रदर्शन वृद्धि (कम से कम 2x) दिखा सकते हैं, मैं किसी भी दिन "अभिव्यक्ति की कॉम्पैक्टनेस" पर "स्पष्ट और स्पष्ट" ले जाऊंगा। –

1

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

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