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
- Iterators help you create custom looping logic.
- Generators make iteration more readable and memory efficient.
itertools&yield fromsimplify complex looping tasks.- Use pipelines to handle large data efficiently.