مقدمه

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

Copy Icon PYTHON
def greet_users(names):
    """Print a simple greeting to each user in the list."""
    for name in names:
        msg = f"Hello, {name.title()}!"
        print(msg)

usernames = ['hannah', 'ty', 'margot']
greet_users(usernames)

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

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

تغییر دادن یک لیست در یک تابع

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

بیایید یک مثال را بررسی کنیم. فرض کنید یک شرکت چاپ داریم که باید طرح‌های ارسالی را چاپ کرده و آنها را به یک لیست از مدل‌های تکمیل‌شده منتقل کند.

Copy Icon PYTHON
def print_models(unprinted_designs, completed_models):
    """
    Simulate printing each design, until none are left.
    Move each design to completed_models after printing.
    """
    while unprinted_designs:
        current_design = unprinted_designs.pop()
        print(f"Printing model: {current_design}")
        completed_models.append(current_design)

def show_completed_models(completed_models):
    """Show all the models that were printed."""
    print("\nThe following models have been printed:")
    for completed_model in completed_models:
        print(completed_model)

unprinted_designs = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []

print_models(unprinted_designs, completed_models)
show_completed_models(completed_models)

print("\nOriginal list after function call:")
print(unprinted_designs)

در این کد، تابع print_models دو لیست را به عنوان ورودی می‌گیرد. این تابع با استفاده از یک حلقه while و متد pop()، طرح‌ها را یکی‌یکی از لیست unprinted_designs حذف کرده و به لیست completed_models اضافه می‌کند.

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

جلوگیری از تغییر لیست

اگر نمی‌خواهید یک تابع، لیست اصلی شما را تغییر دهد، می‌توانید یک کپی از لیست را به آن پاس دهید. برای ایجاد یک کپی از یک لیست، می‌توانید از سینتکس اسلایس [:] استفاده کنید.

Copy Icon PYTHON
# Call the function with a copy of the list
print_models(unprinted_designs[:], completed_models)

print("\nOriginal list after sending a copy:")
print(unprinted_designs) # The original list remains unchanged

با ارسال unprinted_designs[:]، ما یک کپی از لیست اصلی را به تابع می‌دهیم. اکنون تابع print_models روی این کپی کار می‌کند و لیست اصلی دست‌نخورده باقی می‌ماند.

در این درس، با نحوه تعامل توابع با لیست‌ها آشنا شدیم. دیدیم که چگونه پاس دادن یک لیست به یک تابع به ما اجازه می‌دهد تا به صورت کارآمد روی آن کار کنیم و چگونه می‌توان با ارسال یک کپی از لیست، از تغییرات ناخواسته جلوگیری کرد. در درس بعدی، به بررسی «پاس کردن تعداد دلخواهی از آرگومان‌ها» خواهیم پرداخت و با *args و **kwargs بیشتر آشنا خواهیم شد.