for लूप और range — निश्चित संख्या में काम दोहराना
जब पता हो कि कितनी बार दोहराना है, तो for लूप ही सही चुनाव है। range के तीन रूप, अंतिम मान क्यों छूटता है, और for तथा while के बीच सही चुनाव।
- 1समस्या
- 2समझें
- 3उदाहरण
- 4अनुमान
- 5स्वयं करें
- 6चुनौती
वह समस्या जिसे हम हल कर रहे हैं
पिछले पाठ में, 1 से 5 तक जोड़ने में चार पंक्तियाँ लगी थीं, जिनमें से दो केवल गिनती रखने के लिए थीं — एक प्रारंभिक मान और एक वृद्धि। यदि आप वृद्धि भूल जाते हैं, तो अनंत लूप (infinite loop) बन जाता है।
लेकिन उस तरह के काम में एक बात ध्यान देने योग्य है: हमें पहले से पता था कि लूप कितनी बार चलेगा। पाँच बार। जब ऐसा हो, तो गिनती का हिसाब खुद रखने की कोई आवश्यकता नहीं है — आप यह काम पायथन को सौंप सकते हैं।
यही काम for लूप करता है। और चूँकि गिनती आपके हाथ में नहीं होती, एक for लूप कभी अनंत नहीं हो सकता — जो कि इसका सबसे बड़ा लाभ है।
इस मिशन के अंत तक आप सीखेंगे
forलूप के साथ कोड को एक निश्चित संख्या में चलानाrange()के तीनों रूपों का उपयोग करना- यह समझना कि
range(1, 5)पाँच नहीं बल्कि चार संख्याएँ क्यों देता है - किसी टेक्स्ट (स्ट्रिंग) के प्रत्येक अक्षर पर लूप चलाना
- यह तय करना कि किसी कार्य के लिए
forऔरwhileमें से कौन बेहतर है
पूर्वापेक्षाएँ: while लूप — शर्त सत्य रहने तक चलना.
सबसे सरल रूप
for number in range(5):
print(number)0
1
2
3
4एक ही पंक्ति में तीन पंक्तियों का काम हो गया, और किसी काउंटर को प्रबंधित करने की ज़रूरत नहीं पड़ी। इसे ऐसे पढ़ें: "संख्याओं के लिए जो `range(5)` उत्पन्न करता है, ब्लॉक को एक बार चलाएं — और हर बार, उस संख्या को `number` में रखें।"
दो बातें तुरंत स्पष्ट होती हैं:
यह शून्य (0) से शुरू होता है, और 5 कभी नहीं आता — कुल पाँच संख्याएँ हैं, लेकिन 0 से 4 तक। यह वही नियम है जो पायथन हर जगह लागू करता है: जैसे स्लाइस में अंतिम इंडेक्स शामिल नहीं होता, वैसे ही range में भी होता है।
number चर का नाम आपकी पसंद है। for i in range(5) भी उतना ही सही है, और i काउंटर के लिए पारंपरिक नाम है। लेकिन जब संख्या का कोई अर्थ हो, तो अर्थ के अनुसार नाम दें — for student_number in range(30) अपने आप समझ में आता है।
range() के तीन रूप
print("--- range(5) ---")
for i in range(5):
print(i, end=" ")
print()
print("--- range(2, 6) ---")
for i in range(2, 6):
print(i, end=" ")
print()
print("--- range(0, 10, 3) ---")
for i in range(0, 10, 3):
print(i, end=" ")
print()
print("--- range(5, 0, -1) ---")
for i in range(5, 0, -1):
print(i, end=" ")
print()--- range(5) ---
0 1 2 3 4
--- range(2, 6) ---
2 3 4 5
--- range(0, 10, 3) ---
0 3 6 9
--- range(5, 0, -1) ---
5 4 3 2 1नियम:
range(stop)—0से शुरू होता है,stopसे ठीक पहले समाप्त होता हैrange(start, stop)—startसे शुरू होता है,stopसे ठीक पहले समाप्त होता हैrange(start, stop, step)— हर बारstepके मान से आगे बढ़ता है; ऋणात्मकstepउल्टी गिनती करता है
अंतिम दो को देखें: range(0, 10, 3) देता है 0 3 6 9 — अगला 12 होगा, जो 10 से अधिक है, इसलिए यह रुक जाता है। और range(5, 0, -1) देता है 5 4 3 2 1 — 0 कभी नहीं आता, क्योंकि अंतिम मान यहाँ भी बाहर रहता है।
अंतिम मान को बाहर क्यों रखा जाता है? क्योंकि इससे अंकगणित आसान हो जाता है।range(0, 5)में कितनी संख्याएँ हैं?5 - 0, यानी पाँच।range(3, 8)में?8 - 3, यानी पाँच। घटाएं और आपको गिनती मिल जाएगी, एक जोड़ने या घटाने की चिंता किए बिना। और दो रेंज पास-पास रखने पर —range(0, 5)औरrange(5, 10)— कुछ भी नहीं छूटता और कुछ भी दोहराया नहीं जाता।
जब आपको एक से दस तक चाहिए
यह गलती इतनी बार होती है कि इसके लिए एक अलग खंड होना चाहिए:
print("गलत — 9 पर रुक जाता है:")
for i in range(1, 10):
print(i, end=" ")
print()
print("सही — 10 को शामिल करता है:")
for i in range(1, 11):
print(i, end=" ")
print()गलत — 9 पर रुक जाता है:
1 2 3 4 5 6 7 8 9
सही — 10 को शामिल करता है:
1 2 3 4 5 6 7 8 9 10एक पंक्ति में नियम: stop के रूप में वह संख्या लिखें जो आपके अंतिम वांछित मान से एक अधिक हो।
संचय करना — अब आसान तरीके से
total = 0
for number in range(1, 6):
total = total + number
print("Sum of 1 to 5:", total)Sum of 1 to 5: 15इसी काम के while संस्करण से इसकी तुलना करें: कोई काउंटर बनाने की ज़रूरत नहीं, कोई वृद्धि करने की ज़रूरत नहीं, अनंत लूप का कोई जोखिम नहीं। केवल एक्यूमुलेटर को अभी भी लूप के बाहर शुरू करना पड़ता है, बिल्कुल पहले की तरह।
टेक्स्ट पर लूप चलाना
for केवल संख्याओं पर ही नहीं चलता — यह टेक्स्ट पर भी एक-एक अक्षर करके चलता है:
word = "Python"
for letter in word:
print(letter, end="-")
print()
vowel_count = 0
for letter in "programming":
if letter in "aeiou":
vowel_count = vowel_count + 1
print("Vowels:", vowel_count)P-y-t-h-o-n-
Vowels: 3यहाँ किसी range की आवश्यकता नहीं है — for letter in word सीधे अक्षरों पर चलता है। यह इंडेक्स गणित करने से बहुत सरल है, और IndexError का कोई जोखिम नहीं रहता।
break और continue यहाँ भी काम करते हैं
बिल्कुल वैसे ही जैसे वे while में करते थे:
for number in range(1, 20):
if number % 7 == 0:
print("First multiple of 7:", number)
breakFirst multiple of 7: 7for और while के बीच चुनाव
बस एक प्रश्न पूछें: क्या लूप शुरू होने से पहले दोहराव की संख्या ज्ञात है?
यदि हाँ, तो for:
- पाँच बार चलाना
- 1 से 100 तक जाना
- किसी शब्द के प्रत्येक अक्षर को देखना
- किसी सूची (list) की प्रत्येक वस्तु के साथ कुछ करना
यदि नहीं, तो while:
- जब तक इनपुट मान्य न हो तब तक पूछते रहना
- जब तक कोई
quitटाइप न करे तब तक चलाना - जब तक फ़ाइल में पंक्तियाँ बची हैं तब तक पढ़ना
संदेह होने पर, for चुनें। कारण सरल है: for लूप का समाप्त होना सुनिश्चित होता है, जबकि while का नहीं। जहाँ दोनों काम कर सकते हैं, वहाँ वह विकल्प बेहतर है जिसमें गलतियों की संभावना कम हो।
एक संपूर्ण उदाहरण
multiplication.py:
# एक पहाड़ा (multiplication table) और फिर एक संक्षिप्त सारांश प्रिंट करें
number = int(input("Which table? "))
upto = int(input("Up to? "))
print()
print(f"--- Table of {number} ---")
total = 0
for i in range(1, upto + 1):
result = number * i
total = total + result
print(f"{number} x {i:2} = {result:4}")
print()
print(f"Rows : {upto}")
print(f"Sum : {total}")
print(f"Average : {total / upto:.2f}")Which table? 7
Up to? 5
--- Table of 7 ---
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
Rows : 5
Sum : 105
Average : 21.00तीन बातों पर ध्यान दें। पहला, range(1, upto + 1) — upto तक पहुँचने के लिए एक अधिक लिखना पड़ा। दूसरा, {i:2} और {result:4} — f-string के अंदर आप बता सकते हैं कि किसी संख्या को कितनी चौड़ाई लेनी चाहिए, जिससे कॉलम संरेखित रहते हैं। तीसरा, total लूप के बाहर शुरू होता है और अंदर बढ़ता है।
जब यह टूटता है
अंतिम संख्या गायब है range(1, 10) वास्तव में 9 पर समाप्त होता है। stop में एक जोड़ें: range(1, 11).
TypeError: 'float' object cannot be interpreted as an integer range() केवल पूर्ण संख्याएँ स्वीकार करता है। range(2.5) या range(1, n / 2) नहीं चलेगा — int() से बदलें, या // से भाग दें।
SyntaxError: expected ':' for वाली पंक्ति के अंत में कोलन (:) छूट गया है।
IndentationError: expected an indented block after 'for' statement लूप के अंदर की पंक्ति इंडेंट नहीं की गई थी।
लूप कभी चला ही नहीं range खाली है। range(5, 0) कुछ भी नहीं देता — उल्टी गिनती करने के लिए आपको तीसरे तर्क की आवश्यकता होती है: range(5, 0, -1).
लूप के बाद कुल योग 0 रह जाता है total = 0 पंक्ति लूप के अंदर चली गई है, इसलिए यह हर बार रीसेट हो जाती है। इसे बाहर होना चाहिए।
चरण 4 / 6 — अनुमान
अपनी समझ की जाँच करें
What does this loop print?
for i in range(1, 5):
print(i, end=" ")- A1 2 3 4
- B1 2 3 4 5
- C0 1 2 3 4
- D1 2 3
The third argument sets the step. What is the output?
for i in range(0, 10, 3):
print(i, end=" ")- A0 3 6 9
- B0 3 6 9 12
- C3 6 9
- D0 1 2 3 4 5 6 7 8 9
The intent was the sum of 1 to 10, which is 55. It prints 45. Why?
total = 0
for number in range(1, 10):
total = total + number
print("Sum of 1 to 10:", total)- A`range(1, 10)` finishes at `9` and leaves out `10` — it needs `range(1, 11)`
- B`total` was initialised outside the loop when it should be inside
- CUsing a `while` loop instead of `for` would give the right answer
- DIt should be `total + i` rather than `total + number`
उत्तर देने के लिए अकाउंट आवश्यक है
अपने उत्तर जाँचने के लिए साइन इन करें
प्रश्न ऊपर दिए गए हैं, और मन में उत्तर सोचना ही मुख्य कार्य है। सही उत्तर, व्याख्या और तीन-स्तरीय संकेत देखने के लिए साइन इन करें।
आपकी बारी
stars.py नामक एक फ़ाइल लिखें जो एक संख्या लेती है और एक त्रिभुज प्रिंट करती है। इनपुट 5 के लिए:
*
**
***
****
*****फिर इसमें ये तीन चीज़ें जोड़ें:
- नीचे सितारों की कुल संख्या प्रिंट करें (5 के इनपुट के लिए 15)
- त्रिभुज को उल्टा भी प्रिंट करें — शीर्ष पर पाँच, नीचे एक
- एक ऐसा संस्करण प्रिंट करें जो सम संख्या वाली पंक्तियों को छोड़ दे (
continueका उपयोग करें)
पहले बिंदु को जाँचने का एक आसान तरीका है — 1 से 5 का योग हाथ से निकालें और देखें कि क्या आपका प्रोग्राम सहमत है। और याद रखें "*" * i? सितारों की एक पंक्ति बनाने के लिए लूप के अंदर लूप की आवश्यकता नहीं होती।
Step 6 of 6
चुनौती — the chapter quiz
सरल से कठिन — दस प्रश्न, अंतिम वाले जानबूझकर चुनौतीपूर्ण बनाए गए हैं।
Sign in to take the quiz