آموزش استفاده از توابع 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

برچسب‌ها:

خدمات رایگان لیارا

۲.۵ گیگابایت فضای ذخیره‌سازی ابری رایگان

۲.۵ گیگابایت Object Storage سازگار با پروتکل S3 با دیسک‌های SSD به‌صورت رایگان دریافت کنید.

هاست رایگان برای دیتابیس‌

دیتابیس‌های MariaDB، PostgreSQL و Redis را فقط با یک کلیک و به‌صورت رایگان تهیه کنید.

سرویس DNS رایگان

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

۱۰۰ هزار تومان اعتبار اولیه

بعد از ثبت نام در لیارا مبلغ ۱۰۰ هزار تومان اعتبار هدیه دریافت می‌کنید که با توجه به ساعتی بودن هزینه سرویس‌ها، می‌توانید تمامی خدمات پولی را برای چندین هفته رایگان استفاده کنید.

ارسال ۱۰۰ ایمیل تراکنشی رایگان در هر ماه

در سرویس ایمیل لیارا شما می‌توانید تا ۱۰۰ ایمیل رایگان در هر ماه ارسال کنید و فقط برای بیش از آن هزینه پرداخت کنید. (به‌همراه دسترسی SMTP)

هاست رایگان برای انواع وبسایت

تفاوتی ندارد برای وبسایت خود از Node استفاده می‌کنید یا Laravel و Django، در لیارا می‌توانید به صورت کاملا رایگان آن را میزبانی کنید.

توسعه‌دهندگان درباره‌ی ما چه می‌گویند

تجربه کار باliara_cloud@امروز خیلی خوب بود. یکی از سرویس هام رو منتقل کردم روش و راضیم. انقد سریع و جذاب کارم راه افتادم اصن باورم نمیشد! برعکس سرویس های PaaS دیگه با اون همه پیچیدگیشون. دمتون گرم
...

MohammadReza
liara testimonial
keikaavousi

بعد از بسته شدن @fandoghpaas و ناراحتی همه‌مون از اینکه یه سرویس خوب و صادق نمی‌تونه از پس هزینه‌ها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوت‌هایی داشت که کمی کار می‌خواست ولی تا الان کاملا راضی.

jadi
liara testimonial
jadi

یه خسته نباشید باید به تصمیمliara_cloud@بگم،
بعد از چندین روز سرکله زدن با سرویس های مشابه بالاخره تصمیم گرفتم لیارا رو امتحان کنم و باور نمیشه ۱۰ دقیقه بیشتر وقت نبرد،
دمتون گرم.

Arch
liara testimonial
EbadiDev

واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیت‌های سرویس دیتابیس‌شون اینه که خودشون به صورت دوره‌ای بکآپ میگیرن.
...

Ali Najafi
liara testimonial
me_ali_najafi

یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@

Navid
liara testimonial
1navid

عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم

Amir H Shekari
liara testimonial
vanenshi

همراه شما هستیم

در خصوص سفارش یا استفاده از سرویس‌ها سوالی دارید؟
تلفن واحد فروش:
۰۲۵-۳۳۵۵۷۶۱۹ (روزهای کاری ۹ الی ۱۷)
تلفن واحد فروش: ۳۳۵۵۷۶۱۹-۰۲۵ (روزهای کاری ۹ الی ۱۷)