بهزاد دبیری
بهزاد دبیری
خواندن ۲ دقیقه·۱ سال پیش

توی این قسمت قراره با iterator یا تکرارگر آشنا بشیم


تکرار گر یا iterator یک شی است که شامل تعدادی مقدار است.یک iterator یک شی قابل پیمایش است به این معنی که می تواند تمام مقادیر خود را تک به تک برگرداند.از نظر فنی در پایتون، iterator یک شی است که پروتکل تکرار کننده را اجرا می کند که شامل متدهای ()__iter__ و ()__next__ است.

تکرارگر یا Iterator در مقابل iterable یا قابل تکرار:

لیست ها(lists)، چندتایی ها (tuples)،فرهنگ لغت ها (dictionaries) و مجموعه ها (sets) همه اشیاء قابل تکرار یا در اصطلاح  iterable هستند.این ها ظرف های قابل تکرار (iterable) هستند که می توانید از آن ها یک تکرار کننده (iterator) تهیه کنید.همه این اشیاء دارای یک متد با نام ()iter هستند که برای به دست آوردن یک تکرار کننده (iterator) مورد استفاده قرار می گیرد.مثال: در این مثال در یک چندتایی (Tuple) یک تکرار کننده (iterator) را به دست می آورد و هر کدام از مقادیر آن  را به صورت تکی چاپ می کند.

myt_uple = ("tom", "rose", "nina")

my_iterator = iter(my_tuple)

print(next(my_iterator))

print(next(my_iterator))

print(next(my_iterator))

output :

tom

rose

nina

حتی رشته ها (Strings) هم جزو اشیاء قابل تکرار (iterable) هستند و می توان از آن ها یک تکرار کننده (iterator) به دست آورد.

my_str = "banana"

my_iterator = iter(my_str)

print(next(my_iterator))

print(next(my_iterator))

print(next(my_iterator))

print(next(my_iterator))

print(next(my_iterator))

print(next(my_iterator))

output :

b

a

n

a

n

a

ایجاد یک تکرار کننده (iterator) در پایتون:

برای ایجاد یک شی/کلاس  به عنوان یک تکرار کننده (iterator) باید متدهای ()__iter__ و ()__next__ را برای شی خودتان پیاده سازی کنید.همونطور که میدونیم همه کلاس ها تابعی با نام ()__init__ دارند، که به شما اجازه می دهد مقداردهی های اولیه را در هنگام ایجاد شی انجام دهید.متد ()__iter__ عملکردی مشابه ()__init__ دارد که شما می توانید مقداردهی اولیه و کارهایی از این قبیل را انجام دهید اما همیشه باید شی تکرار کننده (iterator) را خودتان برگردانید.متد ()__next__ به شما اجازه انجام عملیات می دهد، و باید آیتم های بعدی را به ترتیب برگردانید.

دستور stopiteration:

برای جلوگیری از ادامه تکرار تا بی نهایت از دستور stopiteration استفاده می کنیم. به مثال زیر توجه کنید:

class Friend:

def __init__(self):

self.names = ['amir', 'kevin', 'jack', 'bob']

def __iter__(self):

for i in self.names:

yield i

def __next__(self):

copy_names = self.names

for name in copy_names:

return name

else:

raise StopIteration

حالا برای صدا زدن آبجکت هایی که از کلاس Friend ساخته میشوند باید از تابع next استفاده کنید تا در هر مرحله فقط یک آیتم برگشت داده شود:

fr = Friend()

print( next(fr) )

print( next(fr) )

print( next(fr) )

print( next(fr) )

amir

kevin

jack

bob

امیدوارم که مطالب مورد استفاده باشه?

شاید از این پست‌ها خوشتان بیاید