Home › Hindi › range() Hindi में
Python range() — तीन forms, और off-by-one से बचाव
🌐 यह page Hindi में है · Read the English loops guide →
तीनों formsNegative stepOff-by-one fix5 common गलतियाँ
range() list नहीं देता
पहली बात जो सबसे ज़्यादा confuse करती है: range(5) कोई list नहीं है।
print(range(5)) # range(0, 5) — list नहीं!
print(list(range(5))) # [0, 1, 2, 3, 4]
r = range(5)
print(len(r), r[2]) # 5 2 — index काम करता है
print(3 in r) # True — बिना list बनाए check हो जाता है
range एक lazy sequence है — numbers याद नहीं रखता, माँगने पर गिनकर देता है। इसीलिए range(10**12) भी memory नहीं खाता। यही इसकी सबसे बड़ी ताकत है।
तीनों forms
for i in range(5): # 0, 1, 2, 3, 4 — stop तक, stop शामिल नहीं
print(i, end=" ")
for i in range(2, 8): # 2, 3, 4, 5, 6, 7 — start से, stop से पहले रुकता है
print(i, end=" ")
for i in range(0, 10, 3): # 0, 3, 6, 9 — step = 3
print(i, end=" ")
print(len(range(2, 8))) # 6 — (stop - start) / step
नियम याद रखो: stop हमेशा बाहर रहता है (exclusive)। 1 से 10 तक चाहिए तो range(1, 11) लिखो, range(1, 10) नहीं।
Negative step — उल्टी गिनती
for i in range(5, 0, -1): # 5, 4, 3, 2, 1
print(i, end=" ")
for i in range(10, -1, -2): # 10, 8, 6, 4, 2, 0
print(i, end=" ")
print(list(range(5, 0))) # [] — उल्टी दिशा में step +1 है, इसलिए खाली!
वह आखिरी line सबसे बड़ा जाल है: उल्टी गिनती के लिए step negative होना ज़रूरी है, वरना range खाली मिलेगी और loop चुपचाप कुछ नहीं करेगा — कोई error भी नहीं आएगा।
Index से loop — कब range, कब enumerate
बहुत से लोग list पर range(len(...)) चलाते हैं। चलता है, पर पढ़ने में भद्दा है और off-by-one का घर है:
names = ["Asha", "Ravi", "Meena"]
for i in range(len(names)): # काम करता है, पर ज़रूरत नहीं
print(i, names[i])
for i, name in enumerate(names): # वही काम, साफ़ और सुरक्षित
print(i, name)
for i, name in enumerate(names, start=1): # गिनती 1 से
print(i, name)
नियम: item चाहिए तो for x in items; item + position चाहिए तो enumerate(items); range() सिर्फ तब जब असल में numbers चाहिए या दो lists पर index से चलना हो।
5 common गलतियाँ
- stop को शामिल मान लेना —
range(1, 10)में 10 नहीं आएगा। 10 चाहिए तोrange(1, 11)। - उल्टी गिनती में step भूलना —
range(5, 0)खाली है;range(5, 0, -1)लिखो। - step = 0 —
range(1, 5, 0)तुरंतValueError: range() arg 3 must not be zeroदेता है। - range में float —
range(0, 1, 0.1)TypeError देता है; decimal step चाहिए तो list comprehension लो:[x/10 for x in range(0, 10)]। - loop के बाद loop variable पर भरोसा — Python में loop variable loop खत्म होने के बाद भी रहता है, तो
for i in range(3): passके बादiका मान2होगा। यही अक्सर गलत output देता है।
range() के काम के patterns
# दोनों lists पर एक साथ — zip बेहतर है
a, b = [1, 2, 3], ["a", "b", "c"]
for x, y in zip(a, b):
print(x, y)
# table छापना
n = 5
for i in range(1, 11):
print(f"{n} x {i} = {n * i}")
# उल्टा घूमना
for ch in reversed("python"):
print(ch, end=" ") # nohtyp
reversed() और zip() अक्सर range() की जगह ज़्यादा साफ़ कोड देते हैं — पहले इन्हें देखो, फिर range() पर आओ।
🛠️ Practice करो (free, browser में)
पढ़ना काफी नहीं — यही bug खुद fix करके देखो। नीचे के problems browser में ही चलते हैं, कोई install नहीं, कोई login नहीं।
- for loop with range and step — step की गलती पकड़ो।
- Loop range boundaries — stop exclusive है — यही सब भूलते हैं।
अक्सर पूछे जाने वाले सवाल
range() list क्यों नहीं है?
क्योंकि वह lazy है — numbers याद रखने के बजाय माँगने पर गिनकर देता है। इसीलिए range(10**12) भी memory नहीं खाता। list चाहिए तो list(range(5)) लिखो, वरना for loop, len() और indexing सीधे range पर ही काम करते हैं।
1 से 10 तक कैसे print करें?
range(1, 11) लिखो। stop हमेशा exclusive होता है, इसलिए range(1, 10) सिर्फ 1 से 9 तक देगा। यही सबसे common off-by-one गलती है।
range(5, 0) खाली क्यों है?
क्योंकि default step +1 है और 5 से आगे बढ़कर 0 पर कभी नहीं पहुँचेगा। उल्टी गिनती के लिए step negative चाहिए: range(5, 0, -1) देता है 5, 4, 3, 2, 1।
range(len(mylist)) लिखना गलत है?
गलत नहीं, पर ज़्यादातर जगह ज़रूरत नहीं। सिर्फ item चाहिए तो for x in mylist; item के साथ index चाहिए तो enumerate(mylist)। range(len(...)) तब रखो जब दो lists पर एक साथ index से चलना हो — और उस जगह zip() अक्सर और भी साफ़ रहता है।