خانه / آموزش‌ها / آموزش کامل Comprehensionها در پایتون (List, Dict, Set)

آموزش کامل Comprehensionها در پایتون (List, Dict, Set)

🐍 HomeOfPython
|
📅 1404/10/20

سطح مقدماتی (Beginner Level)

در پایتون، Comprehension (خلاصه‌نویسی) روشی مختصر و ظریف برای ایجاد ساختارهای داده جدید (مانند لیست، دیکشنری یا مجموعه) بر اساس ساختارهای موجود است. این ویژگی یکی از محبوب‌ترین قابلیت‌های پایتون است که کدهای چندخطی را به یک خط تبدیل می‌کند.

۱. List Comprehension چیست؟

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

سینتکس کلی: [expression for item in iterable]

مثال اول: تبدیل حلقه عادی به Comprehension

در اینجا می‌خواهیم اعداد ۰ تا ۴ را در یک لیست ذخیره کنیم.

Python

مثال دوم: انجام عملیات روی داده‌ها

می‌توانیم روی هر عضو عملیات ریاضی یا متنی انجام دهیم.

Python

۲. اضافه کردن شرط (Condition)

شما می‌توانید با اضافه کردن if در انتهای دستور، داده‌ها را فیلتر کنید.

سینتکس: [expression for item in iterable if condition]

مثال اول: فیلتر کردن اعداد زوج

Python

مثال دوم: فیلتر کردن رشته‌ها

Python

۳. Dictionary و Set Comprehension

همان منطق برای دیکشنری‌ها (با آکولاد و کلید:مقدار) و مجموعه‌ها (با آکولاد و مقدار یکتا) نیز صدق می‌کند.

مثال اول: Dictionary Comprehension

Python

مثال دوم: Set Comprehension

مجموعه‌ها (Sets) تکراری‌ها را حذف می‌کنند.

Python

سطح پیشرفته (Professional Level)

در این بخش به استفاده از Comprehensionهای تو در تو (Nested)، مدیریت حافظه، و تفاوت‌های ظریف بین شرط‌ها (if/else در خروجی) می‌پردازیم.

۱. شرط‌های if...else در خروجی

اگر بخواهید بر اساس شرط، مقدار خروجی (Expression) را تغییر دهید (نه اینکه داده را فیلتر کنید)، باید ساختار را تغییر دهید.

سینتکس: [value_if_true if condition else value_if_false for item in iterable]

مثال اول: جایگزینی مقادیر

Python

مثال دوم: تمیزکاری داده‌ها

Python

۲. Comprehensionهای تو در تو (Nested)

این حالت معادل حلقه‌های for تو در تو است و برای کار با ماتریس‌ها بسیار کاربرد دارد.

مثال اول: تخت کردن (Flattening) یک ماتریس

Python

مثال دوم: ترانهاده ماتریس (Transpose)

Python

۳. نکات پرفورمنس و خوانایی (Best Practices)

قانون مهم: اگر Comprehension شما بیش از حد طولانی یا پیچیده شد، بهتر است از حلقه for معمولی استفاده کنید. خوانایی کد (Readability) در پایتون اولویت دارد.

مقایسه Generator Expression

اگر با داده‌های بسیار حجیم کار می‌کنید، استفاده از براکت [] باعث می‌شود تمام لیست در حافظه ساخته شود. در این موارد از پرانتز () استفاده کنید تا یک Generator بسازید که داده‌ها را یکی‌یکی تولید کند (Lazy Evaluation).

python
# 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 می‌توانند مستقیماً جنریتور را بپذیرند.

Python