نحوه استفاده و یادداشت آرگومان های پیش فرض در توابع پایتون

کسب و کار

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

جزئیات زیر در زیر توضیح داده شده است.

  • تنظیم آرگومان های پیش فرض
  • محدودیت در موقعیت آرگومان های پیش فرض
  • توجه داشته باشید که وقتی یک لیست یا فرهنگ لغت به عنوان مقدار پیش فرض استفاده می شود

تنظیم آرگومان های پیش فرض

اگر نام آرگومان = مقدار پیش فرض در تعریف تابع باشد، زمانی که آرگومان مربوطه حذف شود از مقدار پیش فرض استفاده می شود.

def func_default(arg1, arg2='default_x', arg3='default_y'):
    print(arg1)
    print(arg2)
    print(arg3)

func_default('a')
# a
# default_x
# default_y

func_default('a', 'b')
# a
# b
# default_y

func_default('a', arg3='c')
# a
# default_x
# c

محدودیت در موقعیت آرگومان های پیش فرض

قرار دادن یک آرگومان پیش فرض قبل از یک آرگومان معمولی (آگومانی که هیچ مقدار پیش فرضی برای آن مشخص نشده است) هنگام تعریف یک تابع منجر به خطا می شود.
SyntaxError

# def func_default_error(arg2='default_a', arg3='default_b', arg1):
#     print(arg1)
#     print(arg2)

# SyntaxError: non-default argument follows default argument

توجه داشته باشید که وقتی یک لیست یا فرهنگ لغت به عنوان مقدار پیش فرض استفاده می شود

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

زمانی که تعریف تابع اجرا می شود مقادیر آرگومان پیش فرض از چپ به راست ارزیابی می شوند. این بدان معناست که بیان آرگومان پیش‌فرض زمانی که تابع تعریف می‌شود تنها یک بار ارزیابی می‌شود و برای هر فراخوانی از همان مقدار «محاسبه‌شده» استفاده می‌شود.
8.7. Function definitions — Python 3.10.2 Documentation

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

مثال برای یک فهرست

def func_default_list(l=[0, 1, 2], v=3):
    l.append(v)
    print(l)

func_default_list([0, 0, 0], 100)
# [0, 0, 0, 100]

func_default_list()
# [0, 1, 2, 3]

func_default_list()
# [0, 1, 2, 3, 3]

func_default_list()
# [0, 1, 2, 3, 3, 3]

مثال برای دیکشنری

def func_default_dict(d={'default': 0}, k='new', v=100):
    d[k] = v
    print(d)

func_default_dict()
# {'default': 0, 'new': 100}

func_default_dict(k='new2', v=200)
# {'default': 0, 'new': 100, 'new2': 200}

هر بار که تابع فراخوانی می شود یک شی جدید ایجاد می شود.

def func_default_list_none(l=None, v=3):
    if l is None:
        l = [0, 1, 2]
    l.append(v)
    print(l)

func_default_list_none()
# [0, 1, 2, 3]

func_default_list_none()
# [0, 1, 2, 3]