مقدمه

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

برگرداندن یک مقدار ساده

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

Copy Icon PYTHON
def get_formatted_name(first_name, last_name):
    """Return a full name, neatly formatted."""
    full_name = f"{first_name} {last_name}"
    return full_name.title()

musician = get_formatted_name('jimi', 'hendrix')
print(musician)

در این مثال، تابع get_formatted_name نام و نام خانوادگی را گرفته، آنها را با هم ترکیب کرده و با استفاده از متد title() به صورت مرتب شده (با حروف بزرگ در ابتدای هر کلمه) برمی‌گرداند.

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

اختیاری کردن آرگومان‌ها

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

Copy Icon PYTHON
def get_formatted_name(first_name, last_name, middle_name=''):
    """Return a full name, neatly formatted."""
    if middle_name:
        full_name = f"{first_name} {middle_name} {last_name}"
    else:
        full_name = f"{first_name} {last_name}"
    return full_name.title()

musician = get_formatted_name('jimi', 'hendrix')
print(musician)

musician = get_formatted_name('john', 'hooker', 'lee')
print(musician)

در این نسخه بهبودیافته، پارامتر middle_name یک مقدار پیش‌فرض رشته خالی دارد. در داخل تابع، ما بررسی می‌کنیم که آیا این پارامتر مقداری دارد یا خیر (یک رشته خالی در پایتون به عنوان False ارزیابی می‌شود). اگر مقدار داشته باشد، نام میانی را نیز در خروجی لحاظ می‌کنیم.

این کار به تابع ما انعطاف‌پذیری بیشتری می‌دهد و به ما اجازه می‌دهد تا با یک تابع واحد، هر دو حالت (نام‌های دوقسمتی و سه‌قسمتی) را مدیریت کنیم.

برگرداندن یک دیکشنری

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

Copy Icon PYTHON
def build_person(first_name, last_name, age=None):
    """Return a dictionary of information about a person."""
    person = {'first': first_name, 'last': last_name}
    if age:
        person['age'] = age
    return person

musician = build_person('jimi', 'hendrix', age=27)
print(musician)

این تابع اطلاعات یک شخص را گرفته و آنها را در قالب یک دیکشنری برمی‌گرداند. ما همچنین یک پارامتر اختیاری age با مقدار پیش‌فرض None داریم. None یک مقدار ویژه در پایتون است که برای نمایش «عدم وجود مقدار» به کار می‌رود.

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

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