Iteratorها در پایتون

متدهای __iter__ و __next__، ساخت iterator سفارشی و تابع iter

Iterator چیست؟

Iterator شی‌ای است که می‌توان روی آن پیمایش کرد (مثل حلقه for). لیست، تاپل، رشته و دیکشنری همگی iterator هستند.

iter() و next()

my_list = [1, 2, 3]
my_iter = iter(my_list)  # ساخت iterator

print(next(my_iter))  # 1
print(next(my_iter))  # 2
print(next(my_iter))  # 3
# print(next(my_iter))  # StopIteration!

پیمایش با for

حلقه for در واقع از iterator استفاده می‌کند:

# این دو معادل هستند:
for x in [1, 2, 3]:
    print(x)

# معادل:
my_iter = iter([1, 2, 3])
while True:
    try:
        x = next(my_iter)
        print(x)
    except StopIteration:
        break

ساخت Iterator سفارشی

برای ساخت iterator، باید متدهای __iter__ و __next__ را پیاده‌سازی کنید:

class CountDown:
    def __init__(self, start):
        self.current = start
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current <= 0:
            raise StopIteration
        self.current -= 1
        return self.current + 1

# استفاده
for num in CountDown(5):
    print(num)
# 5, 4, 3, 2, 1

مثال: دنباله فیبوناچی

class Fibonacci:
    def __init__(self, n):
        self.n = n
        self.count = 0
        self.a, self.b = 0, 1
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.count >= self.n:
            raise StopIteration
        result = self.a
        self.a, self.b = self.b, self.a + self.b
        self.count += 1
        return result

# ۱۰ عدد اول فیبوناچی
for num in Fibonacci(10):
    print(num, end=" ")
# 0 1 1 2 3 5 8 13 21 34

StopIteration

وقتی iterator تمام می‌شود، StopIteration پرتاب می‌کند:

class MyRange:
    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
        self.current += 1
        return self.current - 1

خلاصه

متد/تابعتوضیح
iter(obj)ساخت iterator
next(it)عنصر بعدی
__iter__تعریف در کلاس
__next__عنصر بعدی در کلاس
StopIterationپایان iterator

این مبحث بخشی از دوره آموزش کامل پایتون است.

ابزارهای مرتبط