آموزش تکرارکننده(iterator) در پایتون
یک تکرارکننده(iterator)، یک شیء یا آبجکت است که حاوی چند مقدارِ قابل شمارش میباشد.
یک تکرارکننده(iterator)، یک آبجکت است که بتوانیم روی آن حلقه بزنیم؛ یعنی بتوانیم روی تمام مقادیر آن پیمایش کنیم.
از نظر فنی، یک تکرارکننده(iterator) در پایتون، یک آبجکت است که پروتکل تکرارکننده(iterator protocol) را پیادهسازی میکند؛ که شامل متدهای __iter__() و __next__() میشود.
تفاوت تکرارکننده(iterator) و تکرارپذیر(iterable) در پایتون
لیستها، تاپلها، دیکشنریها و مجموعهها(set)، همه آبجکتهای تکرارپذیر(iterable) هستند. آنها ظرفهای تکرارپذیری هستند که، ما میتوانیم یک تکرارکننده(iterator) را از آنها دریافت کنیم. همهی این آبجکتها یک متد به نام iter() دارند که از آن برای دریافت یک تکرارکننده(iterator) استفاده میشود.
مثال شماره 1
برگرداندن یک تکرارکننده(iterator) از یک تاپل، و چاپ کردن هریک از مقادیر:
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
نتیجه:
apple
banana
cherry
امتحان کنیدحتی رشتهها(string) نیز آبجکتهای تکرارپذیری هستند و میتوانند یک تکرارکننده را برگردانند(return کنند).
مثال شماره 2
رشتهها نیز آبجکتهای تکرارپذیری هستند؛ زیرا از یک دنباله از کاراکترها تشکیل شده اند:
mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
نتیجه:
b
a
n
a
n
a
امتحان کنیدحلقه زدن روی یک تکرارکننده(Iterator) در پایتون
ما همچنین میتوانیم از یک حلقهی for برای حلقه زدن(تکرار کردن یا iterate) روی یک آبجکت تکرارپذیر(iterable) استفاده کنیم:
مثال شماره 3
حلقه زدن(تکرار کردن یا iterate) روی مقادیر یک تاپل در پایتون:
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
نتیجه:
apple
banana
cherry
امتحان کنیدمثال شماره 4
حلقه زدن(تکرار کردن یا iterate) روی کاراکترهای یک رشته(string) در پایتون:
mystr = "banana"
for x in mystr:
print(x)
نتیجه:
b
a
n
a
n
a
امتحان کنیدنکته: در حقیقت، حقلهی for یک آبجکت تکرارکننده(iterator) ایجاد میکند و برای هر حلقه، متد next() را اجرا میکند.
ایجاد یک تکرارکننده(iterator)
برای ایجاد یک آبجکت یا کلاس، بعنوان تکرارکننده، باید متدهای __iter__() و __next__() را در آبجکت خود پیادهسازی کنیم.
همان طور که در فصل کلاسها و آبجکتها توضیح خواهیم داد، تمام کلاسها یک تابع به نام __init__() دارند، که به ما امکان میدهد، هنگامی که آبجکت مورد نظر در حال ایجاد شدن است، کمی به کارِ مقداردهیِ اولیه یا همان initializing بپردازیم.
متد __iter__() نیز به همین شکل عمل میکند، و با استفاده از آن میتوانیم کارهایی مثل مقداردهی اولیه و غیره را انجام دهیم، اما همیشه باید خود آبجکت تکرارکننده(iterator) را برگرداند. متد __next__() نیز به ما امکان میدهد تا کارهایی را انجام دهیم و باید آیتم بعدی در دنباله را برای ما برگرداند.
مثال شماره 5
ایجاد یک تکرارکننده(iterator) که اعدادی را برمیگرداند، و از 1 شروع میکند و در ادامه به هر عضوِ دنباله یک واحد اضافه میشود(اعداد 1 و 2 و 3 و 4 و 5 و غیره را برمیگرداند):
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
نتیجه:
1
2
3
4
5
امتحان کنیددستور StopIteration در پایتون
در مثال بالا، اگر از دستورات next() کافی استفاده کنیم، یا اگر از یک حلقهی for استفاده کنیم، این دنباله تا ابد ادامه پیدا میکند. برای جلوگیری از تکرار شدن دنباله تا ابد، میتوانیم از دستور StopIteration استفاده کنیم. در متد __next__() میتوانیم یک شرط خاتمهدهنده اضافه کنیم تا اگر تکرارِ دنباله، بخواهد از تعداد دفعات خاصی فراتر برود، یک خطا ایجاد شود:
مثال شماره 6
متوقف شدن، پس از 20 تکرار:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)
نتیجه:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
امتحان کنید
منبع: www.w3schools.com/python
- بازدید: 42
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.