2013-07-15 6 views
12

पायथन में आपके पास एक से अधिक बार कुछ क्रियाएं दोहराने के दो अच्छे तरीके हैं। उनमें से एक while पाश और दूसरा - for लूप है।लूप को कुछ बार करने के लिए या समय

for i in range(n): 
    do_sth() 

और अन्य:

i = 0 
while i < n: 
    do_sth() 
    i += 1 

मेरा प्रश्न जो उनमें से बेहतर है तो चलो कोड के दो सरल टुकड़े पर एक नजर डालते हैं। बेशक, पहला, जो प्रलेखन उदाहरणों में बहुत आम है और कोड के विभिन्न टुकड़े जो आप इंटरनेट के आसपास पा सकते हैं, बहुत अधिक सुरुचिपूर्ण और छोटा है, लेकिन दूसरी तरफ यह लूप ओवर पर पूर्णांक की पूरी तरह से बेकार सूची बनाता है उन्हें। क्या यह स्मृति की बर्बादी नहीं है, खासतौर पर जहां तक ​​बड़ी संख्या में पुनरावृत्तियों का संबंध है?

तो आपको क्या लगता है, किस तरह से बेहतर है?

+0

संभावित डुप्लिकेट [फ़ंक्शन एन बार दोहराने के लिए कैसे करें] (http://stackoverflow.com/questions/7359828/how-to-repeat-a-function-n-times) –

उत्तर

21

लेकिन दूसरी ओर यह केवल उन पर लूप करने के लिए पूर्णांक की पूरी तरह बेकार सूची बनाता है। क्या यह स्मृति की बर्बादी नहीं है, खासतौर पर जहां तक ​​बड़ी संख्या में पुनरावृत्तियों का संबंध है?

यही xrange(n) है। यह संख्याओं की एक सूची बनाने से बचाता है, और इसके बजाय बस एक इटेटरेटर ऑब्जेक्ट प्रदान करता है।

पायथन 3, xrange() में range() का नाम बदल दिया गया था - यदि आप एक सूची चाहते हैं, तो आपको विशेष रूप से list(range(n)) के माध्यम से अनुरोध करना होगा।

+0

आपकी अंतिम वाक्य में, मुझे लगता है आपका मतलब है 'सूची (रेंज (एन)) ' – SethMMorton

+1

मैं यह ध्यान रखना चाहूंगा कि कम मेमोरी-कुशल (बिना' xrange' के), लूप के लिए बहुत तेज है, कोई अतिरिक्त तुलना और अतिरिक्त नहीं है। –

+0

यह सब जानना अच्छा है! आपका बहुत बहुत धन्यवाद। :) – Sventimir

11

यह xrange (और थोड़ी देर लूप) से हल्का वजन है क्योंकि इसे int ऑब्जेक्ट्स बनाने की भी आवश्यकता नहीं है। यह भी को Python2 और python3 में समान रूप से अच्छी तरह से काम करता है

from itertools import repeat 
for i in repeat(None, 10): 
    do_sth() 
+0

इसे दूसरी तरफ itertools आयात करने की आवश्यकता है, जो थोड़ा असुविधाजनक है। एम्बर का जवाब बेहतर दिखता है। – Sventimir

+6

कोड गोल्फ के लिए यह असुविधाजनक है। निश्चित नहीं है कि लोग क्यों सोचते हैं कि आयात कुछ प्रकार की समस्या है। वास्तविक कार्यक्रमों के अलावा आयात का एक समूह है और इटारेटोल्स में बहुत सी चीजें हैं जिनका उपयोग आप किसी भी तरह से करना चाहिए। –

+0

खैर, मुझे लगता है कि जब आप मूल भाषा के साथ कुछ मॉड्यूल के साथ समान रूप से अच्छा कर सकते हैं, तो आयात क्यों करें?Itertools कुछ उद्देश्यों के लिए बेहद उपयोगी है, सच है, लेकिन मैं कल्पना कर सकता हूं कि बहुत सी पाइथन स्क्रिप्ट इसके बिना अच्छी तरह से काम कर रही हैं। यही कारण है कि यह एक मॉड्यूल है और कोर पायथन नहीं है। :) – Sventimir

2

सबसे प्रोग्रामिंग भाषाओं में मौलिक अंतर यह है कि जब तक अप्रत्याशित एक for पाश होता हमेशा दोहराने n बार फिर एक while पाश के साथ खत्म हो जाएगा यह दोहरा सकते है 0 times, 1, more or even forever, किसी दिए गए शर्त के आधार पर जो प्रत्येक लूप की शुरुआत में हमेशा सत्य होता है और हमेशा लूप से बाहर निकलने पर झूठा होता है, (do ... while लूप, (या repeat until) पूर्ण करने के लिए, जो भाषाओं में है, हमेशा कम से कम एक बार निष्पादित करता है और करता है पहले पूर्व की स्थिति की गारंटी नहीं है ecution)।

तो आपके प्रश्न का उत्तर 'है यह सब' करने का प्रयास कर रहा है पर निर्भर करता है!

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