ویدیو آشنایی با مفهوم iterate و ساخت آبجکت های iterable در پایتون

امیرحسین بیگدلو July 2023

کامپیوترها اغلب برای خودکارسازی کارهای تکراری استفاده می شوند. تکرار کارهای مشابه بدون ایجاد خطا، کاری است که کامپیوترها به خوبی انجام آن را انجام می دهند. اجرای مکرر مجموعه ای از دستورات را 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ها در پایتون

دوره آموزش الگوریتم‌نویسی در پایتون

آموزش ماژول pdb در پایتون

ویدیوهای مشابه



ارسال نظر


Alieh

4 ماه قبل پاسخ به نظر

بسیار عالی بود،ممنونم.

ارسال نظر



efyas

6 ماه قبل پاسخ به نظر

خیلی رسا بود، سپاس.

ارسال نظر



Kourosh

1 سال قبل پاسخ به نظر

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

ارسال نظر



AmiRo

1 سال قبل پاسخ به نظر

ویدیو مسلط و خوبی بود
ممنون

ارسال نظر



سید محمد

2 سال قبل پاسخ به نظر

فوق العاده عالی و قابل فهم
برعکس 3 منبع قبلی که خوندم هیچی گیرم نیومد =)

ارسال نظر



امیرحسین

2 سال قبل پاسخ به نظر

عالی

ارسال نظر



مونگارد