راه
۵ کیو· متوسط رو به بالامتوسطPYTHON۴ ثانیه · ۲۵۶ مگابایت

وارون‌پیما (Reverse)

در این تمرین، با پیاده‌سازی پروتکل پیمایش (Iterator Protocol) در پایتون آشنا می‌شوید. هدف این تمرین، ایجاد یک کلاس است که امکان پیمایش معکوس بر روی عناصر یک لیست را فراهم می‌کند، بدون این‌که لیست اصلی تغییر کند.


کلاس Reverse

متد سازنده این کلاس باید یک لیست را به‌عنوان ورودی دریافت کند.

این کلاس باید قابلیت پیمایش (Iteration) داشته باشد، به طوری که بتوان با استفاده از حلقه‌ی for بر روی نمونه‌های آن پیمایش کرد.

هنگام پیمایش، کلاس باید عناصر لیست ورودی را به ترتیب معکوس خروجی دهد.


💡 راهنمایی

برای پیاده‌سازی قابلیت پیمایش در کلاس خود و تبدیل آن به یک Iterator، نیاز دارید داندر متدهای __init__، __iter__ و __next__ را پیاده‌سازی کنید.

  • __init__: لیست ورودی را ذخیره می‌کند.
  • __iter__: باید یک شیء Iterator (self در این حالت) را برگرداند.
  • __next__: هر بار عنصر بعدی را در ترتیب معکوس برگردانده و پس از اتمام عناصر، استثنای StopIteration را پرتاب کند.

از الگویی که در درس‌نامه‌ی قبل دیدید، کمک بگیرید.

اطمینان حاصل کنید که لیست اصلی (لیستی که به سازنده‌ی کلاس داده می‌شود) در طول فرایند پیمایش به هیچ وجه تغییر نکند.


🎯 مثال

python
ls = [10, 20, 30]

print("Reverse iteration")
for it in Reverse(ls):
    print(it)

print("Original list:")
print(ls)

خروجی:

text
Reverse iteration:
30
20
10
Original list:
[10, 20, 30]

💡 راهنمایی نهایی

ساختار کلی کلاس Reverse به این شکل است:

python
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']

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود