ویدیو آموزش توابع map و filter و reduce در پایتون

امیرحسین بیگدلو April 2023

در این ویدیو با توابع map و reduce و filter آشنا میشوید. فانکشن های map, reduce, filter تقلیدی هستند از برنامه نویسی functional. هر سه این فانکشن ها میتوانند با list comprehension یا حلقه ها جایگزین شوند اما رویکردی ظریف تر و کوتاه تر برای برخی از مشکلات ارائه می دهند.

 

# تابع map در پایتون

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

map(function, iterable, ...)

 

میتوانید بیش از یک آبجکت iterable به فانکشن مورد نظر ارسال کنید. مقداری که تابع map برمیگرداند یک کلاس map است که باید توسط توابع مانند list یا set خوانده شود.

 

برای درک بهتر، بیایید از چند مثال استفاده کنیم.  در کد زیر با استفاده از تابع map توانستیم تمام آیتم هایی که در لیست names وجود دارد را به فانکشن show ارسال کنیم. فانکشن map یک map object برمیگرداند و برای دیدن نتیجه باید از فانکشن list استفاده کنیم:

names = ['amir', 'kevin', 'jack', 'mark']

def show(name):
    print( f'Hello {name}' )

list( map(show, names) )

# Hello amir
# Hello kevin
# Hello jack
# Hello mark

 

همچنین میتوانید از تابع map در کنار توابع لامبدا نیز استفاده کنید. همانطور که میدانید لامبدا یک نوع دیگر از فانکشن های پایتون هستند پس استفاده از توابع لامبدا در کنار map بسیار مرسوم است:

numbers = (1, 2, 3, 4)
result = map(lambda x: x*x, numbers)

print(result)

# converting map object to set
numbersSquare = set(result)
print(numbersSquare)

# OUTPUT
<map 0x7fafc21ccb00>
{16, 1, 4, 9}

 

 

# تابع filter در پایتون

در این بخش تابع filter پایتون را به همراه چند مثال یاد میگیریم. تابع filter هم مانند map یک آبجکت iterable گرفته و آیتم های آن را به فانکشن دیگری ارسال میکند. اما فقط آیتم هایی که مقدار True برگدانند را ذخیره میکند. سینتکس این تابع به شکل زیر است:

filter(function, iterable)

 

مقداری که تابع filter برمیگرداند یک آبجکت قابل پیشمایش است.

 

بیایید چند مثال از تابع filter در پایتون ببینیم. در مثال پایین میبینید که فقط اعدادی که از 18 بالاتر هستند برگشت داده شده اند:

ages = [20, 32, 14, 17, 24]

def filter_ages(age):
    if age > 18:
        return True

print( list( filter(filter_ages, ages) ) )


# [20, 32, 24]

 

همچنین میتوانید از توابع لامبدا به همراه تابع filter در پایتون استفاده کنید:

numbers = [1, 2, 3, 4, 5, 6, 7]

# the lambda function returns True for even numbers 
even_numbers_iterator = filter(lambda x: (x%2 == 0), numbers)

# converting to list
even_numbers = list(even_numbers_iterator)

print(even_numbers)

# OUTPUT
[2, 4, 6]

 

در این مثال، مستقیما یک تابع lambda را به filter ارسال کرده ایم. تابع لامبدا فقط برای اعدادی که زوج باشند مقدار True را برمیگرداند که در اینصورت توسط تابع filter انتخاب شده و در نتیجه نهایی گنجانده میشوند.

 

 

# تابع reduce در پایتون

در این بخش به سراغ تابع reduce پایتون میرویم. عملکرد تابع reduce کمی با دو متد قبلی فرق دارد. این فانکشن از ماژول functools ایمپورت شده و دو آیتم ابتدایی آبجکت iterable را گرفته و نتیجه را به ترتیب با آیتم های بعدی آن آبجکت استفاده میکند. در مثال پایین فانکشن reduce دو آیتم 2 و 5 را گرفته و به add ارسال میکند. نتیجه 7 که فانکشن add برگردانده را دوباره همراه  با 6 به فانکشن add ارسال میکند.

from functools import reduce

nums = [2, 5, 6]

def add(a, b):
    return a + b

print( reduce(add, nums) )

# 13

 

ویدیوهای مشابه



ارسال نظر


سهیل

1 سال قبل پاسخ به نظر

سلام عالی بود و امکانش هست any رو هم اضافه بکنید یک جوری هم builtins هم اینکه کارش شبیه اینا هستش

ارسال نظر



امیرحسین بیگدلو

1 سال قبل

سلام
این لینک رو ببینید:
https://www.mongard.ir/one_part/71/python-any-all/

Kurosh

2 سال قبل پاسخ به نظر

Amir damet garm khodayi hal mikonam asan tozih midi

ارسال نظر



مونگارد