متدهای Map ، Reduce و Filter در پایتون — به زبان ساده

عکس شاخص متدهای Map ، Reduce و Filter در پایتون

متدهای ()map(), reduce و ()filter در پایتون ابزارهایی برای پردازش داده‌ها به‌صورت کارآمد و تابع‌محور هستند که امکان انجام عملیات‌های پیچیده روی دنباله‌ها (مانند لیست‌ها، تاپل‌ها یا دیگر مجموعه‌ها) را فراهم می‌کنند. متد ()map برای اعمال یک تابع به هر عنصر از یک دنباله استفاده می‌شود و یک دنباله جدید حاوی نتایج را باز می‌گرداند. متد ()filter به‌کار می‌رود تا تنها عناصری از دنباله که با یک شرط خاص منطبق هستند را انتخاب کند و نتایج را در قالب یک دنباله جدید ارائه دهد. در این مقاله به بررسی متدهای Map ، Reduce و Filter در پایتون می‌پردازیم.

مقدمه

متدهای Map ، Reduce و Filter در پایتون ابزارهای قدرتمندی برای پردازش داده‌ها به‌صورت کارآمد و مختصر ارائه می‌دهند. این متدها با هدف تسهیل انجام عملیات تکراری روی داده‌ها طراحی شده‌اند و به شما اجازه می‌دهند تا کدهایی خواناتر و تمیزتر بنویسید. این متدهای Map ، Reduce و Filter در پایتون علاوه بر ساده‌سازی عملیات‌های پیچیده، به کمک ترکیب با توابعی مانند lambda، کدنویسی را سریع‌تر و خلاصه‌تر می‌کنند. با این حال، برای درک بهتر عملکرد آن‌ها، آشنایی با مفهوم توابع و ساختارهای iterable ضروری است.

متدهای Map ، Reduce و Filter در پایتون

در ادامه مثال‌هایی از متدهای Map ، Reduce و Filter در پایتون آورده شده است:

  • تابع ()map
  • تابع ()reduce
  • تابع ()filter

متدهای Map ، Reduce و Filter در پایتون

متد Map در پایتون

متد Map در پایتون یک شی Map (Iterator) از نتایج را بازمی‌گرداند که پس از اعمال یک تابع مشخص بر روی هر عنصر از یک «Iterable» داده‌شده (مانند لیست، تاپل و غیره) ایجاد می‌شود. این تابع به شما اجازه می‌دهد تا به‌راحتی تغییرات مورد نظر را به تمامی عناصر دنباله اعمال کنید.

سینتکس:

map(fun, iter)

پارامترها:

  • fun: متدی است که Map هر عنصر یک «Iterable» داده‌شده را به آن ارسال می‌کند.
  • iter: یک شی قابل تکرار «Iterable» که باید پردازش شود.

مثال: در این مثال، یک برنامه پایتون استفاده از متد map را نشان می‌دهد که با اعمال تابع double بر روی هر عنصر از یک لیست داده‌شده، هر عدد را دو برابر می‌کند و سپس نتیجه را به‌صورت یک لیست چاپ می‌کند.

# Function to return double of n
def double(n):
    return n * 2

# Using map to double all numbers
numbers = [5, 6, 7, 8]
result = map(double, numbers)
print(list(result))

خروجی:

[۱۰, ۱۲, ۱۴, ۱۶]

متد Reduce در پایتون

متد Reduce در پایتون برای اعمال یک تابع خاص که به‌عنوان آرگومان به آن ارسال شده است، بر روی تمام عناصر لیستی که در دنباله ارائه شده است، استفاده می‌شود. این تابع در ماژول functools تعریف شده و با استفاده از آن می‌توان عملیات تجمعی «aggregation» مانند جمع یا ضرب را به‌صورت تدریجی بر روی عناصر دنباله انجام داد. نتیجه نهایی این عملیات به‌صورت یک مقدار واحد بازمی‌گردد.

سینتکس:

reduce(func, iterable[, initial])

پارامترها:

fun: تابعی است که باید روی هر عنصر از شیء قابل تکرار «iterable» اجرا شود.
iter: یک شیء قابل تکرار است که باید کاهش یابد.

مثال: در این مثال، از تابع ()reduce از ماژول functools استفاده می‌کنیم تا حاصل‌ضرب عناصر یک لیست داده‌شده را محاسبه کنیم. این کار با استفاده از تابع Lambda که دو عدد را با هم ضرب می‌کند و به‌طور مداوم اعمال می‌شود، انجام شده و نتیجه‌ی نهایی حاصل‌ضرب به دست می‌آید.

import functools

# Define a list of numbers
numbers = [1, 2, 3, 4]

# Use reduce to compute the product of list elements
product = functools.reduce(lambda x, y: x * y, numbers)
print("Product of list elements:", product)

خروجی:

Product of list elements: 24

متد Filter در پایتون

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

سینتکس:

filter(function, sequence)

پارامترها:

function: تابعی که بررسی می‌کند آیا هر عنصر از دنباله شرط را برقرار می‌کند (True) یا خیر.
sequence: دنباله‌ای که باید فیلتر شود؛ می‌تواند مجموعه‌ها «sets» ، لیست‌ها «lists» ، تاپل‌ها «tuples» یا هر نوع Container از Iterators باشد.

مثال: در این مثال، یک تابع به نام is_even تعریف شده است که بررسی می‌کند آیا یک عدد زوج است یا خیر. سپس، تابع ()filter روی یک لیست از اعداد اعمال می‌شود تا فقط اعداد زوج استخراج شوند و نتیجه به‌صورت یک لیست شامل عناصر زوج بازگردانده می‌شود. در نهایت، لیست اعداد زوج چاپ می‌شود.

# Define a function to check if a number is even
def is_even(n):
    return n % 2 == 0

# Define a list of numbers
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Use filter to filter out even numbers
even_numbers = filter(is_even, numbers)
print("Even numbers:", list(even_numbers))

نتیجه‌گیری

این متدها ابزارهای قدرتمندی در برنامه‌نویسی تابعی هستند که برای پردازش داده‌ها به صورت مختصر و کارآمد طراحی شده‌اند. متد ()map برای اعمال یک تابع روی هر عنصر از یک iterable (مثل لیست یا مجموعه) استفاده می‌شود و خروجی یک iterable جدید تولید می‌کند. این متد برای تبدیل داده‌ها مناسب است، مانند افزایش هر عنصر لیست به مقدار ۱. متد ()filter از این برای فیلتر کردن داده‌ها براساس یک شرط خاص استفاده می‌شود و تنها عناصری که شرط را ارضا می‌کنند در خروجی قرار می‌گیرند، مانند انتخاب اعداد زوج از یک لیست.

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


سوالات متداول


آیا می‌توان بیش از یک iterable به ()map داد؟

بله، اگر تابعی که به ()map داده می‌شود توانایی کار با چند ورودی را داشته باشد (مثل توابعی که از lambda استفاده می‌کنند)، می‌توانید چند iterable به ()map بدهید. طول خروجی برابر با کوچک‌ترین طول iterable خواهد بود.

آیا ()filter تنها برای توابع منطقی قابل استفاده است؟

بله، تابعی که به ()filter داده می‌شود باید یک مقدار منطقی (True یا False) برگرداند تا مشخص شود که هر عنصر در خروجی قرار بگیرد یا نه.

متد ()reduce چیست و چه تفاوتی با ()map و ()filter دارد؟

متد ()reduce ، که در ماژول functools قرار دارد، برای کاهش یک iterable به یک مقدار واحد استفاده می‌شود. برخلاف ()map و ()filter که هرکدام یک iterable خروجی می‌دهند، ()reduce یک مقدار نهایی می‌سازد.

چه زمانی باید از متدهای Map ، Reduce و Filter در پایتون استفاده کنیم؟

از ()map زمانی استفاده کنید که نیاز به تغییر عناصر دارید. از ()filter زمانی استفاده کنید که نیاز به فیلتر کردن عناصر دارید. از ()reduce زمانی استفاده کنید که نیاز به خلاصه کردن داده‌ها به یک مقدار دارید.

آیا می‌توان از lambda در کنار این متدها استفاده کرد؟

بله، ترکیب lambda با این متدها بسیار رایج است، زیرا به شما اجازه می‌دهد توابع سریع و کوچک بسازید.

آیا استفاده از این متدها در پایتون مدرن توصیه می‌شود؟

بله، اما در بسیاری موارد استفاده از کامپریهنشن‌ها (list comprehensions) و عبارات جنریتور قابل‌خواناتر و پایتونی‌تر است.

آیا می‌توان به جای این متدها از توابع حلقه‌ای (for/while) استفاده کرد؟

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

میزان رضایتمندی
لطفاً میزان رضایت خودتان را از این مطلب با دادن امتیاز اعلام کنید.
[ امتیاز میانگین 0 از 0 نفر ]
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع و مراجع:
geeksforgeeks مجله پی استور medium learnpython

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *



برچسب‌ها:
پایتون


پیمایش به بالا