2010-12-21 35 views
175
>>> range(1,11) 

आपसीमा (प्रारंभ, अंत) अंत में क्यों शामिल नहीं है?

[1,2,3,4,5,6,7,8,9,10] 

क्यों 1-11 नहीं देता है?

क्या उन्होंने इसे यादृच्छिक रूप से ऐसा करने का फैसला किया था या क्या मेरे पास कुछ मूल्य है जो मैं नहीं देख रहा हूं?

+18

'रेंज (लेन)' –

+7

डीजस्ट्रा, ewd831 – SilentGhost

+3

मूल रूप से आप दूसरे के लिए ऑफ-बाय-वन बग का एक सेट चुन रहे हैं। एक सेट आपके लूप को जल्दी समाप्त करने की अधिक संभावना है, दूसरे को अपवाद (या अन्य भाषाओं में बफर ओवरफ़्लो) होने की संभावना है। एक बार जब आप कोड का एक गुच्छा लिख ​​लेते हैं, तो आप देखेंगे कि व्यवहार 'रेंज() 'की पसंद को अधिक बार –

उत्तर

150

क्योंकि range(0, 10) पर कॉल करना अधिक आम है जो [0,1,2,3,4,5,6,7,8,9] देता है जिसमें 10 तत्व होते हैं जो len(range(0, 10)) के बराबर होते हैं। याद रखें कि प्रोग्रामर 0-आधारित अनुक्रमण पसंद करते हैं।

for i in range(len(li)): 
    pass 

आप देख सकता है कि अगर range() बिल्कुल len(li) को गया है कि इस समस्याग्रस्त हो जाएगा:

इसके अलावा, निम्न सामान्य कोड का टुकड़ा पर विचार? प्रोग्रामर को स्पष्ट रूप से घटाना होगा 1. यह प्रोग्रामर की सामान्य प्रवृत्ति का पालन करता है for(int i = 0; i < 10; i++)for(int i = 0; i <= 9; i++) से अधिक पसंद करता है।

आप बार-बार प्रारंभ की 1 के साथ सीमा बुला रहे हैं, तो आप अपने खुद के समारोह निर्धारित कर सकते हैं:

>>> range1 = lambda start, end: range(start, end+1) 
>>> range1(1, 10) 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
+27

यदि तर्क थे तो पैरामीटर 'सीमा (प्रारंभ, गणना) 'नहीं होंगे? –

+0

आह, तो वास्तव में ऐसा इसलिए है क्योंकि x 0 – BigOmega

+2

@shogun प्रारंभ मूल्य 0 पर डिफ़ॉल्ट हो सकता है, यानी 'श्रेणी (10)' 'सीमा (0, 10)' के बराबर है। – marcog

6

सीमा की लंबाई शीर्ष मूल्य शून्य से नीचे मूल्य है। एक सी शैली भाषा में

for (var i = 1; i < 11; i++) { 
    //i goes from 1 to 10 in here 
} 

:

यह बहुत कुछ इस तरह के समान है।

रूबी के रेंज की तरह

इसके अलावा:

1...11 #this is a range from 1 to 10 

हालांकि, रूबी स्वीकार करता है कि कई बार आप टर्मिनल मूल्य में शामिल करना चाहते हैं और वैकल्पिक वाक्य रचना प्रदान करता है:

1..10 #this is also a range from 1 to 10 
+10

गह! मैं रुबी का उपयोग नहीं करता, लेकिन मैं कल्पना कर सकता हूं कि '1.10' बनाम '1 ... 10' कोड पढ़ने के बीच अंतर करने के लिए मुश्किल हो रही है! – marcog

+2

@marcog - जब आप जानते हैं कि दो रूपों में आपकी आंखें अंतर के प्रति संलग्न हैं :) – Skilldrick

+8

रुबी का रेंज ऑपरेटर पूरी तरह से सहज है। लंबा रूप आपको छोटा अनुक्रम प्राप्त करता है। * खांसी * –

17

अनन्य पर्वतमाला कुछ की क्या ज़रूरत है लाभ:

एक बात के लिए range(0,n) में प्रत्येक आइटम लंबाई n की सूचियों के लिए एक मान्य अनुक्रमणिका है।

भी range(0,n) की लंबाई n है, n+1 जो एक समावेशी सीमा होगी।

15

यह शून्य-आधारित अनुक्रमण और len() के संयोजन में अच्छी तरह से काम करता है। उदाहरण के लिए, यदि आपके पास x सूची में 10 आइटम हैं, तो उन्हें 0-9 क्रमांकित किया गया है। range(len(x)) आपको 0-9 देता है।

बेशक, लोग आपको बताएंगे कि यह for item in x या for index, item in enumerate(x)for i in range(len(x)) के बजाय यह अधिक पाइथोनिक है।

स्लाइसिंग इस तरह से काम करता है: foo[1:4] आइटम 0-के 1-3 आइटम हैं (ध्यान रखें कि आइटम 1 वास्तव में शून्य-आधारित अनुक्रमण के कारण दूसरा आइटम है)। स्थिरता के लिए, उन्हें दोनों एक ही तरीके से काम करना चाहिए।

मुझे इसके बारे में लगता है: "पहला नंबर जो आप चाहते हैं, उसके बाद पहले नंबर के बाद नहीं चाहते हैं।" यदि आप 1-10 चाहते हैं, तो पहले नंबर जो आप नहीं चाहते हैं वह 11 है, इसलिए यह range(1, 11) है।

यदि यह किसी विशेष एप्लिकेशन में बोझिल हो जाता है, तो थोड़ा सा सहायक फ़ंक्शन लिखना काफी आसान होता है जो अंतिम सूचकांक में 1 जोड़ता है और range() पर कॉल करता है।

+2

+1 स्लाइसिंग के साथ स्थिरता के लिए। –

+1

स्लाइसिंग पर सहमत हैं। 'डब्ल्यू = 'एबीसी'; डब्ल्यू [:] == डब्ल्यू [0: लेन (डब्ल्यू)]; डब्ल्यू [: - 1] == डब्ल्यू [0: लेन (डब्ल्यू) -1]; ' – kevpie

+0

' def full_range (स्टार्ट, स्टॉप): रिटर्न रेंज (स्टार्ट, स्टॉप + 1) ## सहायक फ़ंक्शन ' – nobar

4

कोड

for i in range(10): 
    print "You'll see this 10 times", i 

पर विचार विचार है कि आप लंबाई y-x की एक सूची है, जो आप कर सकते हैं (जैसा कि आप ऊपर देखें) से अधिक पुनरावृति हो रही है।

रेंज के लिए the python docs पर पढ़ें - वे प्राथमिक उपयोग के लिए लूप पुनरावृत्ति पर विचार करते हैं।

8

यह विभाजित श्रेणियों के लिए भी उपयोगी है; range(a,b) को range(a, x) और range(x, b) में विभाजित किया जा सकता है, जबकि समावेशी सीमा के साथ आप x-1 या x+1 लिखेंगे। जबकि आपको शायद ही कभी श्रेणियों को विभाजित करने की आवश्यकता होती है, आप अक्सर सूचियों को विभाजित करते हैं, जो कि l[a:b] सूची को टुकड़ा करने के कारणों में से एक है, लेकिन ए-वें तत्व शामिल है लेकिन बी-वें नहीं। फिर range एक ही संपत्ति रखने के लिए यह अच्छी तरह से संगत बनाता है।

9

वहाँ कुछ उपयोगी एल्गोरिथम स्पष्टीकरण यहाँ हैं हालांकि, मुझे लगता है कि यही कारण है कि यह इस तरह से, जब युवा नए लोगों के लिए विषय को शुरू जो मैं उपयोगी पाया है काम करता है के रूप में कुछ सरल 'वास्तविक जीवन' तर्क जोड़ने के लिए मदद मिल सकती है:

'रेंज (1,10)' भ्रम की तरह कुछ सोचने से उत्पन्न हो सकता है कि पैरामीटर की जोड़ी "प्रारंभ और अंत" का प्रतिनिधित्व करती है।

यह वास्तव में शुरू होता है और "बंद" होता है।

अब, अगर यह थे "अंत" मूल्य तो, हाँ, आप उम्मीद कर सकते है कि संख्या के अनुक्रम में अंतिम प्रविष्टि के रूप में शामिल किया जाएगा। लेकिन यह "अंत" नहीं है।

अन्य गलती से उस पैरामीटर को "गिनती" कहते हैं क्योंकि यदि आप कभी भी 'रेंज (एन)' का उपयोग करते हैं तो यह निश्चित रूप से 'n' बार होता है। जब आप प्रारंभ पैरामीटर जोड़ते हैं तो यह तर्क टूट जाता है।

तो मुख्य बिंदु इसका नाम याद रखना है: " रोकें"। इसका मतलब है कि यह वह बिंदु है जिस पर पहुंचे, पुनरावृत्ति तुरंत बंद हो जाएगी। के बाद यह बिंदु नहीं।

तो, जबकि "प्रारंभ" वास्तव में शामिल होने वाले पहले मान का प्रतिनिधित्व करता है, "स्टॉप" मान तक पहुंचने पर इसे रोकने से पहले 'उस' को भी जारी रखने के बजाय 'ब्रेक' होता है।

एक समानता जिसे मैंने बच्चों को यह समझाने में उपयोग किया है वह है कि, विडंबना यह है कि यह बच्चों की तुलना में बेहतर व्यवहार करता है! यह के बाद बंद नहीं होता है - यह माना जाता है कि यह क्या कर रहा है इसे पूरा किए बिना तुरंत बंद हो जाता है।(वे इस मिल;))

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

मुझे आशा है कि इनमें से कुछ पाइथोनिटोस/पायथनिटस को समझाएंगे!

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