खोज…


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 मॉड्यूल से अमूर्त वर्ग को तुरंत बेहतर देखने की कोशिश करना।

उदाहरण:

पायथन 2.x 2.3
import collections
>>> collections.Iterator()
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods next
अजगर 3.x 3.0
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods __next__

निम्नलिखित कार्य करके पायथन 2 में चलने वाले वर्गों के लिए हैंडल पायथन 3 संगतता:

पायथन 2.x 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()


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow