وارونپیما (Reverse)
در این تمرین، با پیادهسازی پروتکل پیمایش (Iterator Protocol) در پایتون آشنا میشوید. هدف این تمرین، ایجاد یک کلاس است که امکان پیمایش معکوس بر روی عناصر یک لیست را فراهم میکند، بدون اینکه لیست اصلی تغییر کند.
کلاس Reverse
متد سازنده این کلاس باید یک لیست را بهعنوان ورودی دریافت کند.
این کلاس باید قابلیت پیمایش (Iteration) داشته باشد، به طوری که بتوان با استفاده از حلقهی
forبر روی نمونههای آن پیمایش کرد.
هنگام پیمایش، کلاس باید عناصر لیست ورودی را به ترتیب معکوس خروجی دهد.
💡 راهنمایی
برای پیادهسازی قابلیت پیمایش در کلاس خود و تبدیل آن به یک Iterator، نیاز دارید داندر متدهای __init__، __iter__ و __next__ را پیادهسازی کنید.
__init__: لیست ورودی را ذخیره میکند.__iter__: باید یک شیء Iterator (self در این حالت) را برگرداند.__next__: هر بار عنصر بعدی را در ترتیب معکوس برگردانده و پس از اتمام عناصر، استثنایStopIterationرا پرتاب کند.
از الگویی که در درسنامهی قبل دیدید، کمک بگیرید.
اطمینان حاصل کنید که لیست اصلی (لیستی که به سازندهی کلاس داده میشود) در طول فرایند پیمایش به هیچ وجه تغییر نکند.
🎯 مثال
ls = [10, 20, 30]
print("Reverse iteration")
for it in Reverse(ls):
print(it)
print("Original list:")
print(ls)
خروجی:
Reverse iteration:
30
20
10
Original list:
[10, 20, 30]
💡 راهنمایی نهایی
ساختار کلی کلاس Reverse به این شکل است:
class Reverse:
def __init__(self, data):
self._data = data
self._index = len(data) - 1
def __iter__(self):
return self
def __next__(self):
if self._index < 0:
raise StopIteration
result = self._data[self._index]
self._index -= 1
return result
_data← ذخیرهی لیست ورودی (بدون تغییر)_index← اندیس آخرین عنصر (شروع از انتها)__iter__← برگرداندنselfبهعنوان Iterator__next__← برگرداندن عنصر با اندیس_indexو کاهش آن- وقتی
_indexبه-1رسید ← پرتابStopIteration- لیست اصلی با استفاده از اندیسگذاری خوانده میشود، نه حذف، بنابراین تغییری نمیکند.
✅ این تمرین را در ویرایشگر خود پیادهسازی کنید. به یاد داشته باشید که کلاس
Reverseباید پروتکل پیمایش را پیادهسازی کند و لیست اصلی را تغییر ندهد.
نمونهها
ls = [10, 20, 30] [item for item in Reverse(ls)] ls
[30, 20, 10] [10, 20, 30]
list(Reverse([]))
[]
list(Reverse(['only']))
['only']
r = Reverse([1, 2, 3]) next(r) next(r) next(r) next(r, "done")
3 2 1 'done'
r = Reverse([4, 5]) iter(r) is r
True
words = ["a", "b", "c", "d"] "".join(Reverse(words)) words
'dcba' ['a', 'b', 'c', 'd']
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود