توابع Map و Filter در پایتون
توابع map و filter از توابع درونی (built-in) و مرتبه بالای پایتون هستند که برای پردازش مؤثر لیستها و دیگر اشیاء تکرارشونده (iterables) استفاده میشوند. این توابع به صورت lazy اجرا میشوند و خروجی آنها یک شیء iterable است، بنابراین برای مشاهده نتیجه، باید آن را به صراحت تبدیل به لیست یا نوع مناسب دیگری کرد.
تابع map
تابع map دو آرگومان دریافت میکند: یک تابع و یک iterable. سپس آن تابع را روی تکتک عناصر iterable اعمال کرده و یک map object بازمیگرداند که میتوان آن را به لیست یا هر نوع دیگر تبدیل کرد.
def add_five(x):
return x + 5
nums = [11, 22, 33, 44, 55]
result = list(map(add_five, nums))
print(result) # خروجی: [16, 27, 38, 49, 60]
همان عملیات را میتوان به صورت فشرده با تابع لامبدا نیز نوشت:
nums = [11, 22, 33, 44, 55]
result = list(map(lambda x: x + 5, nums))
print(result)
کاربردهای رایج:
# تبدیل رشتهها به عدد
str_numbers = ['1', '2', '3', '4']
int_numbers = list(map(int, str_numbers)) # [1, 2, 3, 4]
# اعمال strip روی رشتهها
lines = [' apple ', 'banana ', ' cherry']
cleaned = list(map(str.strip, lines)) # ['apple', 'banana', 'cherry']
تابع filter
تابع filter نیز دو آرگومان دریافت میکند: یک تابع شرطی (که باید خروجی بولی داشته باشد) و یک iterable. خروجی فقط شامل آیتمهایی است که تابع روی آنها مقدار True بازگرداند.
nums = [11, 22, 33, 44, 55]
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # خروجی: [22, 44]
کاربردهای رایج:
# فیلتر کردن مقادیر تهی
values = ["apple", "", "banana", None, "cherry", ""]
non_empty = list(filter(None, values)) # ['apple', 'banana', 'cherry']
# فیلتر کردن اعداد مثبت
nums = [-2, 0, 3, -1, 7]
positives = list(filter(lambda x: x > 0, nums)) # [3, 7]
تابع sorted
تابع sorted یک iterable (مانند لیست، تاپل یا رشته) را دریافت کرده و یک لیست جدید شامل عناصر مرتبشده برمیگرداند. برخلاف متد .sort() که لیست اصلی را تغییر میدهد، sorted لیست اصلی را دستنخورده باقی میگذارد. این تابع همچنین از آرگومانهای key (برای تعیین معیار مرتبسازی) و reverse (برای مرتبسازی نزولی) پشتیبانی میکند.
nums = [33, 11, 44, 22, 55]
# مرتبسازی پیشفرض (صعودی)
sorted_nums = sorted(nums)
print(sorted_nums) # خروجی: [11, 22, 33, 44, 55]
# مرتبسازی نزولی
sorted_desc = sorted(nums, reverse=True)
print(sorted_desc) # خروجی: [55, 44, 33, 22, 11]
کاربردهای رایج با آرگومان key:
# مرتبسازی بر اساس طول رشته
words = ['banana', 'pie', 'apple', 'kiwi']
sorted_by_len = sorted(words, key=len)
print(sorted_by_len) # خروجی: ['pie', 'kiwi', 'apple', 'banana']
# مرتبسازی دیکشنریها بر اساس یک مقدار خاص
students = [
{'name': 'Ali', 'grade': 18},
{'name': 'Reza', 'grade': 15},
{'name': 'Sara', 'grade': 20}
]
# مرتبسازی بر اساس نمره (grade)
sorted_students = sorted(students, key=lambda x: x['grade'])
print(sorted_students)
توجه داشته باشید که sorted همیشه یک لیست برمیگرداند، حتی اگر ورودی شما یک تاپل یا مجموعه (set) باشد. این ویژگی باعث میشود در بسیاری از موقعیتها جایگزین مناسبی برای map و filter باشد، زیرا مستقیماً ساختار دادهای منظم (لیست) تحویل میدهد.