Advanced Iterators & Generators

Learn efficient looping, data streaming & lazy evaluation techniques

1️⃣ Custom Iterators

Python me iterator ek object hota hai jisme __iter__() aur __next__() methods hote hain. Ye ek sequence ke elements ko ek time pe ek return karta hai.


class Counter:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.current <= self.end:
            val = self.current
            self.current += 1
            return val
        else:
            raise StopIteration

for num in Counter(1, 5):
    print(num)

👉 Output:


1
2
3
4
5
---

2️⃣ Generators

Generator functions iterators ki tarah hi kaam karte hain, lekin unhe banana easy hota hai. Ye yield keyword use karte hain aur memory-efficient hote hain.


def squares(n):
    for i in range(n):
        yield i * i

for num in squares(5):
    print(num)

👉 Output:


0
1
4
9
16
---

3️⃣ Generator Pipelines

Generators ko chain karke ek data pipeline bana sakte hain. Isse bade datasets ko efficiently process kar sakte hain bina sab memory me load kiye.


def numbers():
    for i in range(1, 6):
        yield i

def squares(nums):
    for n in nums:
        yield n * n

def even(nums):
    for n in nums:
        if n % 2 == 0:
            yield n

print(list(even(squares(numbers()))))

👉 Output:

[4, 16]
---

4️⃣ itertools Module

itertools module me kai useful tools hain jo iterators ko combine, repeat aur manipulate karne me help karte hain.


import itertools

# Infinite counter
for i in itertools.count(10, 2):
    if i > 20:
        break
    print(i)

# Combinations
print(list(itertools.combinations([1, 2, 3], 2)))

👉 Output:


10
12
14
16
18
20
[(1, 2), (1, 3), (2, 3)]
---

5️⃣ Coroutines and "yield from"

Python 3.3+ me yield from ek generator ke andar dusre generator ko delegate karta hai. Ye nested generators ke liye kaam aata hai.


def gen1():
    yield from [1, 2, 3]

def gen2():
    yield from gen1()
    yield 4
    yield 5

print(list(gen2()))

👉 Output:

[1, 2, 3, 4, 5]
---

💡 Summary