وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

مقدمه ای بر تکرار کننده های پایتون

0 4
زمان لازم برای مطالعه: 5 دقیقه


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

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید