مقدمه

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

جمع‌آوری آرگومان‌های موقعیتی با *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(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

در این مثال، تابع make_pizza یک آرگومان موقعیتی برای size و سپس پارامتر *toppings را می‌پذیرد.

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

جمع‌آوری آرگومان‌های کلیدواژه‌ای با **kwargs

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

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 را می‌پذیرد.

هنگام فراخوانی، دو آرگومان آخر (location و field) به عنوان زوج‌های کلید-مقدار در دیکشنری خالی user_info قرار می‌گیرند. سپس ما نام و نام خانوادگی را نیز به این دیکشنری اضافه کرده و آن را برمی‌گردانیم. خروجی این کد یک دیکشنری کامل از اطلاعات کاربر خواهد بود.

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