← Back

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 गलतियाँ

  1. stop को शामिल मान लेना — range(1, 10) में 10 नहीं आएगा। 10 चाहिए तो range(1, 11)।
  2. उल्टी गिनती में step भूलना — range(5, 0) खाली है; range(5, 0, -1) लिखो।
  3. step = 0 — range(1, 5, 0) तुरंत ValueError: range() arg 3 must not be zero देता है।
  4. range में float — range(0, 1, 0.1) TypeError देता है; decimal step चाहिए तो list comprehension लो: [x/10 for x in range(0, 10)]।
  5. 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 नहीं।

सारे free problems देखो →

अक्सर पूछे जाने वाले सवाल

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() अक्सर और भी साफ़ रहता है।

आगे पढ़ो