سطح مقدماتی (Beginner Level)
در پایتون، Slicing (برشدهی) قابلیتی قدرتمند است که به شما اجازه میدهد بخش خاصی از یک دنباله (Sequence) مانند لیست، رشته (String) یا تاپل را استخراج کنید. برخلاف بسیاری از زبانها که نیاز به حلقهها برای جداسازی دادهها دارند، پایتون این کار را با یک سینتکس ساده انجام میدهد.
سینتکس پایه
فرمت کلی برشدهی به صورت [start:stop] است:
- start: ایندکس شروع (شامل خودش میشود).
- stop: ایندکس پایان (شامل خودش نمیشود).
نکته مهم در پایتون این است که ایندکسها از صفر شروع میشوند.
مثال اول: برش ساده لیست
در این مثال یک لیست از اعداد داریم و بخشی از آن را جدا میکنیم.
مثال دوم: ایندکسهای منفی
پایتون از ایندکس منفی پشتیبانی میکند. -1 به معنای آخرین آیتم است. این ویژگی برای برش از انتهای لیست بسیار کاربردی است.
مثال سوم: مقادیر پیشفرض
اگر start را ننویسید، پیشفرض 0 است و اگر stop را ننویسید، پیشفرض انتهای لیست است.
# Example 3: Defaults (Snippet)
data = [1, 2, 3, 4, 5]
# From beginning to index 3
first_part = data[:3] # [1, 2, 3]
# From index 3 to the end
last_part = data[3:] # [4, 5]
# Copy of the whole list
full_copy = data[:] # [1, 2, 3, 4, 5]
سطح پیشرفته (Professional Level)
در سطح حرفهای، Slicing فراتر از جداسازی ساده است. شما میتوانید از گام (Step) استفاده کنید، لیستها را تغییر دهید (Mutable Assignment) و با آبجکتهای slice کار کنید. همچنین درک نحوه مدیریت حافظه در Slicing برای بهینهسازی کد حیاتی است.
1. پارامتر گام (Step) و معکوس کردن
سینتکس کامل به صورت [start:stop:step] است.
- اگر
stepمثبت باشد، حرکت از چپ به راست است. - اگر
stepمنفی باشد، حرکت از راست به چپ است (معکوس).
یکی از رایجترین روشهای معکوس کردن رشته یا لیست در پایتون استفاده از [::-1] است.
2. تغییر محتوا با Slicing (Slice Assignment)
در لیستها (که Mutable هستند)، میتوانید یک برش را با یک لیست دیگر جایگزین کنید. طول لیست جایگزین میتواند متفاوت باشد که باعث تغییر طول لیست اصلی میشود.
3. آبجکت slice() و کاربرد آن
به جای استفاده از براکتها، میتوانید یک آبجکت از نوع slice بسازید. این روش زمانی مفید است که میخواهید الگوی برشدهی را نامگذاری کنید و در چندین جای کد استفاده کنید (افزایش خوانایی).
نکات فنی و مدیریت حافظه
- کپی سطحی (Shallow Copy): وقتی از
list[:]یا هر برش دیگری استفاده میکنید، پایتون یک لیست جدید میسازد. اگر عناصر داخل لیست تغییرپذیر باشند (مثل لیستِ تو در تو)، تغییر در عناصر داخلی روی کپی هم تاثیر میگذارد. - پیادهسازی در کلاسهای اختصاصی: برای اینکه کلاسهای خودتان از Slicing پشتیبانی کنند، باید متد جادویی
__getitem__را پیادهسازی کنید و چک کنید که آرگومان ورودی از نوعsliceاست یاint.
# Technical Example: Custom Class with Slicing Support
class CustomSequence:
def __init__(self, data):
self.data = data
def __getitem__(self, key):
if isinstance(key, slice):
print(f"Slicing requested: start={key.start}, stop={key.stop}, step={key.step}")
return self.data[key]
elif isinstance(key, int):
print(f"Indexing requested: {key}")
return self.data[key]
# Usage (Conceptual)
# obj = CustomSequence([1, 2, 3])
# print(obj[0:2])