021-88881776

آموزش ایتراتورها در پایتون

آموزش ایتراتورها در پایتون، ایتراتورها (Iterators) ابزارهایی در پایتون هستند که امکان پیمایش داده‌ها را به صورت گام به گام فراهم می‌کنند. آن‌ها بخشی از پروتکل تکرار (Iteration Protocol) پایتون هستند و اغلب در حلقه‌های for و دیگر ساختارهای تکراری مورد استفاده قرار می‌گیرند.

1. آشنایی با ایتراتورها و استفاده از آن‌ها

 

مفاهیم اولیه ایتراتورها

  1. Iterable: یک شیء است که می‌توان از آن ایتراتور ساخت. مانند لیست، تاپل، مجموعه، و رشته.
  2. 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 چندین منبع داده را به صورت متوالی ترکیب می‌کند.
  • هنگام اتمام یک منبع، ایتراتور به منبع بعدی تغییر می‌کند.

 

به طور کلی می توان گفت:

ایتراتورها ابزار قدرتمندی برای مدیریت و پیمایش داده‌ها در پایتون هستند. با ایجاد ایتراتورهای سفارشی و ترکیبی می‌توانید رفتارهای خاص و دلخواه خود را پیاده‌سازی کنید. درک عمیق از نحوه کار ایتراتورها و پروتکل تکرار، به شما کمک می‌کند کدی قابل مدیریت و انعطاف‌پذیر بنویسید.

آموزش ایتراتورها در پایتون

دیدگاه های شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *