سطح مقدماتی (Beginner Level)
در پایتون، Comprehension (خلاصهنویسی) روشی مختصر و ظریف برای ایجاد ساختارهای داده جدید (مانند لیست، دیکشنری یا مجموعه) بر اساس ساختارهای موجود است. این ویژگی یکی از محبوبترین قابلیتهای پایتون است که کدهای چندخطی را به یک خط تبدیل میکند.
۱. List Comprehension چیست؟
به جای اینکه یک لیست خالی بسازید و با حلقه for آن را پر کنید، میتوانید از این ساختار استفاده کنید.
سینتکس کلی:
[expression for item in iterable]
مثال اول: تبدیل حلقه عادی به Comprehension
در اینجا میخواهیم اعداد ۰ تا ۴ را در یک لیست ذخیره کنیم.
مثال دوم: انجام عملیات روی دادهها
میتوانیم روی هر عضو عملیات ریاضی یا متنی انجام دهیم.
۲. اضافه کردن شرط (Condition)
شما میتوانید با اضافه کردن if در انتهای دستور، دادهها را فیلتر کنید.
سینتکس:
[expression for item in iterable if condition]
مثال اول: فیلتر کردن اعداد زوج
مثال دوم: فیلتر کردن رشتهها
۳. Dictionary و Set Comprehension
همان منطق برای دیکشنریها (با آکولاد و کلید:مقدار) و مجموعهها (با آکولاد و مقدار یکتا) نیز صدق میکند.
مثال اول: Dictionary Comprehension
مثال دوم: Set Comprehension
مجموعهها (Sets) تکراریها را حذف میکنند.
سطح پیشرفته (Professional Level)
در این بخش به استفاده از Comprehensionهای تو در تو (Nested)، مدیریت حافظه، و تفاوتهای ظریف بین شرطها (if/else در خروجی) میپردازیم.
۱. شرطهای if...else در خروجی
اگر بخواهید بر اساس شرط، مقدار خروجی (Expression) را تغییر دهید (نه اینکه داده را فیلتر کنید)، باید ساختار را تغییر دهید.
سینتکس:
[value_if_true if condition else value_if_false for item in iterable]
مثال اول: جایگزینی مقادیر
مثال دوم: تمیزکاری دادهها
۲. Comprehensionهای تو در تو (Nested)
این حالت معادل حلقههای for تو در تو است و برای کار با ماتریسها بسیار کاربرد دارد.
مثال اول: تخت کردن (Flattening) یک ماتریس
مثال دوم: ترانهاده ماتریس (Transpose)
۳. نکات پرفورمنس و خوانایی (Best Practices)
قانون مهم: اگر Comprehension شما بیش از حد طولانی یا پیچیده شد، بهتر است از حلقه for معمولی استفاده کنید. خوانایی کد (Readability) در پایتون اولویت دارد.
مقایسه Generator Expression
اگر با دادههای بسیار حجیم کار میکنید، استفاده از براکت [] باعث میشود تمام لیست در حافظه ساخته شود. در این موارد از پرانتز () استفاده کنید تا یک Generator بسازید که دادهها را یکییکی تولید کند (Lazy Evaluation).
# Static comparison
import sys
# List Comprehension (تمام داده در حافظه)
my_list = [i for i in range(10000)]
print(sys.getsizeof(my_list)) # حجم زیاد
# Generator Expression (تولید لحظهای)
my_gen = (i for i in range(10000))
print(sys.getsizeof(my_gen)) # حجم بسیار کم
مثال عملی: استفاده از Generator در توابع
توابعی مثل sum, max, min میتوانند مستقیماً جنریتور را بپذیرند.