🧮 کامپرهنشنها (Comprehensions) در پایتون
کامپرهنشنها یک روش خلاصه و خوانا برای ایجاد ساختارهای داده مانند لیستها، دیکشنریها و مجموعهها هستند. این روش به شما اجازه میدهد با یک خط کد، حلقههای پیچیده را به شکل سادهتری بنویسید.
🔹 لیست کامپرهنشن (List Comprehension)
# روش معمول
squares = []
for i in range(5):
squares.append(i ** 2)
print(squares)
# روش کامپرهنشن
squares_comp = [i ** 2 for i in range(5)]
print(squares_comp)
⏳ برای اجرا دکمه را بزنید...
🔹 لیست کامپرهنشن با شرط
# اعداد زوج ۰ تا ۲۰
evens = [i for i in range(21) if i % 2 == 0]
print(evens)
# اعداد فرد از ۰ تا ۲۰
odds = [i for i in range(21) if i % 2 != 0]
print(odds)
⏳ برای اجرا دکمه را بزنید...
🔹 کامپرهنشن با شرط و else
# جایگزینی اعداد با 'even' یا 'odd'
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
result = ["even" if n % 2 == 0 else "odd" for n in numbers]
print(result)
⏳ برای اجرا دکمه را بزنید...
🔹 کامپرهنشن تو در تو (Nested)
# ترکیب دو لیست
colors = ["red", "green", "blue"]
sizes = ["S", "M", "L"]
combinations = [(color, size) for color in colors for size in sizes]
print(combinations)
# ماتریس ۳x۳ با کامپرهنشن
matrix = [[j for j in range(3)] for i in range(3)]
print(matrix)
⏳ برای اجرا دکمه را بزنید...
🔹 دیکشنری کامپرهنشن (Dictionary Comprehension)
# مربع اعداد
squares = {x: x**2 for x in range(5)}
print(squares)
# فیلتر کردن
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares)
# تبدیل لیست به دیکشنری
names = ["Saba", "Ali", "Reza"]
name_length = {name: len(name) for name in names}
print(name_length)
⏳ برای اجرا دکمه را بزنید...
🔹 مجموعه کامپرهنشن (Set Comprehension)
# مربع اعداد
squares = {x**2 for x in range(5)}
print(squares)
# فیلتر کردن
even_squares = {x**2 for x in range(10) if x % 2 == 0}
print(even_squares)
# طول رشتهها
names = ["apple", "banana", "cherry", "date"]
lengths = {len(name) for name in names}
print(lengths)
⏳ برای اجرا دکمه را بزنید...
🔹 کامپرهنشن با توابع
# استفاده از تابع در کامپرهنشن
def square(n):
return n ** 2
numbers = [1, 2, 3, 4, 5]
squared = [square(n) for n in numbers]
print(squared)
# استفاده از تابع داخلی
names = ["saba", "ali", "reza"]
capitalized = [name.capitalize() for name in names]
print(capitalized)
⏳ برای اجرا دکمه را بزنید...
🔹 کامپرهنشن با enumerate
# ایجاد لیست از اندیسها و مقادیر
fruits = ["apple", "banana", "cherry"]
indexed = [(index, fruit) for index, fruit in enumerate(fruits)]
print(indexed)
# فقط اندیسهای زوج
even_indexed = [(i, fruit) for i, fruit in enumerate(fruits) if i % 2 == 0]
print(even_indexed)
⏳ برای اجرا دکمه را بزنید...
🔹 کامپرهنشن با zip
names = ["Saba", "Ali", "Reza"]
ages = [25, 30, 22]
cities = ["Tehran", "Shiraz", "Isfahan"]
# ترکیب سه لیست
people = [(name, age, city) for name, age, city in zip(names, ages, cities)]
print(people)
# دیکشنری از دو لیست
name_age = {name: age for name, age in zip(names, ages)}
print(name_age)
⏳ برای اجرا دکمه را بزنید...
🔹 کامپرهنشن پیشرفته
# حذف تکراریها با کامپرهنشن
numbers = [1, 2, 2, 3, 4, 4, 4, 5]
unique = []
[unique.append(n) for n in numbers if n not in unique]
print(unique)
# تبدیل رشته به لیست کاراکترها
text = "Python"
chars = [char for char in text]
print(chars)
# کامپرهنشن با شرط و else
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
result = ["even" if n % 2 == 0 else "odd" for n in numbers]
print(result)
⏳ برای اجرا دکمه را بزنید...
🔹 مقایسه کامپرهنشن با حلقه معمولی
import time
# ایجاد یک لیست با حلقه معمولی
start = time.time()
squares_loop = []
for i in range(1000000):
squares_loop.append(i ** 2)
loop_time = time.time() - start
# ایجاد یک لیست با کامپرهنشن
start = time.time()
squares_comp = [i ** 2 for i in range(1000000)]
comp_time = time.time() - start
print(f"Loop time: {loop_time:.4f} seconds")
print(f"Comprehension time: {comp_time:.4f} seconds")
print(f"Comprehension is {loop_time / comp_time:.2f}x faster!")
⏳ برای اجرا دکمه را بزنید...
🔹 مثال جامع: تحلیل داده با کامپرهنشن
# داده نمونه: لیست دانشجویان با نمرات
students = [
{"name": "Saba", "grades": [18, 19, 17, 20]},
{"name": "Ali", "grades": [15, 16, 14, 13]},
{"name": "Reza", "grades": [20, 19, 18, 17]},
{"name": "Mina", "grades": [12, 14, 13, 15]}
]
# میانگین نمرات هر دانشجو
averages = [
{"name": s["name"], "average": sum(s["grades"]) / len(s["grades"])}
for s in students
]
print("Averages:")
for student in averages:
print(f"{student['name']}: {student['average']:.2f}")
# دانشجویانی که میانگین بالای ۱۷ دارند
top_students = [
s["name"] for s in averages if s["average"] >= 17
]
print(f"\nTop students: {top_students}")
# لیست نمرات همه دانشجویان
all_grades = [grade for s in students for grade in s["grades"]]
print(f"\nAll grades: {all_grades}")
# میانگین کل نمرات
total_average = sum(all_grades) / len(all_grades)
print(f"Total average: {total_average:.2f}")
# دیکشنری از نام و میانگین
name_avg = {s["name"]: sum(s["grades"]) / len(s["grades"]) for s in students}
print(f"\nName-Average dictionary: {name_avg}")
⏳ برای اجرا دکمه را بزنید...
📌 نکات کلیدی
- ✅ کامپرهنشنها روشی خلاصه و خوانا برای ایجاد ساختارهای داده هستند.
- ✅ انواع اصلی: لیست کامپرهنشن، دیکشنری کامپرهنشن و مجموعه کامپرهنشن.
- ✅ فرمت:
[expression for item in iterable if condition] - ✅ میتوان از شرط (با
if) و حلقههای تو در تو استفاده کرد. - ✅ کامپرهنشنها معمولاً سریعتر از حلقههای معمولی هستند.
- ✅ برای خوانایی کد، کامپرهنشنهای ساده و کوتاه مناسب هستند.
- ✅ کامپرهنشنهای پیچیده را به چند خط تقسیم کنید یا از حلقه استفاده کنید.
- ✅ با
enumerateوzipمیتوانید کامپرهنشنهای قدرتمندتر بنویسید.