مقدمه

در درس قبل با اصول اولیه تعریف توابع آشنا شدیم. پایتون روش‌های بسیار انعطاف‌پذیری برای پاس دادن آرگومان‌ها به توابع ارائه می‌دهد. درک این روش‌ها به ما کمک می‌کند تا توابعی بنویسیم که استفاده از آنها ساده‌تر و خواناتر باشد. به طور کلی، دو نوع اصلی آرگومان وجود دارد: موقعیتی و کلیدواژه‌ای.

آرگومان‌های موقعیتی (Positional Arguments)

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

Copy Icon PYTHON
def describe_pet(animal_type, pet_name):
    """Display information about a pet."""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}.")

describe_pet('hamster', 'harry')

در اینجا، 'hamster' به animal_type و 'harry' به pet_name اختصاص داده می‌شود. ترتیب در این نوع آرگومان‌ها بسیار مهم است و جابجا کردن آنها منجر به نتایج اشتباه خواهد شد.

آرگومان‌های کلیدواژه‌ای (Keyword Arguments)

یک آرگومان کلیدواژه‌ای، یک زوج نام-مقدار است که شما مستقیماً هنگام فراخوانی تابع پاس می‌دهید. وقتی از آرگومان‌های کلیدواژه‌ای استفاده می‌کنید، ترتیب آنها دیگر اهمیتی ندارد، زیرا پایتون می‌داند که هر مقدار را به کدام پارامتر اختصاص دهد. این کار خوانایی فراخوانی تابع را به شدت افزایش می‌دهد.

Copy Icon PYTHON
# Using the same function as before
describe_pet(pet_name='willie', animal_type='dog')

این فراخوانی دقیقاً معادل فراخوانی قبلی است، اما بسیار خواناتر است و ترتیب آرگومان‌ها دیگر مهم نیست.

مقادیر پیش‌فرض برای پارامترها

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

یک قانون مهم: پارامترهایی که مقدار پیش‌فرض دارند، باید بعد از تمام پارامترهایی که مقدار پیش‌فرض ندارند، تعریف شوند.

Copy Icon PYTHON
# Now, animal_type has a default value
def describe_pet_default(pet_name, animal_type='dog'):
    """Display information about a pet."""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}.")

# Call with default value
describe_pet_default(pet_name='willie')

# Call and override the default value
describe_pet_default(pet_name='harry', animal_type='hamster')

در اینجا اگر فقط نام حیوان خانگی را وارد کنید، مقدار پیش‌فرض 'dog' برای پارامتر animal_type استفاده می‌شود. اما اگر مقدار دیگری برای animal_type مشخص کنید، مقدار جدید جایگزین مقدار پیش‌فرض خواهد شد. این ویژگی باعث می‌شود توابع شما انعطاف‌پذیرتر و استفاده از آن‌ها ساده‌تر شود.

لیست آرگومان‌های متغیر

گاهی اوقات شما نمی‌دانید که یک تابع قرار است چه تعداد آرگومان دریافت کند. پایتون به شما اجازه می‌دهد تا توابعی بنویسید که تعداد متغیری از آرگومان‌ها را بپذیرند.

آرگومان‌های موقعیتی متغیر (*args)

پارامتری که با یک ستاره (*) شروع می‌شود (طبق قرارداد *args)، تمام آرگومان‌های موقعیتی اضافی را در قالب یک تاپل جمع‌آوری می‌کند.

Copy Icon PYTHON
def make_pizza(size, *toppings):
    """Summarize the pizza we are about to make."""
    print(f"\nMaking a {size}-inch pizza with the following toppings:")
    for topping in toppings:
        print(f"- {topping}")

make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

در اینجا تابع make_pizza می‌تواند هر تعداد تاپینگ را به عنوان آرگومان دریافت کند. همه آرگومان‌های اضافی به صورت یک تاپل در پارامتر toppings جمع‌آوری می‌شوند. این ویژگی زمانی مفید است که نمی‌دانید کاربر چند آرگومان قرار است وارد کند یا می‌خواهید تابع شما انعطاف‌پذیر باشد.

آرگومان‌های کلیدواژه‌ای متغیر (**kwargs)

پارامتری که با دو ستاره (**) شروع می‌شود (طبق قرارداد **kwargs)، تمام آرگومان‌های کلیدواژه‌ای اضافی را در قالب یک دیکشنری جمع‌آوری می‌کند.

Copy Icon PYTHON
def build_profile(first, last, **user_info):
    """Build a dictionary containing everything we know about a user."""
    user_info['first_name'] = first
    user_info['last_name'] = last
    return user_info

user_profile = build_profile('albert', 'einstein', location='princeton', field='physics')
print(user_profile)

در این کد، تابع build_profile دو پارامتر اجباری first و last دارد و هر تعداد آرگومان کلیدواژه‌ای اضافی را به صورت یک دیکشنری در user_info جمع‌آوری می‌کند. این روش زمانی مفید است که بخواهید اطلاعات بیشتری را به صورت پویا به تابع ارسال کنید، بدون اینکه از قبل پارامترهای آن را مشخص کرده باشید.

در این درس با روش‌های مختلف و انعطاف‌پذیر ارسال آرگومان به توابع در پایتون آشنا شدیم. دیدیم که چگونه می‌توان با استفاده از آرگومان‌های موقعیتی، کلیدواژه‌ای، مقادیر پیش‌فرض و لیست‌های متغیر، توابعی خوانا و قدرتمند طراحی کرد.