2012-05-12 3 views
12

क्या निम्न कोड खराब अभ्यास है?क्या पाइथन आधिकारिक तौर पर लूप के बाद लूप-वेरिएबल का पुन: उपयोग करने का समर्थन करता है?

for i in some_values: 
    do_whatever(i) 
do_more_things(i) 

किसी तरह, यह चर i की तरह मेरे लिए लगता है के लिए लूप के अंदर ब्लॉक करने के लिए दायरे में रहना चाहिए। हालांकि अजगर 2.7 मुझे लूप के बाद इसे पुन: उपयोग करने देता है।

क्या पाइथन आधिकारिक तौर पर उस सुविधा का समर्थन करता है, या क्या मैं भाषा का दुरुपयोग कर रहा हूं?

+0

हममम ... लगता है कि यह ठीक हो सकता है, क्योंकि यह [यहां] (प्रयोग किया जाता है http://stackoverflow.com/प्रश्न/2138873/क्लीन-वे-टू-गेट-टू-आखिरी-आइटम-से-पायथन-इटरेटर) – jamylak

+1

उपयोग-मामलों की एक उचित संख्या है जो बाद के कोड –

उत्तर

12

हाँ, यह आधिकारिक है:

for_stmt ::= "for" target_list "in" expression_list ":" suite 
       ["else" ":" suite] 

> The target list is not deleted when the loop is finished 

http://docs.python.org/reference/compound_stmts.html#for

ध्यान दें कि एक target listfor के बाद सिर्फ एक चर तुलना में कहीं अधिक है:

for some_list[blah] in... 
for some_object.foo in... 
for a[:n] in ...: 

आदि ये बातें बस के बाद गायब हो जाते हैं नहीं कर सकते सूचित करते रहना।

0

यह सुविधा नहीं है। जैसा कि आपने वर्चुअल अवशेष को दायरे में लिखा है। यह सामान्य दुभाषिया व्यवहार है।

+2

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

3

यदि आप सी या जावा जैसी भाषाओं से आ रहे हैं तो स्कोपिंग की बात आती है तो पाइथन थोड़ा खास महसूस कर सकता है। जैसा कि पिछले उत्तर में कहा गया है, कोड बिल्कुल मान्य है लेकिन मैं इसके खिलाफ अनुशंसा करता हूं। यह विशेष रूप से पठनीय कोड नहीं बनाता है और इसके अलावा, यदि some_values खाली हो जाता है, तो कोड की अंतिम पंक्ति पर एक अपवाद उठाया जाएगा।

तो आपके प्रश्न का उत्तर है - हाँ, यह आधिकारिक तौर पर समर्थित है लेकिन ज्यादातर मामलों में यह अनुशंसित रणनीति नहीं है।

दिलचस्प चर्चा here और SO पर स्थानीय चर्चा भी मिल सकती है।

+0

कौन इसकी अनुशंसा नहीं करता है? और यह कोड को पढ़ने में मुश्किल क्यों बना देगा - अजगर चर उनके पूरे दायरे में मौजूद हैं, हालांकि उन्हें पेश किया गया है। – Marcin

+0

मैं सहमत हूं। यह सिर्फ "गंदा" लगता है। – georg

+2

सबसे पहले, मेरा मानना ​​है कि यह एक धारणा बनाता है कि लूप चलाया गया है और चर वास्तव में असाइन किया गया है। दूसरा, इसे तीसरे व्यक्ति के रूप में पढ़ते समय, मैं उसी/निचले इंडेंट पर परिभाषित चर मान लेगा। लेकिन पाइथन समुदाय इस पर विभाजित है। – petr

1

बस @petr ने कहा, यह अप्राकृतिक लगता है। ऐसा इसलिए नहीं है क्योंकि यह अनुमति है कि यह प्राकृतिक है या आपको इसका उपयोग करना होगा।

for i in some_values: 
    do_whatever(i) 
else: 
    do_more_things(i)

लेकिन यह अभी भी बढ़ा NameErrorsome_values अगर खाली करने का मूल्यांकन, लेकिन स्पष्ट लगता है:

मैं नहीं बल्कि, हालांकि यह एक break यूज-केस के साथ तर्क पर लागू नहीं हो सकता है, कुछ इस तरह की है। यह एक आंतरिक दायरे की स्पष्ट पठनीयता नहीं देता है लेकिन इंडेंटेशन इसका सुझाव दे सकता है।

लेकिन जैसा कि अन्य ने कहा, विशिष्ट ओपी के प्रश्न का उत्तर देने के लिए, हाँ, यह कानूनी है।

2

आप कुछ मानदंडों से मिलान करने मदों के लिए एक सूची स्कैन करने के लिए इस तकनीक का प्रयोग कर सकते हैं:

for item in iter: 
    if interesting(item): 
     break 
else: 
    raise ValueError('iter is boring.') 

handle(item) 
संबंधित मुद्दे

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