Python Language
Iterables और Iterators
खोज…
Iterator बनाम Iterable बनाम जनरेटर
एक चलने योग्य एक वस्तु है जो एक पुनरावृत्तिकर्ता को वापस कर सकती है । राज्य के पास कोई भी वस्तु जिसमें __iter__
विधि है और एक पुनरावृत्ति देता है, एक पुनरावृत्ति है। यह राज्य के बिना भी एक वस्तु हो सकती है जो एक __getitem__
विधि को लागू __getitem__
है। - विधि सूचकांक (शून्य से शुरू) ले जा सकते हैं और एक बढ़ा IndexError
जब सूचकांक अब मान्य नहीं हैं।
पायथन के str
वर्ग एक का एक उदाहरण है __getitem__
iterable।
Iterator एक ऐसी वस्तु है जो किसी वस्तु पर next(*object*)
कॉल करने पर एक अनुक्रम में अगला मान उत्पन्न करता है। इसके अलावा, एक __next__
विधि के साथ कोई भी वस्तु एक __next__
है। एक StopIteration
लगाने के बाद StopIteration
को StopIteration
है और इस बिंदु पर पुन: उपयोग नहीं किया जा सकता है।
योग्य कक्षाएं:
Iterable कक्षाएं एक __iter__
और __next__
विधि को परिभाषित करती हैं। एक चलने योग्य वर्ग का उदाहरण:
class MyIterable:
def __iter__(self):
return self
def __next__(self):
#code
#Classic iterable object in older versions of python, __getitem__ is still supported...
class MySequence:
def __getitem__(self, index):
if (condition):
raise IndexError
return (item)
#Can produce a plain `iterator` instance by using iter(MySequence())
collections
मॉड्यूल से अमूर्त वर्ग को तुरंत बेहतर देखने की कोशिश करना।
उदाहरण:
import collections
>>> collections.Iterator()
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods next
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods __next__
निम्नलिखित कार्य करके पायथन 2 में चलने वाले वर्गों के लिए हैंडल पायथन 3 संगतता:
class MyIterable(object): #or collections.Iterator, which I'd recommend....
....
def __iter__(self):
return self
def next(self): #code
__next__ = next
ये दोनों अब पुनरावृत्त हैं और इसके माध्यम से पाले जा सकते हैं:
ex1 = MyIterableClass()
ex2 = MySequence()
for (item) in (ex1): #code
for (item) in (ex2): #code
जनरेटर पुनरावृत्तियों बनाने के लिए सरल तरीके हैं। एक जनरेटर पुनरावर्तक और पुनरावर्तक एक iterable है।
क्या चलने योग्य हो सकता है
Iterable कुछ भी हो सकता है जिसके लिए आइटम एक-एक करके प्राप्त होते हैं , केवल आगे । बिल्ट-इन पायथन संग्रह चलने योग्य हैं:
[1, 2, 3] # list, iterate over items
(1, 2, 3) # tuple
{1, 2, 3} # set
{1: 2, 3: 4} # dict, iterate over keys
जनरेटर पुनरावृत्तियाँ लौटाते हैं:
def foo(): # foo isn't iterable yet...
yield 1
res = foo() # ...but res already is
संपूर्ण पुनरावृत्ति पर Iterating
s = {1, 2, 3}
# get every element in s
for a in s:
print a # prints 1, then 2, then 3
# copy into list
l1 = list(s) # l1 = [1, 2, 3]
# use list comprehension
l2 = [a * 2 for a in s if a > 2] # l2 = [6]
पुनरावृत्ति में केवल एक तत्व सत्यापित करें
पहले तत्व को निकालने के लिए अनपैकिंग का उपयोग करें और यह सुनिश्चित करें कि यह एकमात्र है:
a, = iterable
def foo():
yield 1
a, = foo() # a = 1
nums = [1, 2, 3]
a, = nums # ValueError: too many values to unpack
एक-एक करके मान निकालें
साथ प्रारंभ iter()
में निर्मित iterable से अधिक इटरेटर हो और उपयोग करने के लिए next()
एक के बाद तत्वों एक पाने के लिए जब तक StopIteration
अंत वाचक उठाया है:
s = {1, 2} # or list or generator or even iterator
i = iter(s) # get iterator
a = next(i) # a = 1
b = next(i) # b = 2
c = next(i) # raises StopIteration
Iterator पुनरावृत्ति नहीं है!
def gen():
yield 1
iterable = gen()
for a in iterable:
print a
# What was the first item of iterable? No way to get it now.
# Only to get a new iterator
gen()