Iteration Protocol – Manual Iteration

Iteration Protocol – पिछले Section में हमने while व for के रूप में दो Looping Statements के बारे में काफी विस्‍तार से समझा और किसी भी तरह के Repeating Statements से सम्‍बंधित Programming Requirement को Fulfill करने के लिए हम जरूरत के अनुसार इनमें से किसी का भी प्रयोग कर सकते हैं।

लेकिन Python में हमें Mostly Sequences के साथ ही ज्‍यादातर Operations को Perform करना पड़ता है और इसीलिए Python हमें Sequences के साथ Repetitive Tasks Perform करने के लिए और बेहतर Tools Provide करता है जो कि Looping Statements की तुलना में ज्‍यादा Efficient व Simple होते हैं।

इस Section में सबसे पहले हम Python के उस Iteration Protocol के बारे में जानेंगे जो कि for Loop द्वारा Use किया जाने वाला एक Method Call Model है और उसके बाद हम List Comprehensions के बारे में जानेंगे जो कि किसी Iterable Object के Data Items को Access करने के लिए उसमें एक Expression की तरह Apply होता है और काफी हद तक for Loop की तरह ही काम करता है।

Manual Iterations

हम List, Tuple, String जैसे किसी भी तरह के Sequence Type के साथ for Loop को Use करने के साथ ही इसे किसी भी तरह के Iterable Object के साथ भी समान रूप से Use कर सकते हैं। यहां तक कि हम Python में जिस किसी भी Object को Left-to-Right Scan कर सकते हैं, हर उस Object के साथ हम for Loop को Use कर सकते हैं।

Python में हर वह Object Iterable होता है, जिसके सभी Items Physically एक Sequence में Stored हों अथवा एक बार में एक Result Return करता हो, जिसे for Loop जैसे Looping Statement द्वारा Access and Manipulate किया जा सकता हो। अन्‍य शब्‍दों में कहें तो Iterable Object, Physically भी Sequence में हो सकता है और जरूरत के अनुसार Virtually भी Sequence में हो सकता है।

Python के अन्‍तर्गत हर वह Object Iterable होता है, जो iter Call को Support करता है और हर वह Object एक Iterator होता है, जो किसी Iterable Object से Return हुआ है और next(I) Call को Support करता है। Python में इस Iteration करने के तरीके को समझने का सबसे आसान तरीका File Handling System है।

जब हम Python के अन्‍तर्गत किसी File को Open करके उसके सभी Content को Line by Line Read करने के लिए readline() Method को Call करते हैं, तब File से Current Line के Read होने के बाद File Pointer Automatically File की अगली Line पर Move हो जाता है।

इसलिए यदि हम फिर से इसी readline() Method को दोबारा Call करते हैं, तो इस दूसरे Call से File के Content की अगली Line Read होती है और प्रत्‍येक readline() Method Call के साथ हर बार तब तक अगला Line of Content Return होता रहता है, जब तक कि File Pointer, File के उस अन्तिम Line पर नहीं पहुंच जाता, जहां उसे Empty String प्राप्‍त होता है। इस पूरी प्रक्रिया पर आधारित एक Simple Example निम्‍नानुसार Create किया जा सकता है-

[code]
FileName: IteratorConcept.py
fileHandle = open('names.txt','w')
fileHandle.write("KRISHNA \n")
fileHandle.write("MURARI \n")
fileHandle.write("SHYAM \n")
fileHandle.write("BIHARI \n")
fileHandle.close()

fileHandle = open('names.txt','r')
print(fileHandle.readline(), end='')
print(fileHandle.readline(), end='')
print(fileHandle.readline(), end='')
print(fileHandle.readline(), end='')
print(fileHandle.readline(), end='')
fileHandle.close()

Output
KRISHNA
MURARI
SHYAM
BIHARI
[/code]

इस Example में हमने जो File Create की है, उसमें केवल 4 ही Names हैं, जबकि हमने readline() Method को 5 बार Call किया है। हमने ऐसा केवल इसीलिए किया है क्‍योंकि readline() Method को यदि Read करने के लिए File से कोई भी Line of Content नहीं मिलता, तब भी वह कोई Error Return नहीं करता बल्कि File से केवल Empty String Return होने की वजह से केवल Terminate हो जाता है।

जिस तरह से readline() Method काम करता है, ठीक उसी तरह से Files के साथ उपलब्‍ध __next__() Method को भी Use किया जा सकता है, जो कि Exactly readline() Method की तरह ही काम करता है। इसलिए यदि हम इस __next__() Method का प्रयोग करते हुए उपरोक्‍त Example Program को Modify करना चाहें, तो हमारा Modified Example Program कुछ निम्‍नानुसार होगा-

[code]
FileName: ModifiedWith__next__()Method.py
fileHandle = open('names.txt','w')
fileHandle.write("KRISHNA \n")
fileHandle.write("MURARI \n")
fileHandle.write("SHYAM \n")
fileHandle.write("BIHARI \n")
fileHandle.close()

fileHandle = open('names.txt','r')
print(fileHandle.__next__(), end='')
print(fileHandle.__next__(), end='')
print(fileHandle.__next__(), end='')
print(fileHandle.__next__(), end='')
print(fileHandle.__next__(), end='')
fileHandle.close()

Output
KRISHNA
MURARI
SHYAM
BIHARI

Traceback (most recent call last):
  File ".\ModifiedWith__next__()Method.py", line 13, in <module>
    print(fileHandle.__next__(), end='')
StopIteration
[/code]

इस Example में भी हमने पिछले Example की तरह ही __next__() Method को 5 बार Call किया है, लेकिन पांचवी बार Call करने पर ये Method Empty String Return होने की स्थिति में केवल Terminate नहीं होता, एक StopIteration का Exception भी Return करता

File जैसे ही किसी Sequence Type के विभिन्‍न Data Items को Access करने के लिए __next__() Method Call का प्रयोग करते हुए जो तरीका Use किया जाता है, उस तरीके को ही Iteration Protocol के नाम से जाना जाता है जहां Python का हर वह Object जिसे किसी भी Looping Statement द्वारा Iterate किया जा सकता है।

क्‍योंकि Python के ऐसे किसी भी Iterable Object में Internally __next__() Method Call ही Iteration करने का काम करता है और Iterations से कब Exit करना है, इस बात का संकेत StopIteration Exception से तय होता है। यानी जब भी StopIteration Exception Execute होता है, Program Control, Looping Statement से Exit हो जाता है।

इसलिए जिस किसी भी Object Type में __next__() Method Call Method को Implement किया गया होता है, हर उस Sequence Type के Object को Looping Statement का प्रयोग करते हुए Scan किया जा सकता है क्‍योंकि ऐसा Object एक प्रकार का Iterable Object होता है।

__next__() Method Call व StopIteration Exception के साथ ही iter() Method Call का Implementation भी उन Objects में किया जाता है, जिन्‍हें Looping Statements द्वारा Iterate किया जा सकता है।

Python के Iteration Protocol के कारण ही किसी File के सारे Content को एक साथ एक ही बार में Read करने के स्‍थान पर File के Iterator को Use करते हुए Looping Statements के माध्‍यम से Line by Line पूरी File के Content को Read करना ज्‍यादा बेहतर तरीका होता है जहां for / while Loop Internally स्‍वयं ही File के Content की अगली Line पर Move करने के लिए __next__() Method Call कर लेते हैं।

इसलिए हालांकि हम अभी भी किसी File के Text Content को Read करने के लिए readline() Method का प्रयोग कर सकते हैं, लेकिन फिर भी for Loop द्वारा Iterator तरीके का प्रयोग करना ज्‍यादा बेहतर होता है और Modern Programming में इसी तरीके को Best Practice माना जाता है क्‍योंकि ये तरीका ज्‍यादा बेहतर, Fast, Efficient व Easy है।

सरलता के लिए हम __next__() Method के Alternative के रूप में हम next() Method भी Call कर सकते हैं, जो कि Internally __next__() Method को ही Call करता है। इस Method को Python 3.x में Add किया गया है जो कि Backward Compatibility की सुविधा भी देता है। यानी हम next() Method को Python 2.x में भी समान प्रकार से Use कर सकते हैं।

तकनीकी रूप से __next__() के साथ ही Iteration Protocol में __iter__() नाम के एक और Method को Implement करना जरूरी होता है। क्‍योंकि जब for Loop Start होता है, तो ये सबसे पहले जिस Iterator Object को प्राप्‍त करता है, उसे Iterable Object को __iter__() नाम के Built-In Function में Pass करने के बाद प्राप्‍त करता है।

यानी जब for Loop Start होता है, तब सबसे पहले Iterable Object को for Loop द्वारा __iter__() Method में Pass किया जाता है जहां __iter__() Method, for Loop द्वारा Iterate किए जाने वाले सबसे पहले iter Object को प्राप्‍त करता है।

next() की तरह ही iter() Method भी Internally __iter__() Method को Call करता है, जिसे Python 3.x में Include किया गया है। साथ ही ये iter() Method, Python 2.x से Combability भी Provide करता है।

इस तरह से यदि हम Iteration Protocol की Internal Working को ठीक से समझें, तो इस Protocol को निम्‍न चित्र द्वारा Represent कर सकते हैं-

Python में विभिन्‍न प्रकार के Types द्वारा जितने भी Supported Iteration Tools हैं, वे सभी मूलत: दो Objects पर आधारित होते हैं, जिन्‍हें Iteration Tools द्वारा दो Distinct Steps में Use किया जाता है-

  • पहला Object वह iterable Object होता है, जिसके लिए हम Iteration की Request करते हैं। इस iterable Object के __iter__() Method को iter द्वारा Run किया जाता है।
  • दूसरा Object वह iterator Object होता है, जो iterable Object से Return होता है और ये Object ही Iterations के दौरान Specified Sequence Object से One by One Values को Return करता है जबकि Values को Return करने का काम Internally next() Method द्वारा किया जाता है जो कि Internally __next__() Method को Invoke करता है और तब तक Iteration होता रहता है, जब तक कि StopIteration Exception Raise नहीं हो जाता।

ये दोनों Steps ज्‍यादातर स्थितियों में Iteration Tools द्वारा Automatically Arrange हो जाते हैं लेकिन इन दोनों Steps द्वारा Iteration Protocol की Working को समझने में काफी मदद मिलती है। कई स्थितियों में ये दोनों Objects एक समान होते हैं। जैसे कि File Handling के दौरान केवल एक Single Scan ही Supported होता है और उस स्थिति‍ में iterator Object अक्‍सर Temporary होता है जिसे Iteration Tool द्वारा Internally Use कर लिया जाता है।

जबकि कुछ स्थितियों में ये दोनों Objects अलग होते हैं। एक Iteration Context Tool होता है, जो कि Iterate करता है और दूसरा Iterable Object होता है, जिसके Data Items या Results को Iterate किया जाता है। इसके अन्‍तर्गत हम map(), zip(), range(), कुछ Dictionary Methods व Generator Expressions को Include कर सकते हैं, ताकि Generate होने वाले सभी Results, Memory में ही Construct न हो जाऐं।

Python in Hindi - BccFalna.comये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook Python in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी है, तो निश्चित रूप से ये EBook भी आपके लिए काफी उपयोगी साबित होगी।

Python in Hindi | Page: 602 | Format: PDF

BUY NOW GET DEMO REVIEWS