مشخصات مقاله
-
0.0
-
1444
-
0
-
0
توابع 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]