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 |
این مبحث بخشی از دوره آموزش کامل پایتون است.