آموزش ایتراتورها در پایتون، ایتراتورها (Iterators) ابزارهایی در پایتون هستند که امکان پیمایش دادهها را به صورت گام به گام فراهم میکنند. آنها بخشی از پروتکل تکرار (Iteration Protocol) پایتون هستند و اغلب در حلقههای for و دیگر ساختارهای تکراری مورد استفاده قرار میگیرند.
1. آشنایی با ایتراتورها و استفاده از آنها
مفاهیم اولیه ایتراتورها
- Iterable: یک شیء است که میتوان از آن ایتراتور ساخت. مانند لیست، تاپل، مجموعه، و رشته.
- Iterator: یک شیء است که متد
__next__()را پیادهسازی میکند و به ما اجازه میدهد که عناصر آن را یک به یک بازیابی کنیم.
ساختار کلی:
- یک شیء باید متد
__iter__()را پیادهسازی کند تا یک Iterable باشد. - یک شیء باید متد
__next__()را پیادهسازی کند تا یک Iterator باشد.
مثال ساده از ایتراتورها
# یک لیست که Iterable است
numbers = [1, 2, 3, 4]
# تبدیل لیست به Iterator
iterator = iter(numbers)
# دسترسی به عناصر با استفاده از متد __next__
print(next(iterator)) # خروجی: 1
print(next(iterator)) # خروجی: 2
print(next(iterator)) # خروجی: 3
print(next(iterator)) # خروجی: 4
توضیح:
- متد
iter()یک ایتراتور از شیء قابل پیمایش ایجاد میکند. - متد
next()عنصر بعدی را از ایتراتور بازیابی میکند. - اگر عناصر تمام شوند، خطای
StopIterationایجاد میشود.
پیادهسازی ایتراتور سفارشی
شما میتوانید ایتراتورهای خود را با پیادهسازی متدهای __iter__() و __next__() ایجاد کنید.
مثال:
class MyIterator:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current > self.end:
raise StopIteration
value = self.current
self.current += 1
return value
# استفاده از ایتراتور سفارشی
my_iter = MyIterator(1, 5)
for number in my_iter:
print(number)
خروجی:
1
2
3
4
5
توضیح:
- کلاس
MyIteratorیک ایتراتور سفارشی است که اعداد بینstartوendرا بازمیگرداند. - متد
__next__()مقدار فعلی را بازمیگرداند و سپس مقدار را بهروزرسانی میکند.
ایجاد ایتراتور برای دیکشنری
دیکشنریها نیز قابل پیمایش هستند و میتوان از آنها ایتراتور ساخت.
مثال:
my_dict = {"a": 1, "b": 2, "c": 3}
iterator = iter(my_dict)
print(next(iterator)) # خروجی: a
print(next(iterator)) # خروجی: b
print(next(iterator)) # خروجی: c
# پیمایش مقادیر دیکشنری
for key in my_dict:
print(f"Key: {key}, Value: {my_dict[key]}")
خروجی:
a
b
c
Key: a, Value: 1
Key: b, Value: 2
Key: c, Value: 3
ایتراتور برای اعداد فیبوناچی
ایجاد یک ایتراتور سفارشی برای تولید دنباله فیبوناچی:
مثال:
class Fibonacci:
def __init__(self, limit):
self.limit = limit
self.a, self.b = 0, 1
def __iter__(self):
return self
def __next__(self):
if self.a > self.limit:
raise StopIteration
value = self.a
self.a, self.b = self.b, self.a + self.b
return value
# استفاده از ایتراتور فیبوناچی
fib = Fibonacci(50)
for num in fib:
print(num)
خروجی:
0
1
1
2
3
5
8
13
21
34
توضیح:
- کلاس
Fibonacciایتراتوری است که اعداد دنباله فیبوناچی را تا مقدار مشخص تولید میکند. - متد
__next__()اعداد را به صورت گام به گام بازمیگرداند.
استفاده از حلقه while برای ایتراتور
میتوان از حلقه while نیز برای پیمایش ایتراتورها استفاده کرد.
مثال:
class Countdown:
def __init__(self, start):
self.start = start
def __iter__(self):
return self
def __next__(self):
if self.start <= 0:
raise StopIteration
value = self.start
self.start -= 1
return value
# استفاده از حلقه while
countdown = Countdown(5)
iterator = iter(countdown)
while True:
try:
print(next(iterator))
except StopIteration:
break
خروجی:
5
4
3
2
1
توضیح:
- کلاس
Countdownاعداد را به صورت معکوس تا صفر تولید میکند. - حلقه
whileبا استفاده ازtryوexceptبه طور دستی عناصر ایتراتور را پیمایش میکند.
ایتراتورهای ترکیبی
میتوان ایتراتورهایی ساخت که چندین منبع داده را با هم ترکیب کنند.
مثال:
class CombinedIterator:
def __init__(self, *iterables):
self.iterables = iterables
self.current_iter = iter(self.iterables[0])
self.index = 0
def __iter__(self):
return self
def __next__(self):
try:
return next(self.current_iter)
except StopIteration:
self.index += 1
if self.index >= len(self.iterables):
raise StopIteration
self.current_iter = iter(self.iterables[self.index])
return next(self.current_iter)
# استفاده از ایتراتور ترکیبی
combined = CombinedIterator([1, 2], ("a", "b"), {"x": 10, "y": 20})
for item in combined:
print(item)
خروجی:
1
2
a
b
x
y
توضیح:
- کلاس
CombinedIteratorچندین منبع داده را به صورت متوالی ترکیب میکند. - هنگام اتمام یک منبع، ایتراتور به منبع بعدی تغییر میکند.
به طور کلی می توان گفت:
ایتراتورها ابزار قدرتمندی برای مدیریت و پیمایش دادهها در پایتون هستند. با ایجاد ایتراتورهای سفارشی و ترکیبی میتوانید رفتارهای خاص و دلخواه خود را پیادهسازی کنید. درک عمیق از نحوه کار ایتراتورها و پروتکل تکرار، به شما کمک میکند کدی قابل مدیریت و انعطافپذیر بنویسید.
