چه چیزی یک شیء را قابل پیمایش میکند؟
وقتی از for item in my_list استفاده میکنید، در پشت صحنه پایتون از یک پروتکل استاندارد استفاده میکند. هر شیئی که متد __iter__ را پیادهسازی کند، iterable نام دارد و هر شیئی که متد __next__ را داشته باشد، iterator است.
class CountUp:
def __init__(self, limit):
self.limit = limit
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current >= self.limit:
raise StopIteration
self.current += 1
return self.current
for number in CountUp(5):
print(number) # 1 2 3 4 5حلقهی for ابتدا __iter__ شیء را فراخوانی میکند تا یک iterator بگیرد، سپس بهطور مکرر __next__ را صدا میزند تا وقتی که StopIteration صادر شود. توابع داخلی iter() و next() نیز دقیقاً همین دو متد را فراخوانی میکنند.
پیادهسازی دستی این پروتکل کمی طولانی است؛ به همین دلیل پایتون راهی بسیار سادهتر به نام جنراتور ارائه میدهد که در درس بعد با آن آشنا میشویم.