از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
مقدمه ای بر تکرار کننده های پایتون
سرفصلهای مطلب
Iterators چیست؟
تکرار کننده در پایتون به شیئی اشاره دارد که می توانیم روی آن تکرار کنیم. تکرار کننده از مقادیر قابل شمارش تشکیل شده است و می توان از میان این مقادیر یک به یک عبور کرد.
تکرار کننده به سادگی پروتکل تکرار کننده پایتون را پیاده سازی می کند. پروتکل iterator یک کلاس پایتون است که با دو روش خاص ارائه می شود __iter__()
و __next__()
. با این دو روش، تکرار کننده قادر است مقدار بعدی را در تکرار محاسبه کند.
با تکرارکننده ها، کار با دنباله ای از آیتم ها در پایتون برای ما آسان است. ما مجبور نیستیم منابع محاسباتی را به همه موارد در دنباله تخصیص دهیم، بلکه بر روی یک آیتم در یک زمان تکرار می کنیم که به ما در صرفه جویی در فضای حافظه کمک می کند.
در این مقاله به بررسی روش کار با تکرار کننده ها در پایتون می پردازیم.
اشیاء قابل تکرار در پایتون
یک تکرار شیئی است که قادر به برگرداندن یک تکرار کننده است. یک تکرارپذیر می تواند هم منابع داده متناهی و هم منابع داده بی نهایت را نشان دهد. تکرارپذیر به طور مستقیم یا غیرمستقیم دو روش را پیاده سازی می کند: __iter__()
و __next__()
. این __iter__()
متد شی iterator را برمی گرداند در حالی که the __next__()
متد به ما کمک می کند تا عناصر موجود در شی تکرار شونده را طی کنیم.
نمونه هایی از اشیاء تکرارپذیر در پایتون شامل لیست ها، دیکشنری ها، تاپل ها و مجموعه ها می باشد.
ایجاد Iterator
در پایتون با پیاده سازی عبارت یک تکرار کننده ایجاد می کنیم __iter__()
و __next__()
مواد و روش ها روی شی به مثال زیر توجه کنید:
class IterationExample:
def __iter__(self):
self.x = 0
return self
def __next__(self):
y = self.x
self.x += 1
return y
classinstance = IterationExample()
element = iter(classinstance)
ما یک تکرار کننده به نام ایجاد کرده ایم element
که اعداد از 0 تا N را چاپ می کند. ابتدا یک نمونه از کلاس ایجاد کردیم و نام آن را گذاشتیم classinstance
. سپس با iter()
متد داخلی و نام نمونه کلاس را به عنوان پارامتر ارسال کرد. این شیء تکرار کننده را ایجاد می کند.
اکنون اجازه دهید در مورد چگونگی استفاده از تکرار کننده برای تکرار واقعی در آیتم ها بحث کنیم.
تکرار از طریق Iterator
این next()
متد به ما کمک می کند تا از طریق عناصر یک تکرار کننده تکرار کنیم. اجازه دهید این را با مثالی که در بالا ذکر شد نشان دهیم:
class IterationExample:
def __iter__(self):
self.x = 0
return self
def __next__(self):
y = self.x
self.x += 1
return y
classinstance = IterationExample()
element = iter(classinstance)
print(next(element))
print(next(element))
print(next(element))
print(next(element))
print(next(element))
print(next(element))
print(next(element))
print(next(element))
print(next(element))
print(next(element))
خروجی
0
1
2
3
4
5
6
7
8
9
در اسکریپت بالا، ما را صدا زدیم next()
متد و نام عنصر تکرار کننده را به عنوان پارامتر به متد ارسال می کند. هر بار که این کار را انجام می دهیم، تکرار کننده به عنصر بعدی در دنباله می رود. در اینجا یک مثال دیگر وجود دارد:
list1 = (0, 5, 10, 15)
element = iter(list1)
print(next(element))
print(next(element))
print(element.__next__())
print(element.__next__())
خروجی
0
5
10
15
در اسکریپت بالا، لیستی به نام ایجاد کردیم list1
، که دارای 4 عدد صحیح است. یک تکرار کننده به نام element
ایجاد شده است. این next()
متد به ما کمک کرده تا از طریق عناصر لیست تکرار کنیم.
تکرار با حلقه “for”.
این for
حلقه به ما کمک می کند تا از طریق هر شیئی که قادر به برگرداندن یک تکرار کننده است، تکرار کنیم. مثلا:
list1 = (0, 5, 10, 15)
element = iter(list1)
for x in element:
print(x)
خروجی
0
5
10
15
در کد بالا یک متغیر به نام ایجاد کردیم x
، که برای تکرار از طریق تکرار کننده استفاده می شود element
از طریق a for
حلقه
تکرار کننده های بی نهایت
تکرار کننده نامتناهی، تکرار کننده ای است که تعداد تکرارهای نامتناهی دارد. هنگام برخورد با تکرار کننده های بی نهایت باید مراقب باشیم. به مثال زیر توجه کنید:
class IterationExample:
def __iter__(self):
self.x = 0
return self
def __next__(self):
y = self.x
self.x += 1
return y
classinstance = IterationExample()
element = iter(classinstance)
for x in element:
print(x)
کد بالا برای همیشه اجرا می شود. برای متوقف کردن آن، باید به صورت دستی مداخله کنید. در اینجا مثال دیگری وجود دارد که روش ایجاد یک تکرار کننده بی نهایت در پایتون را نشان می دهد:
class Infinite:
def __iter__(self):
self.x = 0
return self
def __next__(self):
x = self.x
self.x += 2
return x
کد باید همه اعداد زوج را برگرداند که از 0 شروع می شود. ما می توانیم کد را همانطور که در زیر نشان داده شده است اجرا کنیم:
>>> y = iter(Infinite())
>>> next(y)
0
>>> next(y)
2
>>> next(y)
4
>>> next(y)
6
>>> next(y)
8
>>> next(y)
10
>>>
و زنجیره بالا می تواند برای همیشه ادامه یابد. این نشان می دهد که با یک تکرار کننده بی نهایت، می توانیم تعداد نامتناهی آیتم ها را بدون نیاز به ذخیره همه آنها در حافظه داشته باشیم.
در بخش بعدی، خواهیم دید که چگونه می توانیم مکانیزمی را برای خروج از چنین تکرار کننده های بی نهایت پیاده سازی کنیم.
توقف یک تکرار
در قسمت قبل روش ایجاد یک تکرار کننده بی نهایت در پایتون را دیدیم. با این حال، تکرار کننده ها معمولا برای تکرار بی نهایت در پایتون در نظر گرفته نشده اند. اجرای یک شرط خاتمه همیشه راحت است.
ما میتوانیم با استفاده از عبارت، اجرای یک تکرارکننده را برای همیشه متوقف کنیم StopIteration
بیانیه. ما فقط نیاز داریم که یک شرط پایان دهنده را به آن اضافه کنیم __next__()
روشی که پس از رسیدن به تعداد تکرار مشخص شده، خطا ایجاد می کند. به عنوان مثال:
class StoppingIteration:
def __iter__(self):
self.x = 1
return self
def __next__(self):
if self.x <= 5:
y = self.x
self.x += 1
return y
else:
raise StopIteration
classinstance = StoppingIteration()
element = iter(classinstance)
for a in element:
print(a)
خروجی
1
2
3
4
5
اجرا پس از 5 بار تکرار متوقف می شود. این به دلیل است self.x <= 5:
شرایط اضافه شده در __next__()
روش. اگر تکرار کننده بعد از رسیدن به 5 فراخوانی شود، افزایش می یابد StopIteration
رویداد. به مثال زیر توجه کنید:
class StoppingIteration:
def __init__(self, max = 0):
self.max = max
def __iter__(self):
self.x = 1
return self
def __next__(self):
if self.x <= self.max:
val = 3 ** self.x
self.x += 1
return val
else:
raise StopIteration
اجازه دهید یک تکرار کننده ایجاد کنیم و سپس از طریق آن تکرار کنیم:
>>> y = StoppingIteration(3)
>>> z = iter(y)
>>> next(z)
3
>>> next(z)
9
>>> next(z)
27
>>> next(z)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
next(z)
File "C:\Users\admin\iteration.py", line 17, in __next__
raise StopIteration
StopIteration
>>>
شرط پایان در بخش زیر کد ما پیاده سازی شده است:
if self.x <= self.max:
val = 3 ** self.x
مقدار 3 را به تکرار کننده ارسال کردیم، یعنی تکرار کننده نباید بیشتر از 27 یعنی 3^3 تکرار کند.
نتیجه
تکرار کننده ها بسیار مفید هستند، به خصوص اگر شما نیاز به تکرار از طریق یک دنباله بزرگ از آیتم ها دارید. تکرارکنندهها به شما امکان میدهند تا از طریق دنبالهای از آیتمها را یکبار تکرار کنید، بدون اینکه مجبور باشید همه موارد را به طور همزمان در حافظه بارگذاری کنید.
در این مقاله روش ایجاد iterator در پایتون و روش تکرار از طریق آیتم ها در یک تکرار کننده را دیدیم. همچنین دیدیم که چگونه یک تکرار کننده بی نهایت ایجاد کنیم و چگونه شرط پایان دهنده را به یک تکرار کننده بی نهایت اضافه کنیم.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-25 07:26:03