एक प्रक्रिया एक्स टाइम्स चलाने के लिए अधिक पायथोनिक तरीका


90

अधिक पायथोनिक कौन सा है?

घुमाव के दौरान:

count = 0
while count < 50:
    print "Some thing"
    count = count + 1

पाश के लिए:

for i in range(50):
    print "Some thing"

संपादित करें: डुप्लिकेट नहीं है क्योंकि इसमें यह निर्धारित करने के लिए उत्तर दिए गए हैं कि यह स्पष्ट है, बनाम 'i' के बिना एक श्रेणी कैसे चलाएं - भले ही वह सबसे सुरुचिपूर्ण होने पर समाप्त हो गई हो


8
डाउन वोटों की भरपाई करने के लिए अपवोटिंग: अगर लियोनेल यह सवाल पूछते हैं, तो दूसरों के पास भी यही सवाल हो सकता है, और नीचे दिए गए जवाब उपयोगी होंगे।
एरिक ओ लेबिगॉट

2
शब्द "पायथोनिक" का अत्यधिक उपयोग किया जा रहा है। यह "पठनीय" और "आसानी से समझने योग्य" के लिए एक पर्यायवाची है। पायथन में, कम से कम।
डेरियो

जवाबों:


111

निजी तौर पर:

for _ in range(50):
    print "Some thing"

आप की जरूरत नहीं है, तो i। यदि आप पायथन <3 का उपयोग करते हैं और आप लूप को बहुत बार दोहराना चाहते हैं, तो उपयोग करें xrangeक्योंकि पूरी सूची को बनाने के लिए कोई आवश्यकता नहीं है।


15
यद्यपि _ के लिए बाहर निकलना हो रहा है, हालांकि गेटटेक्स अनुवाद समारोह में मैप किया जा रहा है।
जिंटुतस मिलियायुस्कस

इस उत्तर के लिए धन्यवाद; यह मुख्य कारण था कि मैं फॉर-लूप का उपयोग नहीं कर रहा था क्योंकि मेरे पास "i" में अप्रयुक्त चर था।
लियोनेल

6
_ किसी अन्य चर की तरह है। यह केवल REPL में है कि इसका कोई विशेष महत्व है। ओपी के साथ भी चिपक सकता है i
वेजुल्ट

2
@vezult मुझे यह पसंद है क्योंकि यह स्पष्ट करता है कि कथन में चर का उपयोग नहीं किया जा रहा है। वहाँ शायद एक कारण है कि इस के साथ रहना है i?
ryanjdillon

6
मैं टट्टू जोड़ने में दृढ़ विश्वास रखता हूं, जब उचित लगता है ... सीमा में टट्टू के लिए ... (50): प्रिंट ("प्रतिद्वंद्वी") #python 3
पॉल

3

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

from itertools import repeat

for unused in repeat(None, 10):
    del unused   # redundant and inefficient, the name is clear enough
    print "This is run 10 times"

यहां रेंज के बजाय रिपीट का उपयोग करना कम स्पष्ट है क्योंकि यह एक फ़ंक्शन के रूप में अच्छी तरह से ज्ञात नहीं है, और अधिक जटिल है क्योंकि आपको इसे आयात करने की आवश्यकता है। यदि आपको संदर्भ की आवश्यकता है तो मुख्य शैली मार्गदर्शिकाएँ PEP 20 हैं - द ज़ेन ऑफ़ पायथन और PEP 8 - पायथन कोड के लिए स्टाइल गाइड

हम यह भी ध्यान दें कि रेंज संस्करण के लिए भाषा संदर्भ और ट्यूटोरियल दोनों में उपयोग किया जाने वाला एक स्पष्ट उदाहरण है , हालांकि उस स्थिति में मूल्य का उपयोग किया जाता है। इसका मतलब यह है कि लूप के लिए सी-स्टाइल के विस्तार से फॉर्म अधिक परिचित है।


क्या बार-बार की गई बात का सीधे इस्तेमाल करना बेहतर नहीं होगा, यानी: for s in repeat('This is run 10 times', 10): print s??
F1Rumors

निश्चित रूप से! लेकिन नमूना कोड में प्रिंट केवल बार-बार कोड का एक उदाहरण था, जिसके लिए केंद्रीय वस्तु नहीं हो सकती है।
यन वर्नियर

अजगर कोर डेवलपर कहते हैं इस का उपयोग कर की तुलना में तेजी है range() twitter.com/raymondh/status/1144527183341375488
Chris_Rands

यह वास्तव में तेज़ है, क्योंकि इसमें intप्रत्येक पुनरावृत्ति के लिए अलग वस्तु को देखने या बनाने की आवश्यकता नहीं है । हालांकि, प्रोग्रामर का समय निष्पादन के समय से अधिक मूल्यवान हो सकता है।
यन वर्नियर

2

यदि आप पाश के भीतर होने वाले दुष्प्रभावों के बाद हैं, तो मैं व्यक्तिगत रूप से जाऊंगा range() दृष्टिकोण के ।

यदि आप लूप के भीतर जो भी फ़ंक्शन कहते हैं, उसके परिणाम की परवाह करते हैं, तो मैं एक सूची समझने या mapदृष्टिकोण के लिए जाऊंगा । कुछ इस तरह:

def f(n):
    return n * n

results = [f(i) for i in range(50)]
# or using map:
results = map(f, range(50))

परिणाम = (रेंज में मैं के लिए (50))
लूका रहने

1
परिणाम = itertools.imap (f, range (50))
Luka Rahne

@ralu, केवल अगर आपको परिणामों में दोहराया या यादृच्छिक उपयोग की आवश्यकता नहीं है।
एनारोस्टरलिंग

2
परिणाम = tuple (परिणाम) और सूची की तुलना में तेज़ है, क्योंकि tuple पर स्लाइसिंग O (1) है
Luka Rahne

-3

कैसा रहेगा?

while BoolIter(N, default=True, falseIndex=N-1):
    print 'some thing'

या अधिक बदसूरत तरीके से:

for _ in BoolIter(N):
    print 'doing somthing'

या यदि आप अंतिम बार इसे पकड़ना चाहते हैं:

for lastIteration in BoolIter(N, default=False, trueIndex=N-1):
    if not lastIteration:
        print 'still going'
    else:
        print 'last time'

कहाँ पे:

class BoolIter(object):

    def __init__(self, n, default=False, falseIndex=None, trueIndex=None, falseIndexes=[], trueIndexes=[], emitObject=False):
        self.n = n
        self.i = None
        self._default = default
        self._falseIndexes=set(falseIndexes)
        self._trueIndexes=set(trueIndexes)
        if falseIndex is not None:
            self._falseIndexes.add(falseIndex)
        if trueIndex is not None:
            self._trueIndexes.add(trueIndex)
        self._emitObject = emitObject


    def __iter__(self):
        return self

    def next(self):
        if self.i is None:
            self.i = 0
        else:
            self.i += 1
        if self.i == self.n:
            raise StopIteration
        if self._emitObject:
            return self
        else:
            return self.__nonzero__()

    def __nonzero__(self):
        i = self.i
        if i in self._trueIndexes:
            return True
        if i in self._falseIndexes:
            return False
        return self._default

    def __bool__(self):
        return self.__nonzero__()

-5

किसी चीज़ को दोहराने का वास्तव में एक पैथोनिक तरीका नहीं है। हालांकि, यह एक बेहतर तरीका है:

map(lambda index:do_something(), xrange(10))

यदि आपको सूचकांक को पास करने की आवश्यकता है तो:

map(lambda index:do_something(index), xrange(10))

विचार करें कि यह संग्रह के रूप में परिणाम लौटाता है। इसलिए, यदि आपको परिणाम एकत्र करने की आवश्यकता है तो यह मदद कर सकता है।


इतना ही नहीं यह वास्तव में बेहतर नहीं है (फ़ंक्शन कॉल ओवरहेड, कम ज्ञात लैम्ब्डा अभिव्यक्तियों, एक सूची में अप्रयुक्त परिणाम एकत्र करना), 10 एक चलने योग्य नहीं है।
यन वर्नियर

हां, xrange (10) 10 नहीं। मैंने कहा कि यह बेहतर है क्योंकि आपको फ़ंक्शन लिखने या लूप बनाने की आवश्यकता नहीं है। हालाँकि, जैसा कि मैंने कहा कि वास्तविक पाइथोनिक तरीका नहीं है। मैंने कोड बदल दिया, धन्यवाद।
अबी.संगरब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.