تابع لامبدا (Lambda Function) در پایتون

گاهی اوقات فقط به یک تابع خیلی کوچک نیاز داریم؛ تابعی که قرار است تنها یک کار ساده انجام دهد و احتمالاً فقط یک بار از آن استفاده کنیم. در چنین شرایطی نوشتن یک تابع کامل با def ممکن است غیرضروری باشد. پایتون برای این نوع توابع، قابلیتی به نام Lambda Function را در اختیار ما قرار داده است.

تابع لامبدا در واقع یک تابع ناشناس (Anonymous Function) است؛ یعنی تابعی که بدون نام تعریف می‌شود و معمولاً تنها از یک عبارت (Expression) تشکیل شده است. به همین دلیل، کدها کوتاه‌تر، خواناتر و در برخی کاربردها ساده‌تر می‌شوند.

فهرست مطالب

چه زمانی از Lambda استفاده می‌کنیم؟

معمولاً زمانی که:

  • فقط یک عملیات ساده انجام می‌دهیم.
  • تابع را فقط یک یا چند بار استفاده می‌کنیم.
  • نمی‌خواهیم برای یک تابع کوچک، نام جداگانه تعریف کنیم.
  • در توابعی مانند sorted()، map() و filter() به یک تابع کوتاه نیاز داریم.

به این مثال توجه کنید: فرض کنید می‌خواهیم عددی را دو برابر کنیم.

با تابع معمولی:

def double(x):
    return x * 2

print(double(5))

خروجی:

10

حال همین کار را با Lambda انجام می‌دهیم:

double = lambda x: x * 2

print(double(5))

خروجی:

10

مشاهده می‌کنید که همان نتیجه را با کد کوتاه‌تر به دست آوردیم.

ساختار (Syntax) تابع Lambda

ساختار کلی تابع لامبدا به شکل زیر است:

lambda parameters: expression

در این ساختار:

  • lambda کلمه کلیدی برای تعریف تابع است.
  • پارامترها (Parameters) ورودی‌های تابع هستند.
  • : پارامترها را از بدنه تابع جدا می‌کند.
  • عبارت (Expression) عملی است که باید انجام شود و نتیجه آن به‌صورت خودکار برگردانده (Return) می‌شود.

نکته مهم : در توابع لامبدا نیازی به نوشتن دستور return نیست. نتیجه عبارت به‌صورت خودکار بازگردانده می‌شود.

 

شکل کلی

lambda x: x + 10
       │     │
       │     └── عبارتی که اجرا می‌شود
       └──────── پارامتر ورودی

یعنی مقدار x هرچه که باشد 10 واحد به آن اضافه شده و نتیجه بازگردانده می‌شود.

 

مثال ۱: با یک پارامتر

square = lambda x: x ** 2

print(square(4))
 

خروجی:

16
 

 

مثال ۲: با دو پارامتر

add = lambda a, b: a + b

print(add(10, 20))

خروجی:

30
 

مثال ۳: با سه پارامتر

average = lambda a, b, c: (a + b + c) / 3

print(average(10, 20, 30))

خروجی:

20.0
 

مثال ۴: استفاده از شرط

از آنجا که لامبدا فقط یک عبارت (Expression) را می‌پذیرد، برای شرط‌ها باید از عبارت شرطی (Conditional Expression) استفاده کنیم.

maximum = lambda a, b: a if a > b else b

print(maximum(15, 8))

خروجی:

15
چند نکته مهم

لامبدا می‌تواند هیچ پارامتری نداشته باشد:

hello = lambda: "Hello"
print(hello())

خروجی:

Hello

می‌تواند هر تعداد پارامتر داشته باشد:

calc = lambda a, b, c, d: a + b + c + d
print(calc(1, 2, 3, 4))

خروجی:

10

❌ اما نمی‌تواند چندین دستور داشته باشد. مانند کد زیر که معتبر نیست:

lambda x:
    y = x + 1
    return y
زیرا در تابع لامبدا فقط یک عبارت (Expression) مجاز است و نمی‌توان چندین دستور (Statement) مانند انتساب متغیر یا return را در آن نوشت.

استفاده از Lambda در sorted() و sort()

فرض کنید یک لیست از اعداد داریم.

numbers = [8, 2, 6, 1, 5]

print(sorted(numbers))

خروجی:

[1, 2, 5, 6, 8]

در این مثال نیازی به Lambda نیست، چون پایتون خودش می‌داند باید اعداد را بر اساس مقدارشان مرتب کند. اما همیشه موضوع به این سادگی نیست.

پارامتر key

توابع sorted() و sort() یک پارامتر مهم به نام key دارند. این پارامتر مشخص می‌کند که مرتب‌سازی بر چه اساسی انجام شود.

ساختار کلی:

sorted(iterable, key=function)

تابع موجود در key برای هر عضو اجرا می‌شود و مقدار بازگشتی آن، معیار مرتب‌سازی خواهد بود. از آنجا که این تابع معمولاً بسیار کوتاه است، بهترین گزینه استفاده از Lambda است.

 

مثال ۱: مرتب کردن بر اساس قدر مطلق

فرض کنید لیستی از اعداد مثبت و منفی داریم.

numbers = [-8, 3, -1, 6, -5]

result = sorted(numbers, key=lambda x: abs(x))

print(result)

خروجی:

[-1, 3, -5, 6, -8]

در واقع برای هر عضو لیست، تابع زیر اجرا می‌شود:

lambda x: abs(x)

و در نهایت مرتب سازی بر اساس قدر مطلق همه عضوها و بدون در نظر گرفتن علامت آن‌ها انجام می‌شود. 

 

مثال ۲: مرتب کردن رشته‌ها بر اساس طول

words = ["python", "AI", "programming", "code"]

result = sorted(words, key=lambda word: len(word))

print(result)

خروجی:

['AI', 'code', 'python', 'programming']
 

 

مثال ۳: مرتب کردن بر اساس آخرین حرف

words = ["banana", "apple", "orange", "kiwi"]

result = sorted(words, key=lambda word: word[-1])

print(result)

خروجی:

['banana', 'apple', 'orange', 'kiwi']

چون آخرین حروف به ترتیب:

banana → a
apple → e
orange → e
kiwi → i

مرتب کردن لیست دیکشنری‌ها

فرض کنید اطلاعات دانش‌آموزان را داریم.

students = [
    {"name": "Ali", "score": 18},
    {"name": "Sara", "score": 20},
    {"name": "Reza", "score": 15}
]

اگر بخواهیم بر اساس نمره مرتب کنیم:

result = sorted(students, key=lambda student: student["score"])

print(result)

خروجی:

[
 {'name': 'Reza', 'score': 15},
 {'name': 'Ali', 'score': 18},
 {'name': 'Sara', 'score': 20}
]
 

مرتب‌سازی نزولی

برای مرتب سازی نزولی از پارامتر reverse=True به شکل زیر استفاده می‌کنیم.

result = sorted(
    students,
    key=lambda student: student["score"],
    reverse=True
)

print(result)

خروجی:

[
 {'name': 'Sara', 'score': 20},
 {'name': 'Ali', 'score': 18},
 {'name': 'Reza', 'score': 15}
]
 

تفاوت sorted() و sort()

این دو تابع بسیار شبیه هستند، اما یک تفاوت مهم دارند.

sorted()sort()
یک لیست جدید برمی‌گرداند.همان لیست اصلی را تغییر می‌دهد.
روی هر iterable قابل استفاده است.فقط برای لیست‌ها قابل استفاده است.
لیست اولیه بدون تغییر باقی می‌ماند.لیست اولیه مرتب می‌شود.

مثال

numbers = [5, 2, 8, 1]

result = sorted(numbers)

print(result)
print(numbers)

خروجی:

[1, 2, 5, 8]
[5, 2, 8, 1]

اما:

numbers = [5, 2, 8, 1]

numbers.sort()

print(numbers)

خروجی:

[1, 2, 5, 8]
نکته مهم

این تصور اشتباه است که lambda خودش عمل مرتب‌سازی را انجام می‌دهد، lambda فقط مشخص می‌کند معیار مرتب‌سازی چیست. خود عمل مرتب کردن توسط sorted() یا sort() انجام می‌شود. به عنوان مثال، در کد زیر:

sorted(students, key=lambda student: student["score"])
sorted() مسئول مرتب‌سازی لیست است. lambda student: student["score"] فقط به sorted() می‌گوید که برای مقایسه‌ی عناصر، از مقدار score هر دانش‌آموز استفاده کند.

استفاده از Lambda در map()

تابع map() زمانی استفاده می‌شود که بخواهیم یک عملیات یکسان را روی تمام اعضای یک لیست (یا هر Iterable دیگر) انجام دهیم. به جای اینکه با یک حلقه for روی تک‌تک عناصر حرکت کنیم، می‌توانیم از map() استفاده کنیم.

ساختار کلی

map(function, iterable)

پارامترها:

  • function: تابعی که باید روی هر عضو اجرا شود.
  • iterable: مجموعه‌ای از داده‌ها مانند لیست، تاپل یا رشته.

مقدار بازگشتی map()

یکی از نکات مهم این است که map() مستقیماً یک لیست برنمی‌گرداند، بلکه یک شیء از نوع Map Object برمی‌گرداند. برای مشاهده نتیجه معمولاً آن را به لیست تبدیل می‌کنیم.

list(map(...))

مثال ۱: دو برابر کردن اعداد

فرض کنید لیستی از اعداد داریم.

numbers = [1, 2, 3, 4, 5]

result = list(map(lambda x: x * 2, numbers))

print(result)

خروجی:

[2, 4, 6, 8, 10]

در اینجا برای هر عدد، عبارت زیر اجرا می‌شود:

lambda x: x * 2

یعنی:

ورودیخروجی
12
24
36
48
510

مثال ۲: محاسبه مربع اعداد

numbers = [2, 3, 4, 5]

result = list(map(lambda x: x ** 2, numbers))

print(result)

خروجی:

[4, 9, 16, 25]

مثال ۳: تبدیل حروف به بزرگ

names = ["ali", "sara", "reza"]

result = list(map(lambda name: name.upper(), names))

print(result)

خروجی:

['ALI', 'SARA', 'REZA']
 

مثال ۴: محاسبه طول رشته‌ها

words = ["Python", "AI", "Programming"]

result = list(map(lambda word: len(word), words))

print(result)

خروجی:

[6, 2, 11]
 

مثال ۵: تبدیل رشته به عدد

فرض کنید ورودی‌های کاربر به صورت رشته هستند.

numbers = ["10", "20", "30", "40"]

result = list(map(lambda x: int(x), numbers))

print(result)

خروجی:

[10, 20, 30, 40]
 

مقایسه با حلقه for

کد زیر:

numbers = [1, 2, 3, 4]

result = []

for n in numbers:
    result.append(n * 2)

print(result)

معادل این کد است:

numbers = [1, 2, 3, 4]

result = list(map(lambda x: x * 2, numbers))

print(result)

در مثال ساده‌ی بالا، هر دو روش یک خروجی تولید می‌کنند. تفاوت اصلی در این است که map() برای اعمال یک عملیات یکسان روی تمام عناصر به‌صورت خلاصه‌تر نوشته می‌شود.

گاهی لامبدا ضروری نیست

اگر از قبل یک تابع معمولی داشته باشیم، می‌توانیم همان را به map() بدهیم. و نیازی به استفاده از لامبدا نیست.

def square(x):
    return x ** 2

numbers = [1, 2, 3, 4]

result = list(map(square, numbers))

print(result)

خروجی:

[1, 4, 9, 16]
map() خودش تابع را برای هر عضو فراخوانی می‌کند.
نکته آموزشی

با اینکه یادگیری map() و lambda مهم است، در پایتون امروزی بسیاری از برنامه‌نویسان برای عملیات ساده از List Comprehension استفاده می‌کنند، زیرا خوانایی بیشتری دارد.

numbers = [1, 2, 3, 4]

result = [x * 2 for x in numbers]

خروجی:

[1, 4, 9, 16]
این کد دقیقاً همان خروجی map(lambda x: x * 2, numbers) را تولید می‌کند و در بسیاری از پروژه‌های واقعی رایج‌تر است.

استفاده از Lambda در filter()

تابع filter() فقط عناصری را نگه می‌دارد که یک شرط را داشته باشند و بقیه را حذف می‌کند.

ساختار کلی

filter(function, iterable)

پارامترها:

  • function: تابعی که باید برای هر عضو اجرا شود.
  • iterable: مجموعه‌ای از داده‌ها.

این تابع باید برای هر عضو مقدار True یا False برگرداند. اگر نتیجه True باشد، آن عنصر در خروجی باقی می‌ماند. و اگر نتیجه False باشد، آن عنصر حذف می‌شود.

مقدار بازگشتی filter()

مانند map()، تابع filter() نیز یک Filter Object برمی‌گرداند. برای مشاهده نتیجه معمولاً از list() استفاده می‌کنیم.

list(filter(...))

مثال ۱: انتخاب اعداد زوج

numbers = [1, 2, 3, 4, 5, 6, 7, 8]

result = list(filter(lambda x: x % 2 == 0, numbers))

print(result)

خروجی:

[2, 4, 6, 8]

در اینجا عبارت زیر برای هر عدد اجرا می‌شود:

lambda x: x % 2 == 0

اگر عدد زوج باشد:

True

و در خروجی باقی می‌ماند.

روند اجرای برنامه

عددشرط x % 2 == 0نتیجه
1Falseحذف می‌شود
2Trueباقی می‌ماند
3Falseحذف می‌شود
4Trueباقی می‌ماند
5Falseحذف می‌شود
6Trueباقی می‌ماند
7Falseحذف می‌شود
8Trueباقی می‌ماند

مثال ۲: انتخاب اعداد بزرگ‌تر از ۱۰

numbers = [4, 8, 12, 15, 7, 20]

result = list(filter(lambda x: x > 10, numbers))

print(result)

خروجی:

[12, 15, 20]
 

مثال ۳: انتخاب رشته‌های بلندتر از ۵ حرف

words = ["AI", "Python", "Code", "Programming"]

result = list(filter(lambda word: len(word) > 5, words))

print(result)

خروجی:

['Python', 'Programming']
 

مثال ۴: انتخاب نمرات قبولی

scores = [12, 18, 7, 20, 9, 15]

passed = list(filter(lambda score: score >= 10, scores))

print(passed)

خروجی:

[12, 18, 20, 15]
 

مقایسه با حلقه for

کد زیر:

numbers = [1, 2, 3, 4, 5, 6]

result = []

for n in numbers:
    if n % 2 == 0:
        result.append(n)

print(result)

معادل این کد است:

numbers = [1, 2, 3, 4, 5, 6]

result = list(filter(lambda x: x % 2 == 0, numbers))

print(result)

در مثال‌های ساده، هر دو روش نتیجه یکسانی دارند. تفاوت این است که filter() برای انتخاب عناصر بر اساس یک شرط مشخص، کد کوتاه‌تری ارائه می‌دهد.

گاهی لامبدا ضروری نیست

اگر از قبل یک تابع معمولی داشته باشیم، می‌توانیم همان را به filter() بدهیم. و نیازی به استفاده از لامبدا نیست.

def is_even(x):
    return x % 2 == 0

numbers = [1, 2, 3, 4, 5, 6]

result = list(filter(is_even, numbers))

print(result)

خروجی:

[2, 4, 6]
نکته آموزشی

برای شرط‌های ساده، بسیاری از برنامه‌نویسان امروزی از List Comprehension استفاده می‌کنند، زیرا خواناتر است.

numbers = [1, 2, 3, 4, 5, 6]

result = [x for x in numbers if x % 2 == 0]

print(result)
این کد همان خروجی filter() را تولید می‌کند و در پروژه‌های واقعی بسیار رایج است.

📝 تمرین ۱: محاسبه مربع عدد

یک تابع Lambda بنویسید که یک عدد را دریافت کرده و مربع آن را برگرداند. سپس عدد 8 را به این تابع ارسال کرده و نتیجه را چاپ کنید.

📝 تمرین ۲: بزرگ‌ترین عدد

با استفاده از یک تابع Lambda، دو عدد را دریافت کنید و عدد بزرگ‌تر را برگردانید. تابع را برای اعداد 15 و 23 اجرا کنید.

📝 تمرین ۳: استفاده از map()

لیست زیر را در نظر بگیرید:

[5, 10, 15, 20]

با استفاده از map() و یک تابع Lambda، تمام اعداد را در عدد 3 ضرب کرده و نتیجه را در یک لیست جدید ذخیره و چاپ کنید.

📝 تمرین ۴: استفاده از filter()

لیست زیر را در نظر بگیرید:

[12, 7, 25, 4, 18, 9]

با استفاده از filter() و Lambda، فقط اعداد بزرگ‌تر از 10 را انتخاب کرده و در قالب یک لیست چاپ کنید.

📝 تمرین ۵: مرتب‌سازی دانش‌آموزان

لیست زیر را در نظر بگیرید:

students = [
    {"name": "Ali", "score": 17},
    {"name": "Sara", "score": 20},
    {"name": "Reza", "score": 15}
]

با استفاده از تابع sorted() و یک تابع Lambda، دانش‌آموزان را بر اساس مقدار score از بیشترین به کمترین مرتب کرده و نتیجه را چاپ کنید.

✏️ تمرین ۱: محاسبه قیمت با تخفیف

لیستی از قیمت کالاها را در نظر بگیرید:

prices = [120000, 85000, 200000, 95000]

با استفاده از map() و یک تابع Lambda، قیمت هر کالا را با ۱۰ درصد تخفیف محاسبه کرده و نتیجه را در یک لیست جدید ذخیره و چاپ کنید.

✏️ تمرین ۲: انتخاب دانش‌آموزان قبول‌شده

لیست نمرات زیر را در نظر بگیرید:

scores = [8, 15, 19, 7, 12, 9, 20]

با استفاده از filter() و یک تابع Lambda، فقط نمرات قبولی (بزرگ‌تر یا مساوی ۱۰) را انتخاب کرده و چاپ کنید.

✏️ تمرین ۳: مرتب‌سازی محصولات

لیست محصولات زیر را در نظر بگیرید:

products = [
    {"name": "Mouse", "price": 450},
    {"name": "Keyboard", "price": 900},
    {"name": "Monitor", "price": 3200},
    {"name": "Flash", "price": 700}
]

با استفاده از sorted() و Lambda، محصولات را بر اساس قیمت از ارزان‌ترین به گران‌ترین مرتب کرده و نتیجه را چاپ کنید.

✏️ تمرین ۴: تبدیل دما

لیست دماهای زیر بر حسب سانتی‌گراد داده شده است:

temps = [18, 22, 30, 15, 27]

با استفاده از map() و یک تابع Lambda، دماها را به فارنهایت تبدیل کرده و نتیجه را چاپ کنید.

فرمول تبدیل:

F = (C × 9/5) + 32

✏️ تمرین ۵: انتخاب نام‌های کوتاه

لیست نام‌های زیر را در نظر بگیرید:

names = ["Ali", "Mohammad", "Sara", "Parisa", "Reza"]

با استفاده از filter() و Lambda، فقط نام‌هایی را انتخاب کنید که کمتر از ۵ حرف دارند.

✏️ تمرین ۶: مرتب‌سازی نام‌ها

لیست زیر را در نظر بگیرید:

names = ["Mohammad", "Ali", "Parisa", "Reza", "Sara"]

با استفاده از sorted() و یک تابع Lambda، نام‌ها را بر اساس تعداد حروف از کوتاه‌ترین به بلندترین مرتب کنید.

کلاس و شی گرایی در پایتون

تا اینجا یاد گرفتید چگونه با استفاده از توابع، برنامه‌های منظم‌تر و قابل استفاده مجدد بنویسید. در ادامه با یکی از مهم‌ترین مفاهیم برنامه‌نویسی، یعنی کلاس‌ها و برنامه‌نویسی شیءگرا (Object-Oriented Programming یا OOP) آشنا می‌شوید. در این بخش یاد می‌گیرید چگونه اشیاء، ویژگی‌ها و رفتارهای آن‌ها را مدل‌سازی کنید و برنامه‌هایی ساخت‌یافته، قابل توسعه و حرفه‌ای بنویسید.

گام بعدی : کلاس و شی گرایی در پایتون

برای شرکت در آزمون آماده‌اید؟

با ورود به پنل کاربری می‌توانید جهت ثبت نام در آزمون‌ها و دسترسی به منابع آموزشی اقدام نمایید. کارشناسان ما در اسرع وقت با شما تماس می‌گیرند.

شروع کار با Django

شروع کار با Django در دوره آموزش جامع پایتون با مفاهیمی مانند متغیرها، شرط‌ها، حلقه‌ها، توابع، کلاس‌ها، فایل‌ها و کار

ادامه مطلب »

عملیات CRUD در SQLite

عملیات CRUD درSQLite در بخش قبل با مفهوم پایگاه داده، SQLite و نحوه اتصال پایتون به پایگاه داده آشنا شدیم.

ادامه مطلب »

توابع در پایتون

توابع در پایتون اگر هنگام برنامه‌نویسی مجبور شوید یک قطعه کد را بارها تکرار کنید، برنامه شما طولانی، شلوغ و

ادامه مطلب »

مجموعه در پایتون

مجموعه (Set) در پایتون به زبان ساده، Set مجموعه‌ای از عناصر منحصربه‌فرد (Unique) است که ترتیب مشخصی ندارد و اجازه

ادامه مطلب »

تاپل در پایتون

تاپل (Tuple) در پایتون بعد از آشنایی با لیست (List)، نوبت به یکی دیگر از ساختارهای داده در پایتون یعنی

ادامه مطلب »

لیست در پایتون

لیست (List) در پایتون پرکاربردترین ساختار داده​ تا اینجا یاد گرفتید که هر متغیر فقط یک مقدار را در خود

ادامه مطلب »

آموزش نصب پایتون

آموزش نصب پایتون و ابزارهای موردنیاز (راهنمای کامل برای ویندوز) اگر تصمیم گرفته‌اید برنامه‌نویسی را یاد بگیرید، احتمالاً نام زبان

ادامه مطلب »