عملگر سوشی در پایتون

عملگر سوشی در پایتون

با استفاده از عملگر سوشی در پایتون می‌توان ترفندهای جالبی برای برش لیست‌های پایتونی انجام داد. اما چگونه؟

در زبان برنامه نویسی پایتون می‌توان یک لیست را تکه تکه نمود. به این عمل در پایتون slicing گفته می‌شود. با استفاده از این روش می‌توان تنها به بخشی از یک لیست دسترسی پیدا کرد. برای مثال می‌توان یک لیست بزرگ را با این روش به چندین لیست کوچکتر تقسیم کرد و هر کدام از آن‌ها را بسته به نیاز مورد استفاده قرار داد.

برای برش یک لیست در پایتون از علامت [] (براکت) استفاده می‌شود که قاعده‌ی کلی آن به صورت [start:stop:step] است.

>>> lst = [1, 2, 3, 4, 5]
>>> lst
Output: [1, 2, 3, 4, 5] 
#   lst[start:end:step]
>>> lst[1:3:1]
Output: [2, 3]

در مثال بالا با نوشتن دستور [۱:۳:۱] قصد داریم به اندیس یکم تا اندیس دوم با گام ۱ دسترسی داشته باشیم. توجه داشته باشید که عدد ۳ که در بالا استفاده شده است، شامل اندیس سوم نمی‌شود و به یک عنصر قبل از آن اشاره می‌کند.

در صورتی که گام را در قاعده‌ی بالا لحاظ نکنید، پایتون به صورت پیش فرض آن را برابر با ۱ قرار می‌دهد.

>>> lst[1:3]
Output: [2, 3]

می‌توان تنها با استفاده از گام نیز به بخشی از لیست دسترسی داشت. به این ترفند stride (به معنی گام‌های بلند برداشتن) نیز گفته می‌شود. برای مثال با استفاده از دستور زیر یکی در میان به عناصر لیست دسترسی پیدا می‌کنیم.

>>> lst[::2]
Output: [1, 3, 5]

به عملگر : که در مثال بالا استفاده شده است، عملگر سوشی در پایتون گفته می‌شود.

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

>>> numbers[::-1]
Output: [5, 4, 3, 2, 1]

در مثال بالا با استفاده از علامت :: قصد داریم به کل محتویات لیست دسترسی داشته باشیم و در ادامه گام را برابر با ۱- قرار دادیم تا ترتیب نمایش عناصر از آخر به اول شود. این یک ترفند جالب برای برعکس کردن ترتیب عناصر در لیست است. اما پیشنهاد می‌شود تا به منظور برعکس کردن ترتیب عناصر در یک لیست، از list.reverse یا تابع reversed استفاده کنیم.

یکی دیگر از ترفندها، حذف تمام مقادیر موجود در لیست است، بدون آنکه متغیری که به عنوان لیست تعریف شده است حذف شود. ممکن است در برنامه‌ای بخواهید تمام محتویات یک لیست را حذف کرده و در ادامه با محتویاتی جدید با آن کار کنید. با استفاده از عملگر سوشی در پایتون می‌توانید این کار را به راحتی انجام دهید.

>>> lst = [1, 2, 3, 4, 5]
>>> del lst[:]
>>> lst
Output: []

شما همچنین می‌توانید با استفاده از متد lst.clear نیز این کار را انجام دهید. البته توجه داشته باشید که این متد تنها در پایتون ۳ قابل استفاده است.

>>> original_lst = lst
>>> lst[:] = [7, 8, 9]
>>> lst
Output: [7, 8, 9]
>>> original_lst
Output: [7, 8, 9]
>>> original_lst is lst
Output: True

در قطعه کد بالا، مقادیر جدیدی در lst با مقادیر قبلی جایگزین شد، اما شی lst حذف نشد. به همین دلیل شی original_lst با شی lst برابر است.

یکی دیگر از کاربردهای عملگر سوشی در پایتون این است که با استفاده از آن می‌توان یک کپی از تمام محتویات یک لیست ایجاد نمود. به این عمل در پایتون shallow copy گفته می‌شود. به مثال زیر توجه کنید.

>>> copied_lst = lst[:]
>>> copied_lst
Output: [7, 8, 9]
>>> copied_lst is lst
Output: False

در واقع هنگامی که ما از shallow copy استفاده می‌کنیم، تنها ساختار عناصر موجود (نه خودِ عناصر) در لیست کپی شده و در شی جدیدی قرار می‌گیرد؛ در این حالت هر دو کپی دارای نمونه‌های مشترکی از عناصر هستند. در قطعه کد بالا، تنها محتویات موجود در لیست را در یک شی جدید جدید کپی نمودیم. به همین دلیل است که ماهیت دو متغیر lst و copied_lst با یکدیگر برابر نیستند.

در صورتی که قصد دارید تا دقیقا خودِ عناصر موجود در یک شی را کپی نمایید، باید از ماژول copy در پایتون استفاده کنید. به این عمل اصطلاحا deep copy گفته می‌شود. تابع deepcopy موجود در این ماژول به شما این قابلیت را می‌دهد تا یک کپی کامل از تمام ویژگی‌های موجود در یک شیء ایجاد کنید.

نکات کلیدی عملگر سوشی در پایتون

  • به طور کلی از عملگر سوشی (:) علاوه بر انتخاب زیر مجموعه‌ای از یک لیست، می‌توان به عنوان پاک سازی، برعکس نمودن ترتیب عناصر و کپی نمودن محتویات یک لیست نیز استفاده نمود.
  • توجه داشته باشید که استفاده بیش از حد از این ترفند ممکن است خوانایی کد شما را دچار مشکل کرده و نگهداری برنامه‌ی نوشته شده را برای سایر برنامه نویسان دشوار کند.
محمد بابازاده
متخصص DevOps و توسعه دهنده Python