ویدیو آشنایی با مفهوم iterate و ساخت آبجکت های iterable در پایتون
کامپیوترها اغلب برای خودکارسازی کارهای تکراری استفاده می شوند. تکرار کارهای مشابه بدون ایجاد خطا، کاری است که کامپیوترها به خوبی انجام آن را انجام می دهند. اجرای مکرر مجموعه ای از دستورات را iteration می گویند. از آنجایی که iteration بسیار رایج است، پایتون چندین ویژگی را برای آسانتر کردن آن فراهم میکند مانند حلقه for و حلقه while. در این ویدیو با مفهوم iteration آشنا شده و نحوه ساخت آبجکت های iterable و iterator را یاد میگیرید.
# ساخت آبجکت های iterable با تابع __iter__ پایتون
آبجکت های iterable در پایتون، به آبجکت هایی گفته میشود که بتوان با حلقه for در آنها پیمایش کرده و آیتم های آنها درسترسی پیدا کرد. ساختارهای داده مانند لیستها، تاپلها، دیکشنریها یا رشتهها همگی iterable هستند چون میتوان داخل آنها پیمایش کرد اما اعداد iterable نیستند زیرا نمیتوان داخل آنها پیمایش کرد.
به طور مثال، در کد زیر از range استفاده کرده و در آن پیمایش میکنیم. از این مثال میتوان نتیجه گرفت که آبجکت range قابل پیمایش(iterable) است:
>>> for i in range(5):
... print(i)
0
1
2
3
4
کلاس هایی که ایجاد میکنید به صورت پیشفرض iterable نیستند. برای تبدیل یک آبجکت به iterable باید داخل کلاس آن از تابع __iter__ استفاده کنید. مثلا در کد زیر یک کلاس به نام Friend ایجاد کرده و اسامی دوستانمان را در آن ذخیره میکنیم:
class Friend:
def __init__(self):
self.names = ['amir', 'kevin', 'jack', 'bob']
اگر از این کلاس یک آبجکت ساخته و آن را در یک حلقه for استفاده کنید با خطا مواجه خواهید شد:
fr = Friend()
for i in fr:
print(i)
اگر کد بالا را اجرا کنید با خطای TypeError مواجه میشود. که توضیح میدهد که آبجکت هایی که از کلاس Friend میسازید iterable نیستند و نمیتوانید داخل آنها پیمایش کنید:
TypeError: 'Friend' object is not iterable
برای حل این مشکل باید تابع __iter__ را به کلاس Friend اضافه کنید که مشخص میکند در زمان پیمایش داخل آبجکت های کلاس Friend چه اتفاقی باید بیفتد. در مثال زیر مشخص کردیم که باید آیتم هایی که در names وجود دارند را برگشت دهد:
class Friend:
def __init__(self):
self.names = ['amir', 'kevin', 'jack', 'bob']
def __iter__(self):
for i in self.names:
yield i
حالا میتوانید به راحتی در آبجکت هایی که از کلاس Friend ساختهاید پیمایش کنید:
fr = Friend()
for i in fr:
print(i)
اگر کد بالا را اجرا کنید نتیجه به شکل زیر خواهد بود:
amir
kevin
jack
bob
# ساخت آبجکت های iterator با تابع __next__ پایتون
آبجکت های iterator پایتون دقیقا مشابه آبجکت های iterable هستند با این تفاوت که به جای اینکه تمام آیتمها را یکجا برگشت دهند، آیتمهای خود را استریم کرده و تکه تکه برگشت میدهند. برای استفاده از آبجکت های iterator دیگر نمیتوان آنها را در حلقه for استفاده کرد بلکه باید با تابع next آنها را صدا زد.
برای تبدیل کلاس Friend به یک آبجکت iterator باید به آن تابع __next__ را اضافه کنیم که مشخص میکند در زمان فراخوانی با تابع next چه اتفاقی باید بیفتد:
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) )
bob
>>> print( next(fr) )
jack
>>> print( next(fr) )
kevin
>>> print( next(fr) )
amir
اگر ویدیو بالا را دوست داشتید پیشنهاد میکنیم به مطالب زیر هم سر بزنید:
آموزش ماژول platform در پایتون
دوره سوم آموزش پروژه محور پایتون
ارزیابی class variableهای پایتون
مشکل سازگاری importها در پایتون
ارسال نظر