2012-01-09 8 views
5
कॉल करने के लिए

संभव डुप्लिकेट:
Is it Pythonic to use list comprehensions for just side effects?एक शॉर्टकट के रूप में एक समझ का उपयोग करते हुए एक विधि कई बार

कभी कभी एक स्क्रिप्ट फ़ाइल में मैं [foo(x) for x in (1,2,3)] की तरह कुछ लिखेगा। मैं वास्तव में वापसी मान के बारे में परवाह नहीं है (यदि हो तो), मैं बस आशुलिपि पसंद करते हैं के रूप में

for x in (1,2,3): 
    foo(x) 

लेकिन का उपयोग कर इस समझ में मैं एक सूची वस्तु वहाँ (जो वास्तव में कहीं भी जाने नहीं करता है बनाने के लिए विरोध कर रहा हूँ मैं इसे कचरा एकत्र हो जाता है क्योंकि कोई भी इसे करने के लिए एक संदर्भ रहता है लगता है)

>>> L = list('SxPyAMz') 
>>> [L.remove(c) for c in ('x', 'y', 'z')] 
[None, None, None] 
>>> print L 
['S', 'P', 'A', 'M'] 

मेरा प्रश्न: यह बुरा व्यवहार है, या यह किसी का ध्यान नहीं द्वारा विशेषज्ञ करने के लिए वस्तु के लिए हानिरहित पूरी तरह से है? यदि यह बुरा है, तो इस तरह के शॉर्टकट के लिए एक बेहतर 1-लाइनर है?

उत्तर

3

मैंने अतीत में भी इस बुरे अभ्यास को माना है, और समझ में लूपिंग तर्क को दफनाने के कारण इसे हतोत्साहित किया है। लेकिन फिर मुझेमें consume नुस्खा मिला, और उदाहरण का दावा है कि सी गति पर लूपिंग करना कुछ मामलों में कुछ मूल्य है।

उपभोग नुस्खा सूची समझ/जनरेटर अभिव्यक्ति की बार-बार प्रसंस्करण से फेंकने वाले मूल्यों के गंतव्य के रूप में 0-लंबाई डेक का उपयोग करता है।

L = list('SxPyAMz') 
deque((L.remove(c) for c in ('x', 'y', 'z')), maxlen=0) 

आप एक वैश्विक 0-लंबाई Deque को परिभाषित करते हुए इस खूबसूरत बना सकता है:

_consumer = deque(maxlen=0) 
do_all = _consumer.extend 

L = list('SxPyAMz') 
do_all(L.remove(c) for c in ('x', 'y', 'z')) 
print L 
6

आप परिणाम स्टोर करने के लिए की जरूरत नहीं है पाश "के लिए" एक सादे सरल यह करना होगा:

for c in ('x', 'y', 'z'): L.remove(c) 
+1

मैं इन पसंद नहीं है क्योंकि न्यू लाइन की कमी और एक मांगपत्र अजगर शैली गाइड के खिलाफ है। – wim

+1

आईएमएचओ पायथन नियंत्रण संरचनाओं का एक-लाइनर संस्करण उन स्थानों पर स्वीकार्य है जहां आप सूची समझ का उपयोग करना चाहते हैं। आपके उदाहरण में एक अपरकेस वेरिएबल नाम है जो (फिर से, आईएमएचओ) पीईपी 8 का सबसे बुरा उल्लंघन है, क्योंकि कैमेलकेस को कक्षा के नामों और instances_should_use_underscores के लिए आरक्षित किया जाना चाहिए। मुझे पता है कि किसी भी विकल्प से पढ़ने के लिए आसान और आसान है। –

+0

हाँ, लेकिन यह सिर्फ दुभाषिया पर प्रदर्शन के लिए था। आप उत्पादन कोड में एल नामक एक सूची का उपयोग करके मुझे नहीं देख पाएंगे। – wim

7

हाँ, मैं यह एक बुरा व्यवहार है कि आप के बाद से बचना चाहिए है, तो आप के रूप में कहेंगे पहले से ही इंगित किया गया है, बाद में एकत्रित कचरा होने के लिए एक वस्तु मूल रूप से बनाई जा रही है।

इस अभिव्यक्ति को लिखने के वैकल्पिक तरीकों के लिए, कृपया इस question पर एक नज़र डालें।