پایتون

جلسه ۲۵: توابعی به عنوان آرگومان در پایتون

در این درس یاد میگیریم که چگونه میتوان از یک تابع به عنوان آرگومان تابعی دیگر استفاده کرد.

در پایتون، یک تابع میتواند به عنوان ورودی و آرگومان تابعی دیگر مورد استفاده قرار بگیرد.

به عنوان  مثال میخواهیم یک تابع calculator بسازیم که شامل عملیات هایی نظیر add subtract multiply divide با دو آرگومان باشد.

برای اینکار ما میتوانیم ۴ تابع تعریف کنیم که هر کدام مربوط به یکی از این محاسبات خواهد بود.

استفاده از توابع عادی

def add(n1, n2):
    return n1 + n2


def subtract(n1, n2):
    return n1 - n2


def multiply(n1, n2):
    return n1 * n2


def divide(n1, n2):
    return n1 / n2


def calculator(operation, n1, n2):
    return operation(n1, n2)  # Using the 'operation' argument as a function


result = calculator(multiply, 10, 20)
print(result)
print(calculator(add, 10, 20))

در خط ۲۱ از کدبالا، پایتون به طور اتوماتیک متوجه میشود که منظور از multiply همان تابع است و به درستی کار میکند.

استفاده از lambda

در درس قبلی هدف توابع lambda را بررسی کردیم اما الان آن را در کاربرد خواهیم دید.

برای متد calculator ما نیاز داشتیم تا ۴ تابع جدا داشته باشیم که بتواند به عنوان آرگومان استفاده شود.این کار میتواند دردسر ساز باشد.

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

امتحان میکنیم:

def calculator(operation, n1, n2):
    return operation(n1, n2)  # Using the 'operation' argument as a function


# ۱۰ and 20 are the arguments.
result = calculator(lambda n1, n2: n1 * n2, 10, 20)
# The lambda multiplies them.
print(result)

print(calculator(lambda n1, n2: n1 + n2, 10, 20))

کد بالا نسبت به کد قبلی مقداری بهتر است. میتوانیم operation هایی را بر اساس نیازمان هر تعداد که بخواهیم تعریف کنیم.

این زیبایی lambda ها است. آن ها بسیار مناسب برای قرار گیری به عنوان آرگومان توابع دیگر هستند.

مثال‌های بیشتر

تابع داخلی map یک شی map با استفاده از یک لیست و یک تابع میسازد . این شی به کمک تابع ()list میتواند از map به لیست تبدیل شود.

طریقه نوشتن کد برای این تابع بدین صورت است:

map(function, list)

function روی تمام اعضای لیست list اعمال میشود.

در کدزیر، با استفاده از تابع map اعضای یک لیست را دوبرابر میکنیم.

num_list = [0, 1, 2, 3, 4, 5]

double_list = map(lambda n: n * 2, num_list)

print(list(double_list))

این کار یک لیست جدید برای ما درست میکند و البته لیست اصلی بدون تغییر میماند.

ما میتوانستیم یک تابع تعریف کنیم که مقدار ورودی آن را دوبرابر کند و سپس آن را به عنوان آرگومان تابع map میدادیم. اما lambda این کار را برای ما بسیار ساده کرده است.

یک مثال ساده دیگر تابع filter است، این تابع نیز نیاز به یک تابع و یک لیست به عنوان ورودی دارد.

تابع filter اعضای یک لیست را بر اساس اینکه آیا شرایط داده شده در آرگومان function را برآورده میکند یا خیر، فیلتر میکند.

حال مثالی را ببینید که اعضای یک لیست را اگر بزرگ‌تر از ۱۰ باشند را فیلتر میکند.

numList = [30, 2, -15, 17, 9, 100]

greater_than_10 = list(filter(lambda n: n > 10, numList))
print(greater_than_10)

این تابع  خروجی آن یک شی از کلاس filter است، که برای تبدیل شدن به لیست باید از دستور list نیز استفاده کنیم.

این تابع هم همانند map ، خود لیست اصلی را تغییر نمیدهد و یک لیست جدید را به ما میدهد.

اکنون، بهتر یادگرفتیم که چگونه یک تابع میتواند به عنوان ورودی تابع دیگری تعریف شود و اینکه چرا lambda ها برای اینکار مفید هستند.

در درس بعدی یک ویژگی قدرتمند دیگری از توابع به نام recursion یا بازگشت را بررسی میکنیم.

نوشته های مشابه

دیدگاهتان را بنویسید

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

دکمه بازگشت به بالا