برنامه‌نویسی

آموزش استفاده از توابع Lambda، Map و Filter در Python

آموزش استفاده از توابع lambda، map و filter در python

یادگیری چگونگی استفاده از توابع Lambda، Map و Filter با توجه به کاربردهای بسیار زیاد آن‌ها در زبان Python از اهمیت بالایی برخوردار است. به‌همین منظور ما در این مقاله تصمیم داریم نحوه‌ی استفاده از این توابع را به‌همراه مثال به شما آموزش دهیم.

تابع Lambda

از Lambda برای ایجاد توابع Anonymous در زبان Python استفاده می‌شود و سینتکس آن به شکل زیر است:

lambda arguments : expression

همان‌طور که مشاهده می‌کنید، یک تابع Lambda می‌تواند تعداد زیادی آرگومان را به‌‌عنوان ورودی دریافت کند اما باید توجه داشته باشید که فقط یک Expression را می‌توان بر روی آرگومان‌های ورودی اجرا کرد.

نحوه‌ی استفاده از تابع Lambda در زبان Python

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

 def add(x, y): 
    return x + y

# Call the function
add(2, 3)  # Output: 5

تابع فوق دو آرگومان x و y را دریافت کرده و درنهایت جمع آن‌ها را return می‌کند. حال بیایید ببینیم چگونه می‌توان تابع فوق را به یک تابع Lambda تبدیل کرد:

add = lambda x, y : x + y 

print(add(2, 3)) # Output: 5

lambda x, y: x + y یک function object را return می‌کند بنابراین باید آن را به یک متغیر انتساب داده و در مرحله‌ی بعد می‌توان از آن متغیر مانند یک تابع عادی در زبان Python استفاده کرد. همچنین با بررسی نوع آن متغیر می‌توانید متوجه شوید که به یک تابع تبدیل شده است:

type(add) # Output: <class 'function'>

تابع Map

تابع Map با سینتکس زیر:

map(function_object, iterable1, iterable2,...)

یک function object را به‌عنوان آرگومان اول دریافت کرده و آن را بر روی تمام مقادیر توالی‌های قابل پیمایشی که در آرگومان‌های بعدی دریافت کرده است، اجرا می‌کند.

نحوه‌ی استفاده از تابع Map در زبان Python

def multiply2(x):
  return x * 2

map(multiply2, [1, 2, 3, 4])  # Output [2, 4, 6, 8]

در مثال فوق یک تابع با نام multiply2 وجود دارد که ما از آن به‌عنوان function object استفاده می‌کنیم. این تابع یک آرگومان با نام x را دریافت و مقدار دریافتی را در عدد ۲ ضرب می‌کند. حال در این مثال، لیست [1, 2, 3, 4] به‌عنوان توالی قابل پیمایش در آرگومان دوم تابع Map وارد شده که درنهایت function object بر روی تک تک مقادیر لیست وارد شده اجرا می‌شود.

حال با استفاده از مطالب بخش قبل می‌توانیم کدهای فوق را با استفاده از تابع Map و Lambda بازنویسی کنیم تا درنهایت کدهای کوتاه‌تر و تمیزتری داشته باشیم:

map(lambda x : x*2, [1, 2, 3, 4]) #Output [2, 4, 6, 8]

پیمایش دیکشنری‌ها با استفاده از توابع Map و Lambda در زبان Python

dict_a = [{'name': 'python', 'points': 10}, {'name': 'java', 'points': 8}]

در این بخش دو دیکشنری در لیستی با نام dict_a وجود دارد و ما قصد داریم با استفاده از چند تابع Lambda برخی Expressionهای ساده را بر روی مقادیر هر دیکشنری اجرا کنیم:

dict_a = [{'name': 'python', 'points': 10}, {'name': 'java', 'points': 8}]

map(lambda x : x['name'], dict_a) # Output: ['python', 'java']

map(lambda x : x['points']*10,  dict_a) # Output: [100, 80]

map(lambda x : x['name'] == "python", dict_a) # Output: [True, False]

پیمایش چندین توالی با استفاده از تابع Map در زبان Python

تابع Map می‌تواند یک Expression را بر روی چندین توالی قابل پیمایش اجرا کند:

list_a = [1, 2, 3]
list_b = [10, 20, 30]

map(lambda x, y: x + y, list_a, list_b) # Output: [11, 22, 33]

list_a و list_b در مثال فوق به‌عنوان دو توالی مختلف در آرگومان‌های دوم و سوم تابع Map وارد شده‌اند و آرگومان اول تابع Map که همان function object ما است، دو آرگومان x و y دریافت کرده و درنهایت جمع این دو مقدار return می‌کند. حال با نگاهی به خروجی نهایی تابع Map که لیستی با مقادیر [11, 22, 33] است، می‌توانیم متوجه شویم که مقادیر list_a به‌عنوان آرگومان x و مقادیر list_b به‌عنوان آرگومان y به تابع Lambda پاس داده شده است.

البته موضوعی وجود دارد که باید به آن بپردازیم. تابع Map در Python 3 یک map object را return می‌کند و به همین دلیل نمی‌توانیم به‌طور مستقیم به خروجی آن دسترسی داشته باشیم:

map_output = map(lambda x: x*2, [1, 2, 3, 4])
print(map_output) # Output: map object: <map object at 0x04D6BAB0>

بنابراین برای دسترسی به خروجی‌های map_output باید آن را به یک لیست تبدیل کنیم:

map_output = map(lambda x: x*2, [1, 2, 3, 4])
print(map_output) # Output: map object: <map object at 0x04D6BAB0>

list_map_output = list(map_output)

print(list_map_output) # Output: [2, 4, 6, 8]

تابع Filter

با استفاده از تابع Filter می‌توانیم مقادیر مورد نظر خود را از یک توالی قابل پیمایش فیلتر کنیم. حال سینتکس این تابع به شکل زیر است و به‌طور کلی دو آرگومان دریافت می‌کند:

filter(function_object, iterable)

اولین آرگومان یک function object است که بر روی مقادیر آرگومان دوم که یک توالی است، اجرا خواهد شد و خروجی نهایی باید یک مقدار boolean باشد. اگر نتیجه‌ی اجرای Expression تعریف شده در function object بر روی هر کدام از مقادیر توالی قابل پیمایش برابر با True باشد، آن مقدار در لیست نهایی return می‌شود.

تفاوت تابع Filter با تابع Map در این است که شما می‌توانید چندین توالی قابل پیمایش را به تابع Map پاس دهید اما در تابع Filter فقط می‌توانید یک توالی را وارد کنید.

نحوه‌ی استفاده از تابع Filter در زبان Python

بیایید عددهای زوج را از میان لیست [1, 2, 3, 4, 5, 6] فیلتر کنیم:

a = [1, 2, 3, 4, 5, 6]
filter(lambda x : x % 2 == 0, a) # Output: [2, 4, 6]

همچنین شما می‌توانید مقادیر مورد نظر خود را از میان مقادیر موجود در یک دیکشنری به شکل زیر فیلتر کنید:

dict_a = [{'name': 'python', 'points': 10}, {'name': 'java', 'points': 8}]

filter(lambda x : x['name'] == 'python', dict_a) # Output: [{'name': 'python', 'points': 10}]

تابع Filter مانند تابع Map، یک object function را return می‌کند که برای دسترسی به خروجی آن باید به‌صورت زیر عمل کرد:

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

filter_obj = filter(lambda x: x % 2 == 0, list_a) # filter object <filter at 0x4e45890>

even_num = list(filter_obj) # Converts the filer obj to a list

print(even_num) # Output: [2, 4]

منبع: https://betterprogramming.pub/lambda-map-and-filter-in-python-4935f248593