Table of Contents
ساختار کلی تعریف تابع در پایتون
در این بخش تمرکز ما روی «نحوهٔ نوشتن» توابع است، نه اینکه چرا لازماند یا چطور دوباره استفاده میشوند (اینها در بخشهای دیگر فصل توضیح داده میشوند).
ساختار کلی یک تابع در پایتون اینگونه است:
def نام_تابع(لیست_پارامترها):
دستور_۱
دستور_۲
...نکتههای مهم در این ساختار:
- کلمهٔ کلیدی
defهمیشه ابتدای تعریف تابع میآید. - بعد از نام تابع، پرانتز
()قرار میگیرد (حتی اگر پارامتری نداشته باشد). - تعریف تابع با
:(دو نقطه) تمام میشود. - تمام کدهای داخل تابع باید با فاصله (indent) تو رفته باشند (معمولاً ۴ فاصلهٔ خالی یا یک تب).
- بیرون آمدن از تو رفتگی یعنی «کد دیگر داخل آن تابع نیست».
یک تابع ساده بدون پارامتر
سادهترین نوع تابع، تابعی است که ورودی نمیگیرد:
def salam():
print("سلام! به دنیای پایتون خوش آمدی.")
# فراخوانی تابع
salam()نکات:
salamنام تابع است.()نشان میدهد این نام، یک تابع است و باید «فراخوانی» شود.- بدون
()شما فقط به خودِ تابع اشاره میکنید، نه اجرای آن: salam→ فقط اشاره به تابعsalam()→ اجرای تابع
نامگذاری توابع
چند قانون و توصیهٔ مهم برای نامگذاری:
قوانین (الزامی):
- فقط میتوان از حروف (
a-z,A-Z)، عددها (0-9) و زیرخط (_) استفاده کرد. - نام تابع نباید با عدد شروع شود.
- فاصله (
space) مجاز نیست. - استفاده از کلمات رزروشدهٔ پایتون مثل
def,if,for,whileبه عنوان نام تابع ممنوع است.
توصیهها (برای کد خوانا):
- از نامهای معنادار استفاده کنید:
- بد:
f1,x - خوب:
print_welcome,calculate_area - معمولاً برای توابع از حالت
snake_caseاستفاده میشود: - حروف کوچک + جدا کردن کلمات با
_: print_menu,get_user_name,save_to_file
چند مثال:
def print_menu():
print("1. جمع")
print("2. تفریق")
def get_age():
print("لطفاً سن خود را وارد کنید:")بدنهٔ تابع و تورفتگی (Indentation)
هر چیزی که داخل تابع است، باید زیر تعریف تابع تو رفته باشد. این تو رفتگی است که محدودهٔ تابع را مشخص میکند، نه {} مثل بعضی زبانهای دیگر.
مثال درست:
def show_message():
print("سلام")
print("این یک پیام است")مثال نادرست (بدون تو رفتگی):
def show_message():
print("سلام")
print("این یک پیام است")
کد بالا خطای IndentationError میدهد، چون پایتون انتظار دارد کدهای داخل تابع با فاصله شروع شوند.
نکات عملی:
- از اول دوره بهتر است همیشه ۴ فاصله برای هر سطح تو رفتگی استفاده کنید.
- در ویرایشگرها معمولاً با زدن کلید
Tab، ۴ فاصله قرار داده میشود (بسته به تنظیمات IDE).
تابعی که فقط کاری انجام میدهد (بدون مقدار بازگشتی)
بعضی توابع فقط کاری را انجام میدهند (مثلاً چاپ متن) و مقدار خاصی برنمیگردانند. این نوع توابع را گاهی «رویه» (procedure) مینامند.
مثال:
def print_welcome_message():
print("************************")
print(" برنامه مدیریت کارها ")
print("************************")
print_welcome_message()این تابع:
- چیزی از کاربر نمیگیرد (پارامتر ندارد).
- چیزی هم به برنامه برنمیگرداند؛ فقط روی خروجی چاپ میکند.
تابع خالی (استفاده از `pass`)
گاهی میخواهید ساختار تابع را از قبل بنویسید، اما هنوز نمیدانید داخلش چه کدی میآید. در این حالت میتوانید از pass استفاده کنید تا پایتون خطا ندهد.
def todo_list():
# بعداً منطق برنامه اینجا نوشته میشود
pass
pass یعنی: «اینجا عمداً هیچ کاری نکن».
این روش زمانی مفید است که دارید اسکلت کلی برنامه را طراحی میکنید و بعداً جزئیات را پر میکنید.
داکاسترینگ (توضیح تابع)
برای تابع میتوانید در خط اول بدنهٔ آن، یک رشتهٔ چندخطی بنویسید تا توضیح دهد که این تابع چه کار میکند. به این توضیح، docstring گفته میشود.
def greet():
"""این تابع یک پیام خوشامد چاپ میکند."""
print("سلام! خوش آمدی :)")
greet()نکات:
- داکاسترینگ بین سهتایی دابلکوتیشن
"""یا سینگلکوتیشن'''نوشته میشود. - در خط اول بعد از تعریف تابع و داخل بدنهٔ آن قرار میگیرد.
- بعداً میتوانید با
help(نام_تابع)این توضیح را ببینید (این در فصل کتابخانهها و کمک بیشتر به کار خواهد آمد).
مثال کمی مفصلتر:
def print_user_info():
"""
اطلاعات کاربر را روی صفحه چاپ میکند.
فعلاً فقط یک متن نمونه نمایش داده میشود.
"""
print("نام: کاربر نمونه")
print("سن: 20")تعریف تابع و فراخوانی در جاهای مختلف فایل
معمولاً توابع را در ابتدای فایل (بعد از ایمپورتها) تعریف میکنند و بعد در ادامهٔ برنامه آنها را فراخوانی میکنند.
الگوی رایج:
def show_header():
print("==== برنامه نمونه ====")
def main():
show_header()
print("اینجا بقیهٔ منطق برنامه قرار میگیرد.")
# شروع اجرای برنامه
main()چیزهایی که در این مرحله لازم است بدانید:
- یک تابع میتواند تابع دیگری را فراخوانی کند (مثل
mainکهshow_headerرا صدا میزند). - پایتون قبل از اجرای خطوط پایینتر، باید «تعریف تابع» را بالاتر دیده باشد. برای همین معمولاً تعریف توابع بالای فایل نوشته میشود.
اشتباهات رایج در تعریف تابع
در این بخش فقط اشتباههای مربوط به «تعریف تابع» را میبینیم (نه منطق داخلی تابع):
۱. فراموش کردن `:`
def say_hello() # نادرست
print("سلام")باید اینطور باشد:
def say_hello():
print("سلام")۲. ننوشتن پرانتزها
def say_hello: # نادرست
print("سلام")
باید حتماً () وجود داشته باشد، حتی اگر پارامتری نیست:
def say_hello():
print("سلام")۳. فضای خالی اشتباه قبل از `def`
تعریف تابع باید در جایی نوشته شود که تو رفتگی آن معنا داشته باشد. اگر بیدلیل قبل از def فاصله بگذارید، ممکن است پایتون فکر کند این تعریف «داخل چیزی دیگر» است.
مثال نادرست:
if True:
def f():
print("سلام")۴. استفاده از نام نامعتبر
def 2print(): # نادرست - شروع با عدد
print("عدد")
def print message(): # نادرست - وجود فاصله
print("پیام")نسخهٔ درست:
def print2():
print("عدد")
def print_message():
print("پیام")چند تمرین پیشنهادی
برای تمرین تعریف تابع (بدون درگیر شدن با پارامتر و مقدار بازگشتی)، میتوانید این کارها را انجام دهید:
- تابعی بنویسید به نام
print_lineکه یک خط شامل----------چاپ کند و آن را چند بار در برنامه صدا بزنید. - تابعی بنویسید به نام
show_menuکه منوی یک برنامهٔ خیالی را چاپ کند (مثلاً «۱. افزودن»، «۲. حذف»، «۳. خروج») و بعد آن را فراخوانی کنید. - تابعی بنویسید به نام
about_meکه دو سه خط دربارهٔ شما (نام، شهر و یک علاقهٔ شخصی) چاپ کند.
در بخشهای بعدی این فصل، همین توابع ساده را کمکم با پارامترها و مقادیر بازگشتی قدرتمندتر خواهیم کرد.