توابع در پایتون

اگر هنگام برنامه‌نویسی مجبور شوید یک قطعه کد را بارها تکرار کنید، برنامه شما طولانی، شلوغ و نگهداری آن سخت خواهد شد. تابع (Function) راه‌حلی برای این مشکل است. 

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

فهرست مطالب

تابع چیست؟

تابع یک بلوک از کد است که:

  • یک وظیفه مشخص دارد.
  • هر تعداد بار قابل استفاده است.
  • باعث جلوگیری از تکرار کد می‌شود.
  • برنامه را خواناتر و منظم‌تر می‌کند.

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

چرا از تابع استفاده می‌کنیم؟

استفاده از توابع مزایای زیادی دارد:

  • کاهش تکرار کد
  • خوانایی بیشتر برنامه
  • اشکال‌زدایی آسان‌تر
  • توسعه و نگهداری ساده‌تر
  • امکان استفاده مجدد از کد
  • تقسیم برنامه‌های بزرگ به بخش‌های کوچک‌تر

به همین دلیل تقریباً تمام پروژه‌های حرفه‌ای پایتون بر پایه توابع نوشته می‌شوند.

تعریف تابع در پایتون

برای ساخت تابع از کلمه کلیدی def استفاده می‌شود. ساختار کلی:

def function_name():
    دستورها

مثال:

def hello():
    print("Hello Python")

این کد فقط تابع را تعریف می‌کند و هنوز اجرا نشده است.

فراخوانی تابع

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

hello()

خروجی:

Hello Python

پارامتر (Parameter) و آرگومان (Argument)

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

  • پارامتر (Parameter) متغیری است که هنگام تعریف تابع نوشته می‌شود.
  • آرگومان (Argument) مقداری است که هنگام فراخوانی تابع به آن ارسال می‌کنیم.

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

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

def welcome(name):
    print("Welcome", name)

welcome("Ali")

خروجی:

Welcome Ali

در این مثال: name یک پارامتر است. و "Ali" یک آرگومان است.

ارسال آرگومان‌های مختلف

یک تابع را می‌توان با مقادیر متفاوت فراخوانی کرد.

def welcome(name):
    print("Welcome", name)

welcome("Ali")
welcome("Sara")
welcome("Reza")

خروجی:

Welcome Ali
Welcome Sara
Welcome Reza

همین موضوع یکی از مهم‌ترین مزیت‌های توابع است؛ یک بار تابع را می‌نویسیم اما بارها با داده‌های مختلف از آن استفاده می‌کنیم.

تابع با چند پارامتر

یک تابع می‌تواند بیش از یک پارامتر داشته باشد.

def student(name, age):
    print(name, "is", age, "years old")

student("Sara", 18)

خروجی:

Sara is 18 years old

در این مثال: name پارامتر اول و age پارامتر دوم است. "Sara" و 18 نیز آرگومان‌هایی هستند که هنگام فراخوانی ارسال شده‌اند.

ترتیب آرگومان‌ها مهم است

آرگومان‌ها به ترتیب به پارامترها اختصاص داده می‌شوند.

def person(name, age):
    print(name, age)

person("Ali", 20)

خروجی:

Ali 20

اما اگر جای آن‌ها را عوض کنیم:

person(20, "Ali")

خروجی:

20 Ali
پایتون فقط بر اساس ترتیب مقادیر را به پارامترها اختصاص می‌دهد.
تعداد آرگومان‌ها باید درست باشد

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

def add(a, b):
    print(a + b)

add(10)

خروجی:

TypeError: add() missing 1 required positional argument: 'b'

مثال : تابعی بنویسیم که قیمت کالا و تعداد آن را دریافت کرده و مبلغ کل را محاسبه کند.

پارامترهای دارای مقدار پیش‌فرض (Default Parameters)

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

def function_name(parameter=value):
    دستورات

در مثال زیر، اگر نامی برای تابع ارسال نشود، مقدار "Guest" به صورت خودکار استفاده می‌شود.

def welcome(name="Guest"):
    print("Welcome", name)

welcome()
welcome("Sara")

خروجی:

Welcome Guest
Welcome Sara

در فراخوانی اول هیچ آرگومانی ارسال نشده است، بنابراین مقدار پیش‌فرض (Guest) استفاده می‌شود. اما در فراخوانی دوم مقدار "Sara" جایگزین مقدار پیش‌فرض شده است.

مثال : فرض کنید هزینه ارسال کالا به طور پیش‌فرض 500 دلار است، اما در برخی سفارش‌ها مقدار دیگری دارد.

چند پارامتر با مقدار پیش‌فرض

می‌توان چندین پارامتر را دارای مقدار پیش‌فرض قرار داد.

def student(name, age=18, city="Tehran"):
    print(name, age, city)

student("Ali")
student("Sara", 20)
student("Reza", 22, "Shiraz")

خروجی:

Ali 18 Tehran
Sara 20 Tehran
Reza 22 Shiraz
یک نکته مهم

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

def func(name, age=18):
    pass

اما این کد نادرست است و با خطای نحوی (SyntaxError) مواجه می‌شود.

def func(age=18, name):
    pass

آرگومان‌های نام‌دار (Keyword Arguments)

در مثال‌های قبلی، آرگومان‌ها را فقط بر اساس ترتیب ارسال می‌کردیم.

student("Sara", 20)

اما در پایتون می‌توان نام پارامتر را نیز هنگام فراخوانی نوشت. به این روش آرگومان نام‌دار یا Keyword Argument گفته می‌شود.

def student(name, age):
    print(name, age)

student(age=20, name="Sara")

خروجی:

Sara 20

مشاهده می‌کنید که با وجود تغییر ترتیب، نتیجه صحیح است؛ زیرا پایتون مقادیر را بر اساس نام پارامترها تطبیق می‌دهد.

مزایای آرگومان‌های نام‌دار

  • خوانایی بیشتر کد
  • جلوگیری از اشتباه در ترتیب آرگومان‌ها
  • مناسب برای توابعی که پارامترهای زیادی دارند

دستور return در پایتون

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

ساختار کلی :

def function_name():
    ...
    return value
مثال اول : تابعی بنویسیم که مجموع دو عدد را برگرداند.
 
def add(a, b):
    return a + b

result = add(10, 20)

print(result)

خروجی:

30

در این مثال: تابع مقدار 30 را برگردانده است. مقدار بازگشتی داخل متغیر result ذخیره شده است. سپس مقدار آن چاپ شده است.

مثال دوم : مقدار بازگشتی را می‌توان مستقیماً استفاده کرد.

def square(number):
    return number * number

print(square(8))

خروجی:

64

استفاده از مقدار بازگشتی در محاسبات

یکی از مهم‌ترین مزایای return این است که خروجی تابع را می‌توان در عملیات دیگر به کار برد.

def add(a, b):
    return a + b

total = add(5, 8) * 2

print(total)

خروجی:

26

ابتدا تابع مقدار 13 را برگردانده و سپس در عدد ۲ ضرب شده است.

تفاوت print() و return

ویژگی print() return
هدف فقط نتیجه را روی صفحه نمایش می‌دهد. نتیجه را به محل فراخوانی تابع بازمی‌گرداند.
استفاده از نتیجه مقدار قابل استفاده‌ای تولید نمی‌کند. می‌توان مقدار را ذخیره یا در محاسبات بعدی استفاده کرد.
کاربرد بیشتر برای نمایش خروجی و اشکال‌زدایی استفاده می‌شود. برای نوشتن توابع کاربردی و حرفه‌ای استفاده می‌شود.

یک تابع می‌تواند چند مقدار برگرداند

در پایتون می‌توان با استفاده از تاپل، چند مقدار را هم‌زمان بازگرداند.

def calculate(a, b):
    return a + b, a * b

sum_result, product_result = calculate(4, 5)

print(sum_result)
print(product_result)

خروجی:

9
20

پایان اجرای تابع با return

به محض اینکه دستور return اجرا شود، اجرای تابع متوقف می‌شود و دستورات بعد از آن اجرا نخواهند شد.

def test():
    print("Start")
    return
    print("End")

test()

خروجی:

Start

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

نکته مهم

اگر در یک تابع از return استفاده نکنید، پایتون به‌صورت خودکار مقدار None را برمی‌گرداند.

def hello():
    print("Hello")

value = hello()

print(value)

خروجی:

Hello
None 

متغیرهای محلی (Local) و سراسری (Global) در پایتون

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

  • متغیر محلی (Local Variable)
  • متغیر سراسری (Global Variable)

متغیر محلی (Local Variable)

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

پس از پایان اجرای تابع، دیگر به این متغیر دسترسی نخواهید داشت.

مثال :

def student():
    name = "Sara"
    print(name)

student()

خروجی:

Sara

در این مثال، متغیر name فقط داخل تابع student() وجود دارد.

دسترسی خارج از تابع

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

def student():
    name = "Sara"
student()
print(name)

خروجی:

NameError: name 'name' is not defined

زیرا متغیر name فقط داخل تابع تعریف شده است.

متغیر سراسری (Global Variable)

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

مثال :

name = "Sara"

def student():
    print(name)

student()

print(name)

خروجی:

Sara
Sara

در این مثال، متغیر name خارج از تابع تعریف شده است؛ بنابراین هم داخل تابع و هم خارج از آن قابل استفاده است.

اگر داخل تابع متغیری هم‌نام تعریف کنیم چه می‌شود؟

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

name = "Ali"
def student(): name = "Sara" print(name) student() print(name)

خروجی:

Sara
Ali

در این مثال: داخل تابع مقدار "Sara" چاپ می‌شود. خارج از تابع همچنان مقدار "Ali" باقی می‌ماند. 

تغییر متغیر سراسری داخل تابع

به‌طور پیش‌فرض، نمی‌توان مقدار یک متغیر سراسری را داخل تابع تغییر داد. برای این کار باید از کلمه کلیدی global استفاده کرد.

count = 10

def increase():
    global count
    count += 1

increase()

print(count)

خروجی:

11

در این مثال، کلمه global به پایتون اعلام می‌کند که منظور از count همان متغیر سراسری است، نه یک متغیر جدید.

چه زمانی از global استفاده کنیم؟

استفاده از global امکان‌پذیر است، اما در بیشتر پروژه‌های حرفه‌ای توصیه نمی‌شود؛ زیرا تغییر متغیرهای سراسری از نقاط مختلف برنامه، پیدا کردن خطاها و نگهداری کد را دشوار می‌کند. در اغلب موارد، بهتر است داده‌ها را از طریق پارامترها به تابع ارسال کرده و با استفاده از return نتیجه را بازگردانید.

بهترین شیوه نام‌گذاری توابع در پایتون

انتخاب نام مناسب برای توابع باعث می‌شود کد خواناتر و درک آن برای دیگران و حتی خودتان در آینده آسان‌تر باشد. بهتر است هنگام نام‌گذاری توابع، نکات زیر را رعایت کنید:

  • از نام‌های معنادار استفاده کنید.
  • نام تابع بیان‌کننده کاری باشد که انجام می‌دهد.
  • برای جدا کردن کلمات از خط زیر (_) استفاده کنید.
  • از نام‌های کوتاه و نامفهوم مانند f() یا abc() پرهیز کنید.

توابع تو در تو (Nested Functions) در پایتون

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

مثال :

def outer():

    def inner():
        print("Hello Python")

    inner()

outer()

خروجی:

Hello Python

در این مثال:

  • تابع inner() داخل تابع outer() تعریف شده است.
  • تابع inner() فقط از داخل outer() قابل فراخوانی است.

دسترسی به تابع داخلی

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

def outer():

    def inner():
        print("Hello")

    inner()

inner()

خروجی:

NameError: name 'inner' is not defined

دلیل این خطا این است که تابع inner() فقط در محدوده تابع outer() شناخته می‌شود.

توابع بازگشتی (Recursive Functions) در پایتون

تابع بازگشتی یا Recursive Function تابعی است که در هنگام اجرا، خودش را فراخوانی می‌کند. این روش برای حل برخی مسائل که به بخش‌های کوچک‌تر تقسیم می‌شوند، کاربرد دارد. نکته مهم این است که هر تابع بازگشتی باید یک شرط پایان (Base Case) داشته باشد؛ در غیر این صورت، تابع بی‌نهایت بار اجرا شده و برنامه با خطا مواجه می‌شود.

مثال :

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

def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n - 1)

print(factorial(5))

خروجی:

120

در این مثال، تابع factorial() تا زمانی که مقدار n به ۱ برسد، خودش را دوباره فراخوانی می‌کند. سپس نتایج مرحله‌به‌مرحله محاسبه شده و مقدار نهایی بازگردانده می‌شود.

کاربرد توابع بازگشتی

از توابع بازگشتی در مسائلی مانند موارد زیر استفاده می‌شود:

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

توابع داخلی مهم (Built-in Functions) در پایتون

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

 
تابع کاربرد
print() نمایش خروجی روی صفحه
input() دریافت ورودی از کاربر
len() محاسبه طول رشته یا تعداد عناصر یک مجموعه
type() نمایش نوع داده یک متغیر
int() تبدیل مقدار به عدد صحیح
float() تبدیل مقدار به عدد اعشاری
str() تبدیل مقدار به رشته
sum() محاسبه مجموع عناصر
max() پیدا کردن بزرگ‌ترین مقدار
min() پیدا کردن کوچک‌ترین مقدار
range() تولید دنباله‌ای از اعداد برای حلقه‌ها
📝 تمرین ۱: محاسبه معدل دانش‌آموز
تابعی به نام calculate_average() بنویسید که سه نمره را به عنوان ورودی دریافت کرده و معدل آن‌ها را با استفاده از return برگرداند. سپس در برنامه اصلی، معدل را چاپ کنید.
📝 تمرین ۲: بررسی قدرت رمز عبور
تابعی به نام check_password() بنویسید که یک رمز عبور را دریافت کند. اگر طول رمز حداقل ۸ کاراکتر باشد، مقدار True و در غیر این صورت False را با استفاده از return برگرداند.
📝 تمرین ۳: محاسبه هزینه خرید
تابعی به نام final_price() بنویسید که قیمت یک کالا و تعداد آن را دریافت کرده و مبلغ کل را برگرداند. سپس مبلغ نهایی را در برنامه اصلی نمایش دهید.
📝 تمرین ۴: تبدیل ثانیه به زمان
تابعی به نام convert_time() بنویسید که تعداد ثانیه‌ها را دریافت کرده و تعداد دقیقه و ثانیه معادل آن را برگرداند. سپس نتیجه را به صورت مناسب نمایش دهید.

نمونه:
ورودی: 125
خروجی: 2 دقیقه و 5 ثانیه
📝 تمرین ۵: پیدا کردن بزرگ‌ترین عدد
تابعی به نام find_max() بنویسید که سه عدد را دریافت کرده و بزرگ‌ترین آن‌ها را با استفاده از return برگرداند. در این تمرین از تابع آماده max() استفاده نکنید.
📝 تمرین ۶: تولید نام کاربری
تابعی به نام create_username() بنویسید که نام و نام خانوادگی کاربر را دریافت کرده و یک نام کاربری به صورت زیر برگرداند:

Ali Ahmadi → ali.ahmadi

راهنمایی: خروجی را با حروف کوچک (Lowercase) تولید کنید.

توابع لامبدا (Lambda Functions)

در درس بعدی با توابع لامبدا (Lambda Functions) آشنا می‌شوید. یاد می‌گیرید چگونه توابع ساده و کوتاه را بدون استفاده از def و تنها در یک خط کد تعریف کنید. این قابلیت در بسیاری از برنامه‌های پایتون و هنگام کار با توابعی مانند map()، filter() و sorted() کاربرد فراوانی دارد.

گام بعدی : توابع لامبدا در پایتون

برای شرکت در آزمون آماده‌اید؟

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

توابع در پایتون

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

ادامه مطلب »

مجموعه در پایتون

مجموعه (Set) در پایتون به زبان ساده، Set مجموعه‌ای از عناصر منحصربه‌فرد (Unique) است که ترتیب مشخصی ندارد و اجازه

ادامه مطلب »

تاپل در پایتون

تاپل (Tuple) در پایتون بعد از آشنایی با لیست (List)، نوبت به یکی دیگر از ساختارهای داده در پایتون یعنی

ادامه مطلب »

لیست در پایتون

لیست (List) در پایتون پرکاربردترین ساختار داده​ تا اینجا یاد گرفتید که هر متغیر فقط یک مقدار را در خود

ادامه مطلب »

آموزش نصب پایتون

آموزش نصب پایتون و ابزارهای موردنیاز (راهنمای کامل برای ویندوز) اگر تصمیم گرفته‌اید برنامه‌نویسی را یاد بگیرید، احتمالاً نام زبان

ادامه مطلب »