
روز ۳۷ آموزش پایتون: lambda, map, filter, reduce
در برنامه نویسی پایتون، توابع lambda و توابعی مانند map، filter و reduce ابزارهایی قدرتمند برای پردازش دادهها و اجرای عملیات تابعی (Functional Programming) هستند. این ابزارها باعث میشوند کدهای پیچیده با حلقهها و شرطها به شکل کوتاه، خوانا و حرفهای نوشته شوند. به جای نوشتن چندین خط کد برای پردازش یک لیست یا دیکشنری، میتوانیم با lambda و ترکیب آن با map، filter و reduce، عملیات مورد نظر را با چند خط کد انجام دهیم و کد را بهینه کنیم. استفاده از این ابزارها در پروژههای واقعی بسیار رایج است، به ویژه وقتی دادهها بزرگ باشند یا نیاز باشد روی آنها عملیات پیچیده انجام شود.
Lambda: توابع بینام
توابع lambda توابعی هستند که نام ندارند و معمولاً برای استفاده در همان خط کد تعریف میشوند. lambda به برنامهنویس اجازه میدهد یک تابع کوتاه و سریع بسازد که تنها یک عملیات را انجام میدهد. این توابع معمولاً در ترکیب با map، filter و reduce استفاده میشوند و کد را بسیار خواناتر میکنند.
نمونه کد Lambda:
square = lambda x: x ** 2 print(square(5)) # خروجی: 25
در این مثال، یک تابع lambda تعریف کردیم که توان دوم یک عدد را محاسبه میکند. بدون lambda، برای همین کار باید یک تابع کامل با def مینوشتیم که چند خط کد بیشتر داشت.
Map: اعمال یک تابع روی همه عناصر
تابع map اجازه میدهد یک تابع را روی همه عناصر یک لیست یا مجموعه اعمال کنیم و نتیجه را در یک iterable جدید دریافت کنیم. استفاده از map همراه با lambda باعث میشود کد کوتاهتر و خواناتر شود.
نمونه کد Map:
numbers = [1, 2, 3, 4, 5] squared = list(map(lambda x: x ** 2, numbers)) print(squared) # خروجی: [1, 4, 9, 16, 25]
در این مثال، توان دوم هر عدد از لیست numbers محاسبه شده و نتیجه در یک لیست جدید ذخیره شده است. بدون map، باید حلقه for و append استفاده میکردیم که کد طولانیتر میشد.
Filter: فیلتر کردن عناصر
تابع filter اجازه میدهد تنها عناصر مشخصی از یک مجموعه انتخاب شوند که شرط خاصی را برآورده میکنند. معمولاً با lambda ترکیب میشود تا فیلتر به شکل کوتاه و قابل فهم نوشته شود.
نمونه کد Filter:
numbers = [1, 2, 3, 4, 5, 6] even_numbers = list(filter(lambda x: x % 2 == 0, numbers)) print(even_numbers) # خروجی: [2, 4, 6]
در این مثال، فقط اعداد زوج از لیست numbers انتخاب شدهاند. این روش خواناتر و سریعتر از نوشتن حلقه و شرط دستی است و مخصوصاً وقتی مجموعه دادهها بزرگ باشد، عملکرد بهتری دارد.
Reduce: ترکیب عناصر
تابع reduce که در ماژول functools قرار دارد، اجازه میدهد تمام عناصر یک مجموعه را به یک مقدار واحد ترکیب کنیم. این تابع معمولاً برای محاسبه جمع، ضرب یا هر عملیات تجمعی دیگر استفاده میشود.
نمونه کد Reduce:
from functools import reduce numbers = [1, 2, 3, 4, 5] sum_numbers = reduce(lambda x, y: x + y, numbers) print(sum_numbers) # خروجی: 15
در این مثال، تمام عناصر لیست numbers جمع شده و یک مقدار واحد تولید شده است. بدون reduce، باید حلقه for و یک متغیر میانی تعریف میکردیم که کد طولانیتر و کمتر خوانا بود.
ترکیب Lambda با Map, Filter و Reduce
یکی از قدرتمندترین ویژگیهای پایتون، ترکیب این ابزارها برای پردازش دادهها به شکل تابعی و کوتاه است. این ترکیب باعث میشود عملیات پیچیده روی لیستها، دیکشنریها یا مجموعهها تنها با چند خط کد انجام شود، بدون اینکه کد خوانایی خود را از دست بدهد.
نمونه کد ترکیبی:
from functools import reduce numbers = [1, 2, 3, 4, 5, 6] result = reduce(lambda x, y: x + y, map(lambda n: n**2, filter(lambda n: n % 2 == 0, numbers))) print(result) # خروجی: 56 (2^2 + 4^2 + 6^2)
در این مثال، ابتدا اعداد زوج با filter انتخاب شده، سپس توان دوم آنها با map محاسبه شده و در نهایت با reduce جمع شدهاند. این کار با حلقهها و شرطهای معمولی به چندین خط کد نیاز داشت و احتمال خطا بیشتر بود.
در این روز یاد گرفتیم که چگونه lambda، map، filter و reduce میتوانند کدهای پایتون را کوتاه، خوانا و حرفهای کنند. این ابزارها مخصوصاً در پردازش دادههای بزرگ و عملیات تجمعی بسیار کاربرد دارند. تمرین پیشنهادی این است که یک لیست از اعداد واقعی را پردازش کنید، اعداد مشخص را فیلتر کنید، آنها را تغییر دهید و با reduce یک مقدار نهایی بسازید تا تسلط کامل پیدا کنید. این مهارت در پروژههای واقعی مانند تحلیل داده، پردازش لیستها، فروشگاهها و سیستمهای مدیریتی کاربرد زیادی دارد و باعث میشود کد حرفهایتر و قابل نگهداریتر شود.
