استفاده از آرگومان های اختیاری توابع پایتون

امیرحسین بیگدلو 4 ماه قبل

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

ویدیو پیشنهادی: ویدیو آموزش function در پایتون

 

# ایجاد فانکشن در پایتون برای استفاده مجدد از کد

شما می توانید یک فانکشن را به عنوان یک برنامه کوچک در نظر بگیرید که در یک برنامه دیگر یا در یک تابع دیگر اجرا می شود. برنامه اصلی مینی برنامه را فراخوانی می کند و اطلاعاتی را که مینی برنامه در حین اجرا به آن نیاز دارد ارسال می کند. هنگامی که تابع تمام اقدامات خود را انجام می دهد، ممکن است برخی از داده ها را به برنامه اصلی که آن را فراخوانی کرده است، ارسال کند.

 

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

 

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

 

در پایتون، طبق قرارداد، باید یک تابع را با استفاده از حروف کوچک با کلماتی که با یک underscore جدا شده اند، نامگذاری کنید ، مانند do_something(). این قراردادها در PEP 8، که راهنمای سبک پایتون است، توضیح داده شده است. هنگام فراخوانی تابع، باید پرانتز را بعد از نام آن اضافه کنید. از آنجا که توابع نشان دهنده عملکردها هستند، بهتر است نام تابع خود را با یک فعل شروع کنید تا کد شما بیشتر خوانا شود.

 

 

+ تعریف توابع بدون پارامترهای ورودی

در این آموزش، شما از یک برنامه پایه استفاده می کنید که یک لیست خرید ایجاد و نگهداری می کند و هنگامی که آماده رفتن به سوپر مارکت هستید ، آن را چاپ می کند.

 

با ایجاد یک لیست خرید شروع کنید:

shopping_list = {
    "Bread": 1,
    "Milk": 2,
    "Chocolate": 1,
    "Butter": 1,
    "Coffee": 1,
}

 

ویدیو پیشنهادی: توضیح dictionary در پایتون

شما از یک دیکشنری برای ذخیره نام محصول به عنوان کلید، تعداد محصول به عنوان مقدار استفاده میکنید. برای نمایش لیست خرید می توانید یک تابع تعریف کنید:

# optional_params.py

shopping_list = {
    "Bread": 1,
    "Milk": 2,
    "Chocolate": 1,
    "Butter": 1,
    "Coffee": 1,
}

def show_list():
    for item_name, quantity in shopping_list.items():
        print(f"{quantity}x {item_name}")

show_list()

 

هنگامی که این اسکریپت را اجرا می کنید ، لیست خرید را چاپ می کنید:

$ python optional_params.py
1x Bread
2x Milk
1x Chocolate
1x Butter
1x Coffee

 

تابعی که تعریف کرده اید هیچ پارامتر ورودی ندارد زیرا پرانتز موجود در امضای تابع خالی است. امضا اولین خط در تعریف تابع است:

def show_list():

 

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

ویدیو پیشنهادی: توضیح محدوده در پایتون

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

 

 

+ تعریف توابع با استدلال های ورودی مورد نیاز

به جای نوشتن لیست خرید به طور مستقیم در کد، اکنون می توانید یک دیکشنری خالی را تنظیم کرده و تابعی بنویسید که به شما امکان می دهد محصولات را به لیست خرید اضافه کنید:

# optional_params.py

shopping_list = {}

# ...

def add_item(item_name, quantity):
    if item_name in shopping_list.keys():
        shopping_list[item_name] += quantity
    else:
        shopping_list[item_name] = quantity

add_item("Bread", 1)
print(shopping_list)

 

تابع در کلیدهای دیکشنری میچرخد و در صورت وجود محصول، مقدار افزایش می یابد. اگر محصول در یکی از کلیدها نباشد، کلید ایجاد می شود و مقدار 1 به آن اختصاص داده می شود. برای نمایش دیکشنری چاپ شده می توانید این اسکریپت را اجرا کنید:

$ python optional_params.py
{'Bread': 1}

 

شما دو پارامتر در امضای تابع گنجانده اید:

1. item_name
2. quantity

 

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

 

تمایز بین پارامترها و آرگومان ها را اغلب می توان نادیده گرفت. این تفاوت ظریف اما مهم است. گاهی اوقات ممکن است پارامترها به نام پارامترهای رسمی و آرگومان ها به عنوان پارامترهای واقعی شناخته شوند.

 

آرگومان هایی که هنگام فراخوانی add_item () وارد می کنید، آرگومان های مورد نیاز است. اگر سعی کنید تابع را بدون آرگومان فراخوانی کنید ، خطایی دریافت خواهید کرد:

# optional_params.py

shopping_list = {}

def add_item(item_name, quantity):
    if item_name in shopping_list.keys():
        shopping_list[item_name] += quantity
    else:
        shopping_list[item_name] = quantity

add_item()
print(shopping_list)

 

traceback یک TypeError می دهد که نشان می دهد آرگومان مورد نیاز است:

$ python optional_params.py
Traceback (most recent call last):
  File "optional_params.py", line 11, in <module>
    add_item()
TypeError: add_item() missing 2 required positional arguments: 'item_name' and 'quantity'

 

شما در بخش بعدی این آموزش، پیامهای خطای بیشتری را در رابطه با استفاده از تعداد اشتباه آرگومان ها یا استفاده از آنها به ترتیب اشتباه مشاهده خواهید کرد.

ویدیو پیشنهادی: آموزش cause و context در پایتون

 

# استفاده از آرگومان‌های اختیاری پایتون با مقادیر پیش فرض

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

 

 

+ مقادیر پیش فرض اختصاص داده شده پارامترهای ورودی

می توانید تابع add_item () را تغییر دهید تا مقدار پارامتر دارای مقدار پیش فرض باشد:

# optional_params.py

shopping_list = {}

def add_item(item_name, quantity=1):
    if item_name in shopping_list.keys():
        shopping_list[item_name] += quantity
    else:
        shopping_list[item_name] = quantity

add_item("Bread")
add_item("Milk", 2)
print(shopping_list)

 

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

 

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

 

تابع add_item () اکنون دارای یک پارامتر اجباری و یک پارامتر اختیاری است. در مثال کد بالا، دوبار add_item () را فرا می گیرید. اولین فراخوانی تابع شما دارای یک آرگومان واحد است که مربوط به پارامتر item_name است. در این مورد، مقدار quantity به طور پیش فرض به 1 می رسد. فراخوانی تابع دوم شما دو آرگومان دارد، بنابراین مقدار پیش فرض در این مورد استفاده نمی شود. خروجی این را می توانید در زیر مشاهده کنید:

$ python optional_params.py
{'Bread': 1, 'Milk': 2}

 

همچنین می توانید آرگومان های اجباری و اختیاری را به عنوان آرگومان کلمه کلیدی(keyword arguments) به یک تابع منتقل کنید. آرگومان های کلیدی را می توان به عنوان named arguments نیز نام برد:

add_item(item_name="Milk", quantity=2)

 

اکنون می توانید اولین فانکشنی که در این آموزش تعریف کرده اید را مجدداً ملاحظه کرده و آن را دوباره تنظیم کنید تا آرگومان پیش فرض را نیز بپذیرد:

def show_list(include_quantities=True):
    for item_name, quantity in shopping_list.items():
        if include_quantities:
            print(f"{quantity}x {item_name}")
        else:
            print(item_name)

 

حالا وقتی از show_list() استفاده می کنید، می توانید آن را بدون آرگومان ورودی فراخوانی کنید یا مقدار Boolean را به عنوان flag argument ارسال کنید. اگر هنگام فراخوانی تابع هیچ گونه آرگومان را وارد نکنید، لیست خرید با نشان دادن نام و مقدار هر مورد نمایش داده می شود. اگر True را به عنوان آرگومان هنگام فراخوانی تابع وارد کنید، تابع همان خروجی را نشان می دهد. با این حال، اگر از show_list (False) استفاده می کنید ، فقط نام موارد نمایش داده می شود.

 

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

 

 

+ مقادیر پیش فرض متداول آرگومان

در مثالهایی که در بالا کار کردید، از یک عدد صحیح 1 به عنوان مقدار پیش فرض در یک مورد و مقدار بولی True در مورد دیگر استفاده کردید. اینها مقادیر پیش فرض متداول هستند که در تعاریف فانکشن پیدا می کنید. با این حال، نوع داده ای که باید برای مقادیر پیش فرض استفاده کنید بستگی به عملکردی دارد که تعریف کرده اید و نحوه استفاده از آن را می خواهید.

 

اعداد صحیح 0 و 1 مقادیر پیش فرض متداول هستند که برای استفاده از مقدار یک پارامتر باید یک عدد صحیح باشد. این به این دلیل است که 0 و 1 اغلب مقادیر جایگزین مفیدی هستند. در تابع add_item () که قبلاً نوشتید، تنظیم quantity برای یک مورد جدید بر روی 1 منطقی ترین گزینه است.

 

با این حال ، اگر عادت داشتید وقتی به سوپرمارکت می روید دو مورد از هر چیزی را که خریداری می کنید بخرید، ممکن است تعیین مقدار پیش فرض روی 2 برای شما مناسب تر باشد.

 

وقتی پارامتر ورودی باید یک رشته باشد، یک مقدار پیش فرض رایج برای استفاده، رشته خالی ("") است. این مقداری را اختصاص می دهد که نوع داده آن رشته است اما هیچ کاراکتر اضافی وارد نمی کند. می توانید add_item () را تغییر دهید تا هر دو آرگومان اختیاری باشند:

def add_item(item_name="", quantity=1):
    if item_name in shopping_list.keys():
        shopping_list[item_name] += quantity
    else:
        shopping_list[item_name] = quantity

 

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

add_item()

 

این خط کد یک آیتم را به دیکشنری shopping_list اضافه می کند که یک رشته خالی به عنوان کلید و مقدار 1 دارد. معمولاً بررسی اینکه آیا هنگام فراخوانی تابع یک آرگومان آمده است یا خیر، متناسب با آن انجام می شود. برای این کار می توانید تابع بالا را تغییر دهید:

def add_item(item_name="", quantity=1):
    if not item_name:
        quantity = 0
    if item_name in shopping_list.keys():
        shopping_list[item_name] += quantity
    else:
        shopping_list[item_name] = quantity

 

در این نسخه، اگر هیچ موردی به تابع منتقل نشود، تابع مقدار را روی 0 تنظیم می کند. رشته خالی دارای مقدار غلط است، به این معنی که bool ("") False را برمی گرداند، در حالی که هر رشته دیگر دارای مقدار true می باشد. وقتی یک کلمه کلیدی if دارای مقدار درست یا غلط باشد، عبارت if آنها را به عنوان درست یا غلط تفسیر می کند.

 

بنابراین، می توانید از متغیر مستقیماً در دستور if استفاده کنید تا بررسی کنید که آیا از آرگومان اختیاری استفاده شده است یا خیر.

 

یک مقدار رایج دیگر که اغلب به عنوان مقدار پیش فرض مورد استفاده قرار می گیرد None است. این روش پایتون برای نشان دادن هیچ چیز است، اگرچه در واقع یک شی است که مقدار null را نشان می دهد. در قسمت بعدی نمونه ای از مواردی را که None برای پیش فرض مفید است مشاهده خواهید کرد.

 

 

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

در مثالهای بالا از اعداد صحیح و رشته ها به عنوان مقادیر پیش فرض استفاده کرده اید ، و None مقدار پیش فرض رایج دیگری است. اینها تنها انواع داده نیستند که می توانید از آنها به عنوان مقادیر پیش فرض استفاده کنید. با این حال ، همه انواع داده ها نباید استفاده شوند.

ویدیو پیشنهادی: ویدیو استفاده از آبجکت های mutable به عنوان مقدار پیشفرض آرگومان ها در پایتون

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

 

شما می توانید دیکشنری حاوی نام اقلام و مقادیر را به عنوان پارامتر ورودی به عملکردی که قبلاً تعریف کرده اید اضافه کنید. می توانید با آرگومان های مورد نیاز شروع کنید:

def add_item(item_name, quantity, shopping_list):
    if item_name in shopping_list.keys():
        shopping_list[item_name] += quantity
    else:
        shopping_list[item_name] = quantity

    return shopping_list

 

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

 

شما همچنین عبارت return را برای برگرداندن dictionary اصلاح شده اضافه کرده اید. این خط از نظر فنی در این مرحله مورد نیاز نیست زیرا دیکشنری‌ها یک نوع داده قابل تغییر هستند و بنابراین تابع وضعیت دیکشنری موجود در ماژول اصلی را تغییر می دهد. با این حال ، وقتی این آرگومان را اختیاری می کنید ، بعداً به عبارت return نیاز خواهید داشت، بنابراین بهتر است آن را هم اکنون وارد کنید.

 

برای فراخوانی تابع ، باید داده های برگشت داده شده توسط تابع را به یک متغیر اختصاص دهید:

shopping_list = add_item("Coffee", 2, shopping_list)

 

همچنین می توانید یک پارامتر shopping_list را به show_list() اضافه کنید، اولین فانکشنی که در این آموزش تعریف کردید. اکنون می توانید چندین لیست خرید در برنامه خود داشته باشید و از عملکردهای یکسان برای افزودن موارد و نمایش لیست خرید استفاده کنید:

# optional_params.py

hardware_store_list = {}
supermarket_list = {}

def show_list(shopping_list, include_quantities=True):
    print()
    for item_name, quantity in shopping_list.items():
        if include_quantities:
            print(f"{quantity}x {item_name}")
        else:
            print(item_name)

def add_item(item_name, quantity, shopping_list):
    if item_name in shopping_list.keys():
        shopping_list[item_name] += quantity
    else:
        shopping_list[item_name] = quantity

    return shopping_list

hardware_store_list = add_item("Nails", 1, hardware_store_list)
hardware_store_list = add_item("Screwdriver", 1, hardware_store_list)
hardware_store_list = add_item("Glue", 3, hardware_store_list)

supermarket_list = add_item("Bread", 1, supermarket_list)
supermarket_list = add_item("Milk", 2, supermarket_list)

show_list(hardware_store_list)
show_list(supermarket_list)

 

خروجی این کد را در زیر مشاهده می کنید. ابتدا لیست مواردی که باید از فروشگاه سخت افزار خریداری شود نشان داده می شود. قسمت دوم خروجی موارد مورد نیاز از سوپر مارکت را نشان می دهد:

$ python optional_params.py

1x Nails
1x Screwdriver
3x Glue

1x Bread
2x Milk

 

اکنون یک مقدار پیش فرض برای پارامتر shopping_list در add_item () اضافه می کنید تا اگر هیچ دیکشنری به تابع منتقل نشد ، از یک دیکشنری خالی استفاده شود. وسوسه انگیزترین گزینه این است که مقدار پیش فرض را یک دیکشنری خالی قرار دهید. خواهید دید چرا این ایده خوبی نیست ، اما می توانید این گزینه را فعلاً امتحان کنید:

# optional_params.py

def show_list(shopping_list, include_quantities=True):
    print()
    for item_name, quantity in shopping_list.items():
        if include_quantities:
            print(f"{quantity}x {item_name}")
        else:
            print(item_name)

def add_item(item_name, quantity, shopping_list={}):
    if item_name in shopping_list.keys():
        shopping_list[item_name] += quantity
    else:
        shopping_list[item_name] = quantity

    return shopping_list

clothes_shop_list = add_item("Shirt", 3)
show_list(clothes_shop_list)

 

هنگامی که این اسکریپت را اجرا می کنید، خروجی زیر را نشان می دهد که موارد مورد نیاز از مغازه لباس را نشان می دهد، که ممکن است این تصور را ایجاد کند که این کد مطابق برنامه مورد نظر کار می کند:

$ python optional_params.py

3x Shirt

 

با این حال، این کد دارای نقص جدی است که می تواند منجر به نتایج غیر منتظره و اشتباه شود. با استفاده از add_item () بدون آرگومان مربوط به shopping_list، می توانید یک لیست خرید جدید برای اقلام مورد نیاز از فروشگاه لوازم الکترونیکی اضافه کنید. این منجر به استفاده از مقدار پیش فرض می شود، که امیدوارید یک دیکشنری خالی جدید ایجاد کند:

# optional_params.py

def show_list(shopping_list, include_quantities=True):
    print()
    for item_name, quantity in shopping_list.items():
        if include_quantities:
            print(f"{quantity}x {item_name}")
        else:
            print(item_name)

def add_item(item_name, quantity, shopping_list={}):
    if item_name in shopping_list.keys():
        shopping_list[item_name] += quantity
    else:
        shopping_list[item_name] = quantity

    return shopping_list

clothes_shop_list = add_item("Shirt", 3)
electronics_store_list = add_item("USB cable", 1)
show_list(clothes_shop_list)
show_list(electronics_store_list)

 

وقتی به خروجی این کد نگاه کنید ، مشکل را خواهید دید:

$ python optional_params.py

3x Shirt
1x USB cable

3x Shirt
1x USB cable

 

هر دو لیست خرید یکسان هستند حتی اگر خروجی add_item () را به متغیرهای مختلف در هر بار فراخوانی تابع اختصاص داده اید. مشکل به این دلیل رخ می دهد که دیکشنری‌ها یک نوع داده تغییرپذیر هستند.

 

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

 

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

 

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

# optional_params.py

def show_list(shopping_list, include_quantities=True):
    print()
    for item_name, quantity in shopping_list.items():
        if include_quantities:
            print(f"{quantity}x {item_name}")
        else:
            print(item_name)

def add_item(item_name, quantity, shopping_list=None):
    if shopping_list is None:
        shopping_list = {}
    if item_name in shopping_list.keys():
        shopping_list[item_name] += quantity
    else:
        shopping_list[item_name] = quantity

    return shopping_list

clothes_shop_list = add_item("Shirt", 3)
electronics_store_list = add_item("USB cable", 1)
show_list(clothes_shop_list)
show_list(electronics_store_list)

 

با استفاده از عبارت if می توانید بررسی کنید که آیا دیکشنری به عنوان آرگومان منتقل شده است یا خیر. شما نباید به ماهیت نادرست None اعتماد کنید ، بلکه باید صراحتا بررسی کنید که آرگومان None است. اعتقاد به اینکه با آرگومان None به شکل False رفتار میشود میتواند مشکل آفرین باشد.

 

اکنون که اسکریپت خود را دوباره اجرا می کنید، خروجی صحیح را دریافت خواهید کرد زیرا هر بار که از تابع با مقدار پیش فرض برای لیست خرید استفاده می کنید ، یک دیکشنری جدید ایجاد می شود:

$ python optional_params.py

3x Shirt

1x USB cable

 

هنگام تعریف یک تابع با پارامترهای اختیاری، همیشه باید از استفاده از یک نوع داده تغییرپذیر به عنوان مقدار پیش فرض خودداری کنید.

 

 

+ پیام های خطا مربوط به استدلال های ورودی

یکی از رایج ترین پیام های خطا که با آن مواجه می شوید این است که یک تابع را که دارای آرگومان است فرا می خوانید، اما آرگومان ها را در فراخوانی تابع ارسال نمی کنید:

# optional_params.py

# ...

def add_item(item_name, quantity, shopping_list=None):
    if shopping_list is None:
        shopping_list = {}
    if item_name in shopping_list.keys():
        shopping_list[item_name] += quantity
    else:
        shopping_list[item_name] = quantity

    return shopping_list

add_item()

ویدیو پیشنهادی: توضیح مدیریت خطاها در پایتون

در اینجا، شما add_item () را بدون فرستادن آرگومان های مورد نیاز item_name و quantity فراخوانی می کنید. هر زمان که یک آرگومان مورد نیاز وجود نداشته باشد ، یک TypeError دریافت خواهید کرد:

$ python optional_params.py
  File "optional_params.py", line 15
    add_item()
TypeError: add_item() missing 2 required positional arguments: 'item_name' and 'quantity'

 

پیام خطا در این مورد مفید است. پیام های خطا همیشه به اندازه این پیام مفید نیستند. با این حال، از دست دادن پارامترهای مورد نیاز تنها پیام خطایی نیست که هنگام یادگیری تعریف توابع با پارامترهای مورد نیاز و اختیاری با آن مواجه می شوید.

 

هنگامی که هیچ یک از پارامترهای تابع دارای مقادیر پیش فرض نیستند، می توانید پارامترها را به هر ترتیبی که می خواهید ارسال کنید. وقتی همه پارامترها دارای مقادیر پیش فرض هستند، همین امر صدق می کند. با این حال، هنگامی که برخی از پارامترها با مقادیر پیش فرض و برخی دیگر بدون مقدار هستند، ترتیب تعیین پارامترها مهم است.

 

می توانید سعی کنید ترتیب پارامترها را با و بدون مقادیر پیش فرض در تعریف add_item () عوض کنید:

# optional_params.py

# ...

def add_item(shopping_list=None, item_name, quantity):
    if shopping_list is None:
        shopping_list = {}
    if item_name in shopping_list.keys():
        shopping_list[item_name] += quantity
    else:
        shopping_list[item_name] = quantity

    return shopping_list

 

پیام خطایی که هنگام اجرای این کد دریافت خواهید کرد ، قانون را کاملاً واضح توضیح می دهد:

$ python optional_params.py
  File "optional_params.py", line 5
    def add_item(shopping_list=None, item_name, quantity):
                                                ^
SyntaxError: non-default argument follows default argument

 

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

 

 

# نتیجه گیری

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

 

اگر مقاله بالا را دوست داشتید، پیشنهاد میکنیم به مطالب زیر هم سر بزنید:

با پایتون چه کارهایی میتوان کرد؟

آینده پایتون

ویدیو آموزش ماژول pdb در پایتون

دوره آموزش GraphQL در پایتون

آموزش کار با api در پایتون

مطالب مشابه



مونگارد