🔹 توابع لامبدا (Lambda Functions) در پایتون
توابع لامبدا توابع ناشناس (Anonymous) و یکخطی هستند که با کلمه کلیدی lambda تعریف میشوند.
این توابع برای عملیات ساده و کوتاه مناسب هستند و معمولاً به عنوان آرگومان به توابع دیگر (مانند map، filter و sorted) ارسال میشوند.
🔹 تعریف تابع لامبدا
# تابع معمولی
def add(a, b):
return a + b
# تابع لامبدا معادل
add_lambda = lambda a, b: a + b
print(add(3, 5)) # 8
print(add_lambda(3, 5)) # 8
⏳ برای اجرا دکمه را بزنید...
🔹 لامبدا با یک پارامتر
# مربع یک عدد
square = lambda x: x ** 2
print(square(5)) # 25
# نمایش پیام
greet = lambda name: f"Hello, {name}!"
print(greet("Saba")) # Hello, Saba!
⏳ برای اجرا دکمه را بزنید...
🔹 لامبدا با چند پارامتر
# جمع دو عدد
sum_lambda = lambda a, b: a + b
print(sum_lambda(10, 20)) # 30
# بزرگترین عدد
max_lambda = lambda x, y: x if x > y else y
print(max_lambda(15, 30)) # 30
⏳ برای اجرا دکمه را بزنید...
🔹 لامبدا بدون پارامتر
# لامبدا بدون پارامتر
greeting = lambda: "Hello, World!"
print(greeting()) # Hello, World!
# لامبدا بدون پارامتر با محاسبه
pi = lambda: 3.14159
print(f"Pi: {pi()}")
⏳ برای اجرا دکمه را بزنید...
🔹 استفاده از لامبدا با map
map یک تابع را روی همه عناصر یک دنباله اعمال میکند.
# مربع اعداد
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
print(squared)
# تبدیل به حروف بزرگ
words = ["hello", "world", "python"]
uppercase = list(map(lambda w: w.upper(), words))
print(uppercase)
⏳ برای اجرا دکمه را بزنید...
🔹 استفاده از لامبدا با filter
filter عناصری را که شرط را برآورده میکنند، انتخاب میکند.
# اعداد زوج
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)
# کلمات با طول بیشتر از ۳
words = ["cat", "dog", "elephant", "ant", "tiger"]
long_words = list(filter(lambda w: len(w) > 3, words))
print(long_words)
⏳ برای اجرا دکمه را بزنید...
🔹 استفاده از لامبدا با sorted
با key میتوانید ترتیب مرتبسازی را مشخص کنید.
# مرتبسازی بر اساس طول رشته
words = ["apple", "banana", "cherry", "date"]
sorted_words = sorted(words, key=lambda w: len(w))
print(sorted_words)
# مرتبسازی دیکشنری بر اساس مقدار
people = [
{"name": "Saba", "age": 28},
{"name": "Ali", "age": 24},
{"name": "Reza", "age": 30}
]
sorted_people = sorted(people, key=lambda p: p["age"])
print(sorted_people)
# مرتبسازی نزولی
sorted_desc = sorted(people, key=lambda p: p["age"], reverse=True)
print(sorted_desc)
⏳ برای اجرا دکمه را بزنید...
🔹 استفاده از لامبدا با reduce
reduce یک تابع را به صورت تجمعی روی عناصر اعمال میکند.
from functools import reduce
# محاسبه حاصلضرب اعداد
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product) # 120
# محاسبه مجموع اعداد
sum_all = reduce(lambda x, y: x + y, numbers)
print(sum_all) # 15
⏳ برای اجرا دکمه را بزنید...
🔹 ترکیب map و filter با لامبدا
# مربع اعداد زوج
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
result = list(map(lambda x: x ** 2, filter(lambda x: x % 2 == 0, numbers)))
print(result)
# تبدیل به حروف بزرگ کلمات با طول بیشتر از ۳
words = ["cat", "dog", "elephant", "ant", "tiger"]
result = list(map(lambda w: w.upper(), filter(lambda w: len(w) > 3, words)))
print(result)
⏳ برای اجرا دکمه را بزنید...
🔹 مقایسه لامبدا و کامپرهنشن
# با map و لامبدا
numbers = [1, 2, 3, 4, 5]
squared_map = list(map(lambda x: x ** 2, numbers))
# با کامپرهنشن
squared_comp = [x ** 2 for x in numbers]
print(f"Map: {squared_map}")
print(f"Comprehension: {squared_comp}")
# با filter و لامبدا
evens_map = list(filter(lambda x: x % 2 == 0, numbers))
# با کامپرهنشن
evens_comp = [x for x in numbers if x % 2 == 0]
print(f"Filter: {evens_map}")
print(f"Comprehension: {evens_comp}")
⏳ برای اجرا دکمه را بزنید...
🔹 محدودیتهای توابع لامبدا
- ❌ نمیتوانند شامل چندین دستور باشند.
- ❌ نمیتوانند از
returnاستفاده کنند (به صورت خودکار مقدار را برمیگردانند). - ❌ نمیتوانند شامل حلقه یا شرط پیچیده باشند.
- ❌ برای عملیات پیچیده، از توابع معمولی استفاده کنید.
🔹 مثال جامع: مدیریت داده با لامبدا
from functools import reduce
# لیست محصولات
products = [
{"name": "Laptop", "price": 1200, "stock": 10},
{"name": "Phone", "price": 800, "stock": 25},
{"name": "Tablet", "price": 500, "stock": 15},
{"name": "Monitor", "price": 300, "stock": 8},
{"name": "Keyboard", "price": 100, "stock": 30}
]
# ۱. پیدا کردن محصولات با قیمت بالای ۵۰۰
expensive = list(filter(lambda p: p["price"] > 500, products))
print("Expensive products:")
for p in expensive:
print(f" {p['name']} (${p['price']})")
# ۲. محاسبه ارزش کل موجودی هر محصول
product_value = list(map(
lambda p: {"name": p["name"], "value": p["price"] * p["stock"]},
products
))
print("\nProduct values:")
for p in product_value:
print(f" {p['name']}: ${p['value']}")
# ۳. مرتبسازی محصولات بر اساس قیمت
sorted_products = sorted(products, key=lambda p: p["price"], reverse=True)
print("\nProducts sorted by price (descending):")
for p in sorted_products:
print(f" {p['name']} (${p['price']})")
# ۴. محاسبه مجموع قیمت همه محصولات
total_value = reduce(lambda acc, p: acc + p["price"] * p["stock"], products, 0)
print(f"\nTotal inventory value: ${total_value}")
# ۵. نام محصولات با موجودی بیش از ۱۰
names = list(map(
lambda p: p["name"],
filter(lambda p: p["stock"] > 10, products)
))
print(f"Products with stock > 10: {names}")
⏳ برای اجرا دکمه را بزنید...
📌 نکات کلیدی
- ✅ توابع لامبدا توابع ناشناس و یکخطی هستند.
- ✅ با کلمه کلیدی
lambdaتعریف میشوند. - ✅ فرمت:
lambda پارامترها: عبارت - ✅ معمولاً با
map،filterوsortedاستفاده میشوند. - ✅ نمیتوانند شامل چندین دستور یا حلقه باشند.
- ✅ به صورت خودکار مقدار عبارت را برمیگردانند.
- ✅ برای عملیات پیچیده از توابع معمولی استفاده کنید.
- ✅ لامبداها کد را خلاصهتر و خوانا میکنند.