کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

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

در این دوره آموزش پایتون، به مطالعه توابع anonymous (بی نام) یا به عبارتی توابع لامبدا در پایتون می‌پردازیم. یک تابع لامبدا می‌تواند تعداد n متغیر از ورودی‌ها را دریافت کند، اما همواره فقط یک مقدار به عنوان خروجی برگرداند. در این آموزش، ما مفهوم توابع لامبدا در پایتون و سپس چگونگی اجرای و نحوه نوشتار آن‌ها را بررسی خواهیم کرد.

مفهوم توابع لامبدا در پایتون

توابع لامبدا در پایتون، توابعی بی‌نام هستند به این معنا که که نامی ندارند. همانطور که از قبل می‌دانیم ما در پایتون برای ایجاد توابع معمولی، از کلمه کلیدی "def" استفاده می‌کنیم. اما از این پس میتوانیم از کلمه کلیدی "lambda" در پایتون استفاده کنیم تا یک تابع بدون نام تعریف کنیم.

نحوه نوشتن توابع لامبدا در پایتون

نحوه نوشتن تابع لامبدا در پایتون به صورت زیر است:

lambda arguments: expression       

این تابع تعداد دلخواهی ورودی را می‌پذیرد اما فقط یک عبارت را ارزیابی کرده و یک مقدار را برمی‌گرداند. این بدان معناست که تعداد زیادی ورودی را می‌پذیرد اما تنها یک خروجی ارائه می‌دهد.

توابع لامبدا می‌توانند هر زمانی که نیاز به آرگومان‌های تابع وجود داشته باشد، مورد استفاده قرار گیرند. علاوه بر سایر شکل‌های تعریف توابع، در برخی حوزه‌های کدنویسی خاص نیز، کاربردهای مختلفی دارند. مهم است به یاد داشته باشید که مطابق با دستور زبان، توابع لامبدا محدود به یک عبارت هستند.

مثال

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

# Code to demonstrate how we can use a lambda function for adding 4 numbers  
add = lambda num: num + 4    
print( add(6) )    

خروجی

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

10

تابع لامبدا در برنامه داده شده به شکل "lambda num: num+4" تعریف شده است. پارامتر این تابع "num" است و معادله محاسبه شده و برگردانده شده، عبارت "num * 4" است.

برای این تابع هیچ برچسبی تعریف نشده است. این یک شیء تابعی ایجاد می‌کند که با شناسه "add" ارتباط دارد. حالا می‌توانیم به آن به عنوان یک تابع استاندارد ارجاع دهیم. عبارت لامبدا، "lambda num: num+4"، با استفاده از تابع "add" نوشته شده است

در اینجا یک مثال از یک تابع لامبدا داریم که 4 به عدد ورودی اضافه می‌کند و از تابع "add" استفاده می‌شود.

def add( num ):  
   return num + 4  
print( add(6) ) 

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

10

حالا یک مثال از یک تابع لامبدا داریم که دو عدد را در هم ضرب می‌کند و یک نتیجه را برمی‌گرداند. کد به صورت زیر است:

a = lambda x, y : (x * y)  
print(a(4, 5))  

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

20

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

a = lambda x, y, z : (x + y + z)  
print(a(4, 5, 5)) 

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

14

تفاوت بین توابع Lambda و Def چیست؟

بیایید به این مثال نگاه کنیم تا تفاوت بین "تابع معمولی تعریف شده با کلمه کلیدی def با یک تابع با کلمه کلیدی lambda" در چیست. این برنامه معکوس یک عدد داده شده را محاسبه می‌کند:

# Python code to show the reciprocal of the given number to highlight the difference betwee def() and lambda().  
def reciprocal( num ):  
    return 1 / num  
   
lambda_reciprocal = lambda num: 1 / num  
   
# using the function defined by def keyword  
print( "Def keyword: ", reciprocal(6) )  
   
# using the function defined by lambda keyword  
print( "Lambda keyword: ", lambda_reciprocal(6) ) 

خروجی

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

Def keyword:  0.16666666666666666
Lambda keyword:  0.16666666666666666

توابع reciprocal() و lambda_reciprocal()در سناریوی قبلی به نحوی مشابه و مطابق با انتظار عمل می‌کنند. بیایید به دقت نمونه بالا نگاهی بیاندازیم:

هر دوی این توابع معکوس یک عدد داده شده را بدون استفاده از لامبدا تولید می‌کنند. با این حال، ما می‌خواستیم یک تابع با نام reciprocal تعریف کرده و یک عدد را به آن ارسال کنیم در حالی که از def استفاده می‌کنیم. همچنین باید از کلمه کلیدی return برای ارائه خروجی از هر جایی که تابع اجرا شده استفاده کنیم.

استفاده از لامبدا: به جای عبارت "return"، تعریف‌های لامبدا همیشه شامل یک عبارت به عنوان خروجی هستند. زیبایی توابع لامبدا در این است که برای آن‌ها نیازی به اختصاص یک عبارت لامبدا به یک متغیر نیست، زیرا می‌توانیم آن را در هر مکانی که نیاز به یک تابع داریم قرار دهیم.

استفاده از تابع لامبدا با filter()

متد filter() در پایتون دو آرگومان می‌پذیرد: یک تابع و یک مجموعه مانند یک لیست.

این تابع برای هر مورد از لیست فراخوانی می‌شود و یک مجموعه یا لیست جدیدی را که تنها عناصری را که وقتی به تابع داده شده‌اند و در اجرای تابع مقدار True برگردانده‌اند نگه می‌دارد، برمی‌گرداند.

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

در اینجا ما یک مثال از تابع لامبدا با استفاده از filter() در پایتون داریم. کد به صورت زیر است:

# This code used to filter the odd numbers from the given list  
list_ = [35, 12, 69, 55, 75, 14, 73]      
odd_list = list(filter( lambda num: (num % 2 != 0) , list_ ))      
print('The list of odd number is:',odd_list)    

خروجی

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

The list of odd number is: [35, 69, 55, 75, 73]

استفاده از تابع لامبدا با map()

یک متد و یک لیست به تابع map() در پایتون ارسال می‌شوند.

تابع برای تمام عناصر موجود در لیست اجرا می‌شود و یک لیست جدید با عناصری که توسط تابع داده شده برای هر مورد ایجاد شده‌اند تولید می‌شود.

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

در اینجا ما یک مثال از تابع لامبدا با استفاده از متد map() در پایتون داریم. کد به صورت زیر است:

#Code to calculate the square of each number of a list using the map() function      
numbers_list = [2, 4, 5, 1, 3, 7, 8, 9, 10]      
squared_list = list(map( lambda num: num ** 2 , numbers_list ))      
print( 'Square of each number in the given list:' ,squared_list )    

خروجی

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

Square of each number in the given list: [4, 16, 25, 1, 9, 49, 64, 81, 100]

استفاده از تابع لامبدا با ترکیب لیست تشکیلی (List Comprehension)

در این مثال، تابع لامبدا را به همراه لیست تشکیلی و کلمه کلیدی lambda با یک حلقه for استفاده می‌کنیم. با استفاده از تابع لامبدا با لیست تشکیلی، می‌توانیم مقدار مربع اعداد از 0 تا 10 را چاپ کنیم. برای چاپ مقدار مربع اعداد از 0 تا 10، یک محدوده حلقه از 0 تا 11 ایجاد می‌کنیم.

در اینجا ما یک مثال از تابع لامبدا با لیست تشکیلی در پایتون داریم. کد به صورت زیر است:

#Code to calculate square of each number of lists using list comprehension    
squares = [lambda num = num: num ** 2 for num in range(0, 11)]       
for square in squares:    
       print('The square value of all numbers from 0 to 10:',square(), end = " ")    

خروجی

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

The square value of all numbers from 0 to 10: 0 1 4 9 16 25 36 49 64 81 100 

استفاده از تابع لامبدا با if-else

در این مثال، از تابع لامبدا با if-else استفاده خواهیم کرد. در کد برنامه زیر، با استفاده از if-else بررسی می‌کنیم که کدام عدد از دو عدد داده شده بزرگتر است.

# Code to use lambda function with if-else    
Minimum = lambda x, y : x if (x < y) else y       
print('The greater number is:', Minimum( 35, 74 ))    

خروجی

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

The greater number is: 35

در توابع لامبدا، امکان استفاده از چند عبارت وجود ندارد. اما می‌توانیم 2 تابع لامبدا یا بیشتر ایجاد کرده و سپس دومین تابع لامبدا را به عنوان یک آرگومان به اولین تابع فراخوانی کنیم. در کد زیر، ما هر زیرلیست را از لیست داده شده مرتب می‌کنیم. بیایید با استفاده از تابع لامبدا سومین بزرگترین عدد را از هر زیرلیست پیدا کنیم.

در اینجا ما یک مثال از تابع لامبدا با چند عبارت در پایتون داریم. کد به صورت زیر است:

# Code to print the third largest number of the given list using the lambda function      
  
my_List = [ [3, 5, 8, 6], [23, 54, 12, 87], [1, 2, 4, 12, 5] ]      
# sorting every sublist of the above list    
sort_List = lambda num : ( sorted(n) for n in num )      
# Getting the third largest number of the sublist    
third_Largest = lambda num, func : [ l[ len(l) - 2] for l in func(num)]    
result = third_Largest( my_List, sort_List)      
print('The third largest number from every sub list is:', result )    

خروجی

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

The third largest number from every sub list is: [6, 54, 5]
1402/07/18 1444
نظرات شما

نظرات خود را ثبت کنید...