تابع Reverse در پایتون و معکوس کردن داده ها با آن + مثال
زبان برنامه نویسی پایتون توابع و ویژگیهای بسیاری دارد، از اینرو برنامه نویسی با این زبان و نوشتن کدهای آن نسبت به برخی از زبانهای دیگر سادهتر است. هدف این نوشتار بررسی تابع Reverse در پایتون و معکوس کردن دادهها با آن به حساب میآید. همچنین در این مطلب، برخی دیگر از روشهای معکوس کردن دادهها نیز مورد بررسی قرار میگیرند. تابع Reverse در پایتون یکی از توابع ساده و کاربردی در برنامه نویسی با این زبان است. بنابراین، در این مطلب به بررسی اختصاصی این تابع مهم و همچنین تابع Reversed، روش Slicing، تابع Slice و معکوس کردن لیست در پایتون پرداخته میشود.
چگونه می توان در پایتون داده ها را معکوس کرد؟
معمولاً برنامه نویسان در اکثر موارد هنگام توسعه کدها، با «رشتهها» (String) در پایتون سر و کار دارند. گاهی نیاز است که این دادهها معکوس شوند، برای مثال، در برنامهای با هدف ساخت بازی در پایتون، ممکن است برنامه نویس قصد داشته باشد به کاربران این امکان را بدهد که با ارسال نام خود به برنامه و وارونه کردن آن، نام کاربری برای خود ایجاد کنند.
معکوس کردن دادهها در برنامه نویسی روش رایجی نیست، اما با این حال برای آن در پایتون تابعی خاص وجود دارد. همچنین، گاهی اوقات سوالاتی در رابطه با این تابع در مصاحبههای برنامه نویسی به عنوان سوالات مصاحبه برنامه نویسی پایتون از کارجویان پرسیده میشود. در معکوس کردن دادهها دو چالش زیر وجود دارد:
- معکوس کردن یک لیست در جای خودش
- ایجاد یک کپی از دادههای معکوس شده موجود
برای حل چالش اول از تابع Reverse در پایتون استفاده میشود و این تابع با استفاده از حلقهای دادهها را بر اساس «اندیسهای» (Index) آنها «جابهجا» (Swap) میکند. برای حل چالش دوم فوق، میتوان از تابع «Reversed» یا عملیات «Slicing» استفاده کرد. در بخش بعدی ابتدا تابع Reverse در پایتون را یاد میگیریم.
تابع Reverse در پایتون چیست ؟
مانند انواع دیگر «دنبالههای قابل تغییر» (Mutable Sequence) در پایتون، در لیستهای پایتون میتوان از تابع Reverse استفاده کرد. این روش، از پایه همه دادههای موجود در لیست را در حافظه برنامه معکوس میکند. در ادامه مثالی برای نمایش روش استفاده از متد Reverse در پایتون ارائه شده است:
1>>> digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2
3>>> digits.reverse()
4>>> digits
5[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
زمانی که تابع Reverse در پایتون برای یک لیست موجود فراخوانی میشود، دادههای این لیست در همان مکان در حافظه معکوس خواهند شد. بنابراین پس از این عملیات، زمانی که برنامه نویس به لیست احتیاج داشته باشد، فقط معکوس این لیست موجود است. باید به این نکته توجه شود که تابع Reverse در پایتون یک لیست جدید را برنمیگرداند؛ برای مشخص شدن این موضوع لازم است به کدهای زیر توجه شود:
1>>> digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2
3>>> reversed_digits = digits.reverse()
4>>> reversed_digits is None
5True
تلاش برای تخصیص نتیجه اعمال متد reverse در پایتون به یک متغیر دیگر یکی از اشتباهات رایجی است که برنامه نویسان در روند استفاده از این تابع انجام میدهند. در کدهای فوق به این دلیل مقدار متغیرreversed_digits برابر با None شده است که به برنامه نویسان این موضوع را یادآوری کند که تابع Reverse در پایتون به طور کامل لیست را تغییر میدهد. در مثالهای فوق لیستی از اعداد استفاده شده است، با این حال، میتوان متد Reverse در پایتون را روی اشیای دیگری مثل لیستی از رشتهها هم اجرا کرد. چند نکته کلیدی در رابطه با تابع Reverse در پایتون در ادامه ارائه شده است:
- به طور کلی سینتکس تابع Reverse در پایتون همیشه به صورت زیر نوشته میشود:
1list.reverse()
- تابع ()reverse در پایتون هیچ آرگومانی را در پرانتزهای مقابلش دریافت نمیکند.
- تابع Reverse در پایتون هیچ مقداری را برنمیگرداند، در واقع این تابع مقدار ورودی را بروزرسانی میکند.
- اگر هر چیزی به جز لیست با تابع Reverse در پایتون مورد استفاده قرار بگیرد، این تابع دچار خطای «AttributeError» میشود.
در ادامه به شرح بیشتر روش عملکرد این تابع به وسیله اندیسها پرداخته شده است.
روش عملکرد تابع Reverse در پایتون چگونه است؟
اندیسهای زبان پایتون از عدد صفر به سمت اعداد مثبت، یعنی از چپ به راست آغاز میشوند. همچنین در این زبان برنامه نویسی میتوان مطابق تصویر زیر از اندیسهای منفی از راست به چپ هم استفاده کرد:
تصویر فوق نشان میدهد که میتوان با استفاده از اندیس صفر یا ۵- به عنصر اول لیست دسترسی داشت. با فرض اینکه نام Iterable مربوطه Sequence باشد، میتوان مثلاً برای ارجاع به اولین عنصر آن علاوه برsequence[0] ازsequence[-5] هم استفاده کرد. پایتون از این قابلیت یعنی اندیسدهی منفی برای معکوس کردن دادهها استفاده میکند و عملکرد تابع Reverse در پایتون با استفاده از این قابلیت امکانپذیر شده است.
برای مثال، جهت معکوس کردن لیست اعدادی که در تصویر فوق مشاهده میشوند، میتوان لیست را دو قسمت در نظر گرفت و با استفاده از یک «حلقه» (Loop) در بخش اول لیست، عنصر اندیس صفر را با عنصر مشابه آن در طرف دیگر به صورت آینهای یعنی اندیس ۱- جابهجا کرد. سپس در تکرار بعدی عنصر اندیس ۱ با عنصر اندیس ۲- جابهجا میشوند و این کار تا جایی انجام خواهد شد که عناصر لیست به طور کامل معکوس شوند. این فرایند در تصویر متحرک زیر مشاهده میشود:
برای پیادهسازی عملیات معکوس کردن لیست با استفاده از قابلیت اندیسدهی منفی در پایتون، میتوان از یک حلقه For و تابعrange در یک دوم ابتدایی لیست با استفاده ازlen(digits) // 2 (طول نصف لیست مربوطه) استفاده کرد. سپس، از یک عبارت انتساب به صورت موازی جهت جابهجایی عناصر استفاده میشود. در ادامه کدهای این مثال ارائه شدهاند:
1>>> digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2
3>>> for i in range(len(digits) // 2):
4... digits[i], digits[-1 - i] = digits[-1 - i], digits[i]
5...
6
7>>> digits
8[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
این حلقه از طریق تابعrange اندیس صفر تاlen(digits) // 2 را بررسی میکند. در این کدها هر عنصر با داده متناظری جابهجا میشود که به صورت آینهای در یک دوم بعدی لیست در همان موقعیت قرار دارد. اندیس-1 - i که در خط سوم برنامه فوق استفاده شده است، دسترسی به عنصر آینهای هر کدام از عناصر را فراهم میکند. همچنین میتوان از عبارت-1 * (i + 1) نیز برای نشان دادن عنصر آینهای در طرف دیگر لیست استفاده کرد.
به جز مثال فوق که میتوان با استفاده از جایگزینی اندیسها، معکوس کردن دادهها را در آن انجام داد، روشهای دیگری نیز وجود دارند که به صورت دستی میتوان دادههای یک لیست را با استفاده از آنها معکوس کرد. برای مثال میتوان از توابع.pop() و.insert() برای انجام این عملیات به صورت زیر استفاده کرد:
1>>> digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2
3>>> for i in range(len(digits)):
4... last_item = digits.pop()
5... digits.insert(i, last_item)
6...
7
8>>> digits
9[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
در حلقه مثال فوق، تابع.pop() در لیست اصلی بدون آرگومان فراخوانی میشود. این کار، فراخوانی آخرین عنصر لیست را حذف میکند و برمیگرداند، سپس این عنصر درlast_item ذخیره میشود. پس از آن، تابعinsert() ،last_item را به موقعیت اندیسi انتقال میدهد. برای مثال، اولین تکرار در این مثال، عدد ۹ را از سمت راست و آخر لیست حذف و آن را در متغیرlast_item قرار میدهد. سپس عدد ۹ در خانه اول با اندیس شماره صفر قرار میگیرد.
تکرار بعدی حلقه، عدد ۸ را دریافت میکند و آن را در خانه دوم با اندیس شماره یک قرار میدهد و به همین ترتیب ادامه روند جابهجایی انجام میشود. در آخر حلقه، لیست معکوس شده مشاهده خواهد شد. بدین ترتیب با این روشها نیز میتوان عملکردی مانند تابع Reverse در پایتون را انجام داد، اما همانطور که مشاهده شد، استفاده از تابع Reverse روند برنامه نویسی را بسیار سادهتر میکند. در ادامه این مطلب پیش از ارائه مثالهایی از تابع Reverse در پایتون به معرفی برخی از دورههای آموزش برنامه نویسی پایتون فرادرس برای علاقهمندان و دانشجویان پرداخته شده است.
فیلم های آموزش برنامه نویسی پایتون
دورههای آموزش ویدیویی در وبسایت فرادرس بر اساس موضوع در قالب مجموعههای آموزشی متفاوتی دستهبندی میشوند. یکی از این مجموعهها مربوط به آموزش زبان پایتون در سطحهای مقدماتی تا پیشرفته است. با توجه به اینکه این زبان برنامه نویسی در حوزههای مختلف علوم کامپیوتر و صنعت مورد استفاده قرار میگیرد، این بخش به معرفی مجموعه آموزشهای ویدیویی پایتون برای یادگیری بیشتر این زبان در کاربردهای مختلف اختصاص داده شده است. در زمان تدوین این مطلب، مجموعه دورههای برنامه نویسی فرادرس حاوی ۳۱۰ ساعت محتوای ویدیویی است و شامل ۵۷ دوره میشود. در ادامه برخی از دورههای این مجموعه آموزشی به طور خلاصه معرفی شدهاند:
- فیلم آموزش برنامه نویسی پایتون Python - مقدماتی (طول مدت: ۱۹ ساعت و ۵۳ دقیقه، مدرس: پژمان اقبالی شمس آبادی): در این فرادرس زبان برنامه نویسی پایتون از پایهایترین مباحث تدریس میشود و برای دانشجویان و علاقهمندان به پایتون مناسب است. برای مشاهده فیلم آموزش برنامه نویسی پایتون Python - مقدماتی + کلیک کنید.
- فیلم آموزش ترفندهای برنامه نویسی پایتون (طول مدت: 9 ساعت و 9 دقیقه، مدرس: دکتر سید مصطفی کلامی هریس): در این فرادرس، سعی شده است مهمترین و کاربردیترین نکات در خصوص استفاده از زبان برنامهنویسی پایتون و کتابخانههای استاندارد آن، بررسی شوند. با آموختن نکات و ترفندهایی که در این آموزش ارائه شده است، دانش برنامهنویسی فرد به سطح بالاتر از متوسط میرسد و میتواند برای آموختن نکات پیشرفتهتر، برنامهریزی کند. برای مشاهده فیلم آموزش ترفندهای برنامه نویسی پایتون + کلیک کنید.
- فیلم آموزش برنامه نویسی شی گرا در پایتون Python (طول مدت: ۷ ساعت و ۲۹ دقیقه، مدرس: دکتر فرشید شیرافکن): در این فرادرس مفاهیم شی گرایی در پایتون با سادهترین روش و همراه با ذکر مثال آموزش داده شده است. برای مشاهده فیلم آموزش برنامه نویسی شی گرا در پایتون Python + کلیک کنید.
- فیلم آموزش کتابخانه های NumPy و Matplotlib در پایتون (طول مدت: ۴ ساعت و ۴۶ دقیقه، مدرس: میترا تجربه کار): این دوره آموزشی برای تکمیل مباحث موجود در دوره پایتون مقدماتی ارائه شده است. همچنین آشنایی با کتابخانه NumPy، بخش جدیدی از برنامه نویسی پایتون را در این دوره به دانشجویان و علاقهمندان معرفی میکند. برای مشاهده فیلم آموزش کتابخانه های NumPy و Matplotlib در پایتون + کلیک کنید.
- فیلم آموزش پایتون گرافیکی - رابط های گرافیکی پایتون (طول مدت: ۵ ساعت و ۳ دقیقه، مدرس: سید رضا دهقان): برای برنامه نویسان پایتون، یادگیری حداقل یک واسط گرافیکی (Graphical User Interface | GUI) این زبان برنامه نویسی اهمیت بسیاری دارد. به همین دلیل، در این دوره آموزشی به بررسی واسطهای گرافیکی پایتون پرداخته شده است. برای مشاهده فیلم آموزش پایتون گرافیکی - رابطهای گرافیکی پایتون + کلیک کنید.
- فیلم آموزش پروژه محور Python پایتون - ساخت نرم افزار برای ویندوز و لینوکس در Python (طول مدت: ۹ ساعت و ۳۴ دقیقه، مدرس: محمد حسینی): ابزار توسعه در این دوره آموزشی بر مبنای PyQt است. با استفاده از این فرادرس، علاقهمندان با نحوه تولید نرم افزار آشنا میشوند و میتوانند برای هر زمینهای نرم افزار مورد نیازشان را بسازند. برای مشاهده فیلم آموزش پروژه محور Python پایتون - ساخت نرم افزار برای ویندوز و لینوکس در Python + کلیک کنید.
اکنون پس از معرفی برخی از دورههای آموزش زبان برنامه نویسی پایتون، بخش بعدی این مطلب، به بررسی برخی از مثالهای تابع Reverse در پایتون اختصاص داده شده است.
مثال های تابع Reverse در پایتون
در این بخش از مطلب «تابع Reverse در پایتون» چند مثال کاربردی برای نمایش رویکرد این تابع در برنامهها نمایش داده میشود.
مثال اول تابع Reverse در پایتون
در این مثال یک لیست حاوی رشته ابتدا در خروجی چاپ میشود. سپس این لیست با استفاده از متد reverse در پایتون معکوس شده و نتیجه آن هم در خروجی چاپ شده است.
1# Operating System List
2systems = ['Windows', 'macOS', 'Linux']
3print('Original List:', systems)
4
5# List Reverse
6systems.reverse()
7
8
9# updated list
10print('Updated List:', systems)
خروجی کدهای فوق پس از پیادهسازی به صورت زیر نمایش داده میشوند:
Original List: ['Windows', 'macOS', 'Linux'] Updated List: ['Linux', 'macOS', 'Windows']
مثال دوم تابع Reverse در پایتون
در این مثال دو لیست به عنوان ورودی دریافت میشوند که لیستهایی از اعداد و حروف هستند و معکوس آنها در خروجی چاپ میشود. کدهای این مثال در ادامه نمایش داده شدهاند:
1# Python3 program to demonstrate the
2# use of reverse method
3
4# a list of numbers
5list1 = [1, 2, 3, 4, 1, 2, 6]
6list1.reverse()
7print(list1)
8
9# a list of characters
10list2 = ['a', 'b', 'c', 'd', 'a', 'a']
11list2.reverse()
12print(list2)
در ادامه خروجی کدهای فوق نمایش داده شده است:
[6, 2, 1, 4, 3, 2, 1] ['a', 'a', 'd', 'c', 'b', 'a']
مثال سوم تابع Reverse در پایتون
در این مثال یکی از خطاهایی که برای تابع Reverse در پایتون میتواند به وجود بیاید، مورد بررسی قرار گرفته است. همانطور که بخشهای قبلی گفته شد، این تابع فقط دادههایی از نوع لیست را دریافت میکند و اگر متد reverse در پایتون روی هر دادهای از نوع غیر از لیست اجرا شود، خطای AttributeError رخ میدهد. در این مثال به جای لیست از رشته به عنوان ورودی استفاده شده است. کدهای مثال در ادامه ارائه شدهاند:
1# Python3 program to demonstrate the
2# error in reverse() method
3
4# error when string is used in place of list
5string = "abgedge"
6string.reverse()
7print(string)
در مثال فوق، روی رشته"abgedge" متد Reverse اجرا شده است و به دلیل اینکه داده در اینجا از نوع رشتهای است، خطا به وجود میآید و نتیجه نهایی ارائه نمیشود.
Traceback (most recent call last): File "/home/b3cf360e62d8812babb5549c3a4d3d30.py", line 5, in string.reverse() AttributeError: 'str' object has no attribute 'reverse'
در ادامه این مطلب به روشهای دیگری پرداخته شده است که با تابع Reverse در پایتون بسیار مشابه هستند و عملکرد یکسانی دارند. در بخش بعدی تابعReversed و نحوه ایجاد لیستهایی دادههای معکوس با استفاده از آن را یاد میگیریم و متوجه خواهیم شد که این تابع چه تفاوتی با تابع Reverse در پایتون دارد.
تابع Reversed در پایتون چیست؟
اگر برنامه نویس قصد ایجاد یک کپی از معکوس لیست را در پایتون داشته باشد، میتواند از تابعreversed() استفاده کند. در این تابع یک لیست به عنوان آرگومان دریافت میشود و تابع Reversed در پایتون، از یک فرایند «تکرارگر» (Iterator) استفاده میکند که عناصر را به صورت معکوس برمیگرداند.
Iterator یکی از قابلیتهای پایتون است که تمامی عناصر را برای انجام عملیات برنامه نویسی بررسی میکند. نوع Iterator در پایتون از نوع اصلی مشتق شده از آن تبعیت میکند و با تغییر نوع اصلی، Iterator مشتق شده از آن هم تغییر میکند. در کدهای زیر روش استفاده از این تابع در پایتون نشان داده شده است:
1>>> digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2
3>>> reversed_digits = reversed(digits)
4>>> reversed_digits
5<list_reverseiterator object at 0x7fca9999e790>
6
7>>> list(reversed_digits)
8[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
در مثال فوق، تابع Reversed از لیستdigits به عنوان آرگومان ورودی خود استفاده میکند و با این آرگومان فراخوانی میشود. سپس نتایج معکوس شده این لیست درreversed_digits ذخیره خواهند شد. این لیست با استفاده ازlist() فراخوانی میشود و اعداد معکوس شده در خروجی نمایش داده میشوند. مسئله مهمی که در هنگام استفاده از تابع Reversed در پایتون باید مورد توجه قرار بگیرد این است که این تابع یک کپی از لیست ورودی ایجاد میکند، بنابرین چون نتیجه حاصل شده از تابع reversed در پایتون از نوع Iterator است، با تغییر لیست اصلی، Iterator هم تغییر میکند. برای اثبات این مسئله در ادامه مثالی ارائه شده است:
1>>> fruits = ["apple", "banana", "orange"]
2
3>>> reversed_fruit = reversed(fruits) # Get the iterator
4>>> fruits[-1] = "kiwi" # Modify the last item
5>>> next(reversed_fruit) # The iterator sees the change
6'kiwi'
در مثال فوق با اجرای تابع reversed روی لیستfruits یک Iterator بدست میآید. سپس، آخرین عنصرfruits اصلاح میشود. مطابق انتظار، این تغییرات روی Iterator تأثیر میگذارند. برای مشخص شدن این موضوع میتوان با استفاده از تابعnext() اولین عنصر ازreversed_fruit را مشاهده کرد.
اگر نیاز باشد که یک کپی از لیستfruits وجود داشته باشد، باید با استفاده از تابع list، نتیجه اعمال تابع reversed روی لیست مربوطه را به جای Iterator به لیست تبدیل کرد تا تغییر دادن لیست اصلی باعث تغییر یافتن نتیجه بدست آمده از تابع reversed نشود. برای درک بهتر نحوه انجام این کار در ادامه مثالی ارائه شده است:
1>>> fruits = ["apple", "banana", "orange"]
2
3>>> list(reversed(fruits))
4['orange', 'banana', 'apple']
همانطور که در بخشهای قبلی مشخص شد، در این مثال فوق، با فراخوانی تابع Reversed در پایتون، چون نتیجه حاصل شده به صورت Iterator است، با استفاده از تابعlist میتوان آن را به نوع لیست تبدیل کرد. به این ترتیب، لیستی جدید به عنوان کپی معکوس از لیست اصلی ایجاد شده است. در بخش بعدی از مطلب «تابع Reverse در پایتون» به روش معکوس کردن دادهها با استفاده از روش «Slicing» میپردازیم.
روش معکوس کردن داده ها با استفاده از Slicing چیست؟
در نسخه ۱٫۴ پایتون، سینتکس Slicing دارای یک آرگومان سومی بود کهstep نامیده میشد و این آرگومان در انواع Slicingهای «داخلی» (Built-In) پایتون از جمله لیستها، تاپلها و رشتهها کار نمیکرد. سپس، نسخه ۲/۳ پایتون این سینتکس را برای انواع دادههای داخلی «بسط دادن» (Extend) داد و پس از آن میتوان ازstep در Slicing استفاده کرد. در ادامه سینتکس کامل Slicing نمایش داده شده است:
1a_list[start:stop:step]
سینتکس فوق، به برنامه نویس امکانی میدهد تا همه عناصر موجود در لیستa_list را ازstart (ابتدا) تاstop − 1 (انتها منهای یک) به وسیلهstep (گامهای مشخص) استخراج کند. همیشه به صورت پیشفرض مقدار گامها عدد یک در نظر گرفته میشود و عملیات Slicing ساده همیشه از چپ به راست انجام خواهد شد. در ادامه مثالی برای توضیحات ارائه شده، نشان داده شده است:
1>>> digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2
3>>> digits[1:5]
4[1, 2, 3, 4]
با استفاده از[1:5] میتوان عناصر را از اندیس اول تا پنج منهای یک دریافت کرد. اندیس عنصر برابر با مقدارstop هیچگاه شامل نتیجه نهایی نمیشود. Slicing فوق همه عناصر بین یک تا پنج منهای یک را برمیگرداند زیرا برای این مثال گامی مشخص نشده است وstep به صورت پیشفرض یک در نظر گرفته میشود. اگر از گامهای متفاوت استفاده شود، Slicing به اندازه مقدار گام در هر مرحله جلو میرود. در ادامه مثالی برای نشان دادن روش عملکرد گامها ارائه شده است:
1>>> digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2
3>>> digits[0::2]
4[0, 2, 4, 6, 8]
5
6>>> digits[::3]
7[0, 3, 6, 9]
در مثال اول کدهای فوق،[0::2] همه عناصر از اندیس صفر تا انتهای لیست را با گامهای دوتایی در هر مرحله خروجی میدهد. در مثال دوم کدهای فوق،[::3] همه عناصر با شروع از اندیس صفر را تا انتهای لیست با گامهای سهتایی نمایش خواهد داد. اگر مقدار شروع و پایان Slicing مشخص نشوند، آنها از صفر تا انتهای لیست ارائه شده در نظر گرفته میشوند. با توجه به توضیحاتی که در این بخش ارائه شد، بدیهی است که اگر مقدار Step یا همان گامها ۱- در نظر گرفته شود، لیست ارائه شده، معکوس خواهد شد. در ادامه مثال مرتبط با این مثال نمایش داده شده است:
1>>> digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2
3>>> # Set step to -1
4>>> digits[len(digits) - 1::-1]
5[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
6
7>>> digits
8[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
این روش Slicing همه عناصر لیست را از سمت راست آن (len(digits) - 1 ) تا انتهای لیست در سمت چپ نمایش میدهد، چون محل توقف مشخص نشده و فقط نقطه شروع تعیین شده است، کار از عنصر آخر لیست شروع میشود و عملیات Slicing تا ابتدای لیست با گام -۱ یعنی به صورت معکوس انجام شده است. ادامه روند عملکرد این مثال، با استفاده از گامهایی با مقدار ۱- انجام میشود.
زمانی که این مثال پیادهسازی شود، یک کپی به صورت معکوس از ورودی، بدون اثر گذاشتن روی ورودی ایجاد شده است. این مثال را میتوان به صورت تمیزتر و سادهتری با استفاده از کدهای زیر نیز نوشت، در این مثال از مقادیر «Offset» پیشفرض ضمنی استفاده شده است. یعنی مثال همان مقادیر پیشفرضی را دریافت میکند که در ابتدای رشته وجود دارند:
1>>> digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2
3>>> # Rely on default offset values
4>>> digits[::-1]
5[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
در این مثال با استفاده از ([::-1] ) از برنامه درخواست شده است که لیست را به طور کامل دریافت کند و با گامهای ۱- از انتهای لیست تا ابتدای لیست مقادیر را به صورت معکوس کپی کند. این روش بسیار تمیز و ساده است، ااما تابع reversed نسبت به Slicing از لحاظ مصرف حافظه عملکرد بهتری دارد.
در حالی که این مثال، بسیار خوانا و صریح است. بنابراین، این موارد، نکتههایی هستند که بر اساس برنامه کلی میتوان در کدهای خود رعایت و روش مورد نظر را انتخاب کرد. روش دیگری به جز تابع Reverse، تابع Reversed و روش Slicing در پایتون که میتوان از آنها برای معکوس کردن دادهها استفاده کرد، تابعslice() است. در ادامه این مطلب، به بررسی و یادگیری تابع Slice در پایتون میپردازیم.
تابع Slice در پایتون چیست؟
در این بخش با استفاده از مثال زیر، روش عملکرد تابع Slice برای معکوس کردن دادهها در پایتون شرح داده میشود. بنابراین ابتدا مثال زیر ارائه شده است:
1>>> digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2
3>>> slice(0, len(digits))
4slice(0, 10, None)
5
6>>> digits[slice(0, len(digits))]
7[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
8
9>>> slice(len(digits) - 1, None, -1)
10slice(9, None, -1)
11
12>>> digits[slice(len(digits) - 1, None, -1)]
13[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
در کدهای مثال فوق، اولین فراخوانی تابع Slice برابر با[0:len(digits)] است. در فراخوانی دوم، این تابع مانند[len(digits) - 1::-1] عمل میکند. همچنین میتوان با تقلید از روش قبلی یعنی استفاده از Slicing با[::-1] به وسیلهslice(None, None, -1)این مسئله را حل کرد. در این مثال، استفاده ازNone در بخشstart وstop به معنی در نظر گرفتن کل دنباله از ابتدا تا انتهای آن است. در مثال زیر به سادهترین و تمیزترین شکل ممکن با استفاده از تابع Slice در پایتون، مقادیر دریافتی از ورودی، به صورتی معکوس در خروجی کپی شدهاند:
1>>> digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2
3>>> digits[slice(None, None, -1)]
4[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
شیslice همه ارقام را از لیستdigits استخراج میکند و سپس آنها از سمت راست به چپ در خروجی چاپ میشوند و در نهایت کپی از ارقام به صورت معکوس در خروجی نمایش داده شده است.
جمعبندی
معکوس کردن یکی از رویکردهایی است که در برخی از موارد در برنامهها، مورد استفاده قرار میگیرد. با استفاده از روشهای مختلفی میتوان یک لیست را معکوس کرد که شامل انواع دادههای متفاوت است. یکی از پرکاربردترین و محبوبترین روشهای معکوس کردن دادهها در زبان برنامه نویسی پایتون استفاده از تابع Reverse در پایتون است. در این مطلب سعی شد تا حد امکان و به صورت جامع این روش همراه با مثال مورد بررسی قرار بگیرد.
روشهای دیگری نیز برای معکوس کردن دادهها در پایتون وجود دارند که از جمله آنها میتوان به استفاده از تابع Reversed، روشهای Slicing و استفاده از تابع Slice در پایتون اشاره کرد. این روشها نیز در این مطلب به صورت خلاصه و همراه با مثال بررسی شدند. همچنین میتوان به صورت دستی و بدون استفاده از روش خاصی نیز این معکوس کردن دادهها را انجام داد. در این مطلب برای درک بهتر روش معکوس کردن دادهها و رویکرد تابع Reverse در پایتون آموزشهایی نیز برای دانشجویان و علاقهمندان ارائه شده است.
توضیحات و مثالها بسیار عالی و کامل هستند. سپاسگزارم.