2010-05-31 13 views
11

तो, पायथन (हालांकि मुझे लगता है कि कई भाषाओं के लिए लागू किया जा सकता है) में, मैं अपने आप को कुछ इस तरह अक्सर साथ लगता है:छोटे कोड अतिरेक (स्वच्छ महसूस नहीं करता है)

the_input = raw_input("what to print?\n") 
while the_input != "quit": 
    print the_input 
    the_input = raw_input("what to print?\n") 

शायद मैं बहुत पसंद कर रहा हूं, लेकिन मुझे यह पसंद नहीं है कि लाइन the_input = raw_input("what to print?\n") को दोहराया जाना है। यह रखरखाव और संगठन को कम करता है। लेकिन मुझे समस्या को और खराब किए बिना डुप्लिकेट कोड से बचने के लिए कोई कामकाज नहीं दिख रहा है। कुछ भाषाओं में, मैं कुछ इस तरह लिख सकते हैं:

while ((the_input=raw_input("what to print?\n")) != "quit") { 
    print the_input 
} 

यह निश्चित रूप से नहीं pythonic है, और अजगर भी पाश की स्थिति AFAIK भीतर कार्य के लिए अनुमति नहीं है।

यह मान्य कोड अतिरेक ठीक करता है,

while 1: 
    the_input = raw_input("what to print?\n") 
    if the_input == "quit": 
     break 
    print the_input 

लेकिन बहुत सही या तो महसूस नहीं करता है। while 1 का तात्पर्य है कि यह पाश हमेशा के लिए चलेगा; मैं एक लूप का उपयोग कर रहा हूं, लेकिन इसे एक नकली हालत दे रहा हूं और असली अंदर डाल रहा हूं।

क्या मैं बहुत पसंद कर रहा हूं? क्या ऐसा करने के लिए इससे अच्छा तरीका है? शायद इसके लिए कुछ भाषा निर्माण तैयार किया गया है जिसे मैं नहीं जानता?

+1

मुझे लगता है कि पहला फॉर्म पूरी तरह स्वीकार्य है। –

+5

यह एक आम पैटर्न है जिसे [लूप और आधा] कहा जाता है (http://www.cs.duke.edu/~ola/patterns/plopd/loops.html#loop-and-a-half)। –

उत्तर

30

सोचो iterators - जैसे, इस विशिष्ट मामले में:

for the_input in iter(lambda: raw_input('what to print?\n'), 'quit'): 
    print the_input 

अजगर में अधिकांश छोरों, कपोल-कल्पना में सबसे निचले स्तर पर छोड़कर, सबसे अच्छा for छोरों के रूप में कुछ छोटा सा अफसर की मदद से लागू किया जाता है इटेटरेटर जो "लूपिंग लॉजिक" को कैप्चर करता है - iter बिल्ट-इन मदद कर सकता है (यहां की तरह), कभी-कभी जीनेक्स (जनरेटर एक्सप्रेशन), कभी-कभी मानक लाइब्रेरी मॉड्यूल itertools बचाव में आता है।

अक्सर आप कस्टम जनरेटर कार्यों (yield का उपयोग कर वाले) कोड करने के लिए या एक से अधिक कभी कभी (जब आप वास्तव में परिष्कृत राज्य प्रबंधन की जरूरत है) का चयन करेंगे, एक कस्टम इटरेटर वर्ग (एक return self रूप __iter__ विशेष विधि को परिभाषित करने, और next [[या __next__ अजगर] के नवीनतम संस्करण में] यात्रा से "अगले मूल्य) वापस जाने के लिए।

जो कुछ भी से अलग पाशन तर्क कैप्चरिंग यह है कि आप विभिन्न मदों क्रमिक रूप से द्वारा उत्पादित पर कर लूप इट्स एलएफ यहाँ महत्वपूर्ण अमूर्त-सहायक है!

+4

यह थोड़ा सा चालाक लगता है ... –

+0

+1: पुनरावृत्ति के लिए 'lo-loops' पसंद करें। किसी भी भाषा में जो उन्हें प्रदान करता है। – Johnsyweb

+0

यह एक अद्भुत समाधान है। तो मुझे एक और 4 मिनट के लिए जवाब स्वीकार करने नहीं देगा ;-) – Ponkadoodle