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

May 2020

دانلود ویدیو

اگر دانلود ویدیو شروع نشد، روی ویدیو راست کلیک کرده و گزینه Save Video As را انتخاب کنید.

در این ویدیو با توابع 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

 

ارسال نظر

تلاش میکنم سوالات شما را در کمتر از یک روز پاسخ بدم

Kurosh

December 2021

Amir damet garm khodayi hal mikonam asan tozih midi

پاسخ به نظر