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

4 سال پیش

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

در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، شما یاد خواهید گرفت که چگونه تکرار کننده ها در برنامه نویسی پایتون کار می کند و چگونه می توانید با استفاده از روش های __iter__ و __next__ تکرار کننده خود را بسازید.

پیشنهاد ویژه : پکیج آموزش پروژه محور پایتون

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

تکرار کننده ها در همه جای پایتون هستند. آنها به زیبایی برای حلقه ها، ژنراتورها و غیره اجرا می شوند.

تکرار کننده در پایتون به سادگی یک شی است که می توان از آن تکرار کرد. شیئی که داده ها را باز می گرداند.

به بیان فنی، یک شی تکرار کننده پایتون باید دو روش خاص ، () __iter __و ()__next __  را اجرا کند، که به طور کلی پروتکل تکرار کننده نامیده می شود.

اگر یک شی object بتواند یک تکرار کننده از آن بدست آوریم، یک شی erable نامیده می شود بیشتر گزینه های داخلی در پایتون مانند: لیست ، تاپل ، رشته و غیره قابل تکرار هستند.

تابع ()iter  (که به نوبه خود روش() __iter __  را فراخوانی می کند) یک تکرار کننده از آنها برمی گرداند.

تکرار از طریق یک تکرار کننده 

ما از تابع ()next  برای تکرار دستی همه موارد تکرار کننده استفاده می کنیم. وقتی به پایان رسیدیم و دیگر داده ای برای برگشت وجود ندارد، این امر باعث ایجاد استثنا StopIteration می شود. در زیر مثالی ذکر شده است.

# define a list
my_list = [4, 7, 0, 3]

# get an iterator using iter()
my_iter = iter(my_list)

# iterate through it using next()

# Output: 4
print(next(my_iter))

# Output: 7
print(next(my_iter))

# next(obj) is same as obj.__next__()

# Output: 0
print(my_iter.__next__())

# Output: 3
print(my_iter.__next__())

# This will raise error, no items left
next(my_iter)

 

خروجی

۴
۷
۰
۳
Traceback (most recent call last):
  File "<string>", line 24, in <module>
    next(my_iter)
StopIteration

 

یک روش ظریف تر برای تکرار خودکار استفاده از حلقه for است. با استفاده از این، می توانیم بر روی هر شیئی که می تواند یک تکرار کننده را برگرداند، به عنوان مثال لیست، رشته، پرونده و غیره تکرار کنیم.

>>> for element in my_list:
...     print(element)
...     
۴
۷
۰
۳

 

حلقه for برای تکرارکننده ها

همانطور که در مثال بالا مشاهده می کنیم، حلقه for قادر بود به طور خودکار از طریق لیست تکرار شود.

در واقع حلقه for می تواند بیش از هر تکرار شونده ای، تکرار شود. بیایید نگاهی دقیق به نحوه پیاده سازی حلقه for در پایتون بیندازیم.

for element in iterable:
    # do something with element

 

# create an iterator object from that iterable
iter_obj = iter(iterable)

# infinite loop
while True:
    try:
        # get the next item
        element = next(iter_obj)
        # do something with element
    except StopIteration:
        # if StopIteration is raised, break from loop
        break

 

بنابراین، حلقه for با فراخوانی ()iter بر روی قابلیت تکرار، یک شی تکرارکننده، iter_obj ایجاد می کند.

از قضا این حلقه for در واقع یک حلقه while بی نهایت است.

درون حلقه، ()next  را فرا می خواند تا عنصر بعدی را بدست آورد و بدنه حلقه for را با این مقدار اجرا می کند. بعد از تمام شدن موارد، StopIteration مطرح می شود که به صورت داخلی گرفته می شود و حلقه پایان می یابد. توجه داشته باشید که هر نوع استثنا دیگری از آن عبور خواهد کرد.

ساخت تکرارکننده های سفارشی

ساخت یک تکرار کننده از ابتدا در پایتون آسان است. ما فقط باید روش های ()__iter __  و () _next __ را پیاده سازی کنیم.

روش () __iter __ خود شی تکرار کننده را برمی گرداند. در صورت نیاز می توان مقداری مقداردهی اولیه را انجام داد.

روش ()__next __ باید مورد بعدی را به ترتیب بازگرداند. با رسیدن به پایان و در فراخوانی های بعدی، باید StopIteration را افزایش دهد.

class PowTwo:
    """Class to implement an iterator
    of powers of two"""

    def __init__(self, max=0):
        self.max = max

    def __iter__(self):
        self.n = 0
        return self

    def __next__(self):
        if self.n <= self.max:
            result = 2 ** self.n
            self.n += 1
            return result
        else:
            raise StopIteration


# create an object
numbers = PowTwo(3)

# create an iterable from the object
i = iter(numbers)

# Using next to get to the next iterator element
print(next(i))
print(next(i))
print(next(i))
print(next(i))
print(next(i))

 

خروجی

۱
۲
۴
۸
Traceback (most recent call last):
  File "/home/bsoyuj/Desktop/Untitled-1.py", line 32, in <module>
    print(next(i))
  File "<string>", line 18, in __next__
    raise StopIteration
StopIteration

 

همچنین می توانیم از حلقه for برای تکرار در کلاس تکرار کننده خود استفاده کنیم.

>>> for i in PowTwo(5):
...     print(i)
...     
۱
۲
۴
۸
۱۶
۳۲

 

تکرار کننده های نامحدود پایتون

تکرار کننده های نامحدود می تواند وجود داشته باشد (که هرگز پایان نمی یابد). ما باید هنگام مدیریت چنین تکرارکننده هایی مراقب باشیم.

در اینجا یک مثال ساده برای نمایش تکرارکننده های نامحدود آورده شده است.

تابع توکاز () iter را می توان با دو آرگومان فراخوانی کرد که در آن آرگومان اول باید یک شی (تابع) قابل فراخوانی باشد و دوم نگهبان باشد. تکرار کننده این تابع را فراخوانی می کند تا زمانی که مقدار برگشتی برابر با نگهبان باشد.

>>> int()
۰

>>> inf = iter(int,1)
>>> next(inf)
۰
>>> next(inf)
۰

 

می توانیم ببینیم که تابع ()int  همیشه ۰ را برمی گرداند. بنابراین عبور از آن به عنوان (iter (int، ۱ یک تکرار کننده را باز می گرداند که()int را فرا می خواند تا زمانی که مقدار بازگشتی برابر با ۱ شود. این هرگز اتفاق نمی افتد و یک تکرار کننده بی نهایت به وجود می آید.

همچنین می توانیم تکرارکننده های نامحدود خود را بسازیم. تکرار کننده زیر، از نظر تئوری تمام اعداد فرد را برمی گرداند.

class InfIter:
    """Infinite iterator to return all
        odd numbers"""

    def __iter__(self):
        self.num = 1
        return self

    def __next__(self):
        num = self.num
        self.num += 2
        return num

 

یک نمونه اجرا به شرح زیر است.

>>> a = iter(InfIter())
>>> next(a)
۱
>>> next(a)
۳
>>> next(a)
۵
>>> next(a)
۷

 

مزیت استفاده از تکرارکننده ها صرفه جویی در منابع است. همانطور که در بالا نشان داده شده است، ما می توانیم تمام اعداد فرد را بدون ذخیره کل سیستم اعداد در حافظه بدست آوریم. ما می توانیم موارد بی نهایت (از نظر تئوری) در حافظه محدود داشته باشیم.

یک روش ساده تر برای ایجاد تکرار در پایتون وجود دارد.

منبع.

لیست جلسات قبل آموزش برنامه نویسی پایتون

  1. آموزش نصب و اجرای برنامه نویسی پایتون
  2. کلیدواژه ها و شناسه های برنامه نویسی پایتون
  3. دستورات، تورفتگی ها و کامنت ها در برنامه نویسی پایتون
  4. متغیرها، ثابت ها و لیترال ها در برنامه نویسی پایتون 
  5. انواع داده ها در برنامه نویسی پایتون
  6. تبدیل نوع در برنامه نویسی پایتون
  7. ورودی، خروجی و وارد کردن در برنامه نویسی پایتون
  8. عملگرها در برنامه نویسی پایتون
  9. نام و دامنه در برنامه نویسی پایتون
  10. دستور شرطی if…else در برنامه نویسی پایتون
  11. حلقه for در برنامه نویسی پایتون
  12. حلقه while در برنامه نویسی پایتون
  13. دستورات break و continue در برنامه نویسی پایتون
  14. دستور pass در برنامه نویسی پایتون
  15. توابع در برنامه نویسی پایتون
  16. آرگومان تابع در برنامه نویسی پایتون
  17. تابع بازگشتی در برنامه نویسی پایتون
  18. تابع بی نام/ تابع لامبدا در برنامه نویسی پایتون
  19. متغیرهای سراسری، محلی و غیر محلی در برنامه نویسی پایتون
  20. کلیدواژه global در برنامه نویسی پایتون
  21. ماژول های برنامه نویسی پایتون
  22. پکیج ها در برنامه نویسی پایتون
  23. اعداد و تبدیل نوع داده در برنامه نویسی پایتون 
  24. لیست در برنامه نویسی پایتون
  25. تاپل در برنامه نویسی پایتون 
  26. رشته ها در برنامه نویسی پایتون
  27. مجموعه ها در برنامه نویسی پایتون
  28. دیکشنری در برنامه نویسی پایتون
  29. عملیات ورودی/خروجی در برنامه نویسی پایتون 
  30. دایرکتوری و مدیریت فایل ها در برنامه نویسی پایتون
  31. خطاها و استثناهای توکار در برنامه نویسی پایتون
  32. مدیریت استثناها در برنامه نویسی پایتون
  33. استثناهای تعریف شده توسط کاربر در برنامه نویسی پایتون
  34. برنامه ‌نویسی شی گرا در پایتون
  35. اشیا و کلاس ها در برنامه نویسی پایتون
  36. وراثت در برنامه نویسی پایتون
  37. وراثت چندگانه در برنامه نویسی پایتون
  38. سربارگذاری عملگرها در برنامه نویسی پایتون
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه