تابع در پایتون
تابع Function
یک تابع در زبان پایتون قطعهای از کد است که هر زمان فراخوان (call) شود اجرا میشود. میتوان دادههایی را به عنوان ورودی به یک تابع داد که به آنها پارامتر میگوییم و درون تابع از آنها استفاده میکنیم. همچنین یک تابع میتواند دادههایی را به عنوان خروجی بازگرداند. داشتن ورودی یا خروجی برای تابع الزامی نیست.
در پایتون تابع با کلمه کلید def تعریف میشود.
مثال:
def salam():
print(“salam!!!”)
def salam_by_name(name):
print(“salam “ + str(name))
def salam_by_name2(name):
return(“salam “ + str(name))
salam()
salam_by_name(“Sara”)
print(salam_by_name2(“Sara”))خروجی:
salam!!!
salam Sara
salam Saraتابع اول هیچ ورودی ندارد. خروجی هم ندارد. فقط رشته salam را چاپ میکند. دقت شود چاپ کردن یک مقدار به معنی بازگرداندن یک خروجی نیست.
تابع دوم یک مقدار را به عنوان ورودی دریافت میکند و آن را بعد از کلمه salam چاپ میکند. این تابع نیز هیچ خروجی ندارد.
تابع سوم مشابه تابع دوم است ولی چیزی را چاپ نمیکند. بلکه مقدار را به عنوان خروجی بازمیگرداند. به همین دلیل برای مشاهده خروجی از تابع print استفاده کردیم.
درون یک تابع نباید خالی باشد. به هر دلیلی اگر فعلا تصمیمی برای نوشتن کدهای درون تابع نداریم میتوانیم از کلمه کلید pass استفاده کنیم.
مثال:
def empty_func()
passآرگومان (Argument)
به مقادیری که هنگام فراخوانی تابع به آن میدهیم آرگومان میگوییم. آرگومانهای مختلف را با کاراکتر کاما از هم جدا میکنیم.
دقت شود مفاهیم پارامتر و آرگومان شباهت زیادی به هم دارند اما یک تفاوت ریز بین پارامتر و آرگومان وجود دارد. پارامتر به متغیری گفته میشود که هنگام تعریف کردن تابع به آن اختصاص میدهیم اما آرگومان مقداری است که هنگام فراخوانی تابع به آن میدهیم. در هر حال کلمات آرگومان و پارامتر به یک چیز اشاره دارند و آن اطلاعاتی است که به عنوان ورودی به تابع داده میشود.
مثال:
def print_full_name(first_name, last_name):
print(str(first_name) + “ “ + str(last_name))
print_full_name(“Sara”, “Alavi”)خروجی:
Sara Alaviدر این مثال عبارتهای first_name و last_name پارامترهای تابع هستند و مقادیر “Sara” و “Alavi” آرگومان.
تعداد آرگومانها هنگام فراخوانی تابع مهم است. به صورت پیشفرض تعداد آرگومانهای تابع به همان اندازه پارامترها باشد. در غیر این صورت با خطا روبرو میشویم. در مثال بالا اگر بخواهیم تابع را با کمتر یا بیشتر از دو آرگومان فراخوانی کنیم با خطا روبرو میشویم.
در مثال قبل:
print_full_name(“Sara”)
print_full_name(“Sara”, “Alavi”, “test”)خروجی:
TypeError: print_full_name() missing 1 required positional argument: 'last_name'
TypeError: print_full_name() takes 2 positional arguments but 3 were givenخطای اول میگوید یک آرگومان نادیده گرفته شده است و خطای دوم هم به وجود یک آرگومان بیشتر اشاره میکند.
انواع آرگومان در پایتون
آرگومانها در بحث تابع در پایتون انواع مختلفی دارند. به طور معمول به پنج نوع آرگومان میتوان اشاره کرد: آرگومان پیشفرض، آرگومان جایگاهی، آرگومان کلمهکلیدی، آرگومان جایگاهی دلخواه و آرگومان کلمهکلیدی دلخواه. دو نوع آخر را آرگومانهای با طول متغیر نیز مینامند.
آرگومان جایگاهی (Positional Argument)
تمام مثالهای بالا نمونههایی از این نوع آرگومان در پایتون است. در این حالت با همان ترتیبی که پارامترها را تعریف کردهایم آرگومانها تخصیص داده میشوند. آرگومانهای جایگاهی را به شکل کوتاهشده، args مینامند.
آرگومان پیش فرض (Default Argument)
آرگومانهای پیش فرض مقادیری هستند که هنگام تعریف تابع تخصیص داده میشوند.
مثال:
def add_three_number(a, b=5, c=6):
return(a + b + c)
print(add_three_number(10))
print(add_three_number(10, 1))
print(add_three_number(10, 1, 2))خروجی:
21
17
13در مثال بالا b و c آرگومان پیشفرض هستند. با توجه به این مثال به نکات زیر برای پارامترهای پیشفرض اشاره میکنیم.
- اگر میخواهیم به بعضی پارامترهای مقادیر پیشفرض اختصاص دهیم حتما باید آنها را بعد از سایر پارامترها بنویسیم.
- هنگام فراخوانی تابع اگر مقدار دیگری به متغیرهای پیشفرض اختصاص دهیم این مقدار جدید جایگزین مقدار پیشفرض خواهد شد.
- هنگام فراخوانی تابع متغیرهای پیشفرض حالت اجباری ندارند.
در صورتی که نکته اول را رعایت نکنیم با خطای SyntaxError موجه میشویم.
مثال:
def add_three_number(a=10, b, c=5):
return(a + b + c)خروجی:
SyntaxError: non-default argument follows default argumentآرگومان کلمهکلیدی (Keyword Argument)
هنگام فراخوانی تابع باید به همان ترتیبی که پارامترها تعریف شدهاند آرگومانها را وارد کنیم. اگر ترتیب پارامترها را بلد نباشیم یا به هر دلیلی نخواهیم ترتیب را رعایت کنیم میتوانیم از آرگومانهای کلمهکلیدی استفاده کنیم. برای این کار کافی است هنگام فراخوانی تابع نام پارامترها را بنویسیم و مقدار آرگومان را به آن تخصیص دهیم. آرگومانهای کلمهکلیدی را به شکل کوتاهشده، kwargs مینامند.
مثال:
def get_full_name(first_name, last_name):
return (str(first_name) + “ “ + str(last_name))
print(get_full_name(last_name=“Karimi”, first_name=“Ahmad”))خروجی:
Ahmad Karimiدر صورتی که بخواهیم از آرگومانهای جایگاهی و کلمهکلیدی با هم استفاده کنیم ابتدا باید آرگومانهای جایگاهی را بنویسیم.
در مثال قبل:
print(get_full_name(“Ahmad”, last_name=”Karimi”))
print(get_full_name(last_name=”Karimi”, “Ahmad”))خروجی:
Ahmad Karimi
SyntaxError: positional argument follows keyword argumentاکنون به بررسی آرگومانهای با طول متغیر (variable-length) میپردازیم. به این آرگومانها، آرگومان دلخواه نیز گفته میشود. کاربرد این آرگومانها زمانی است اطلاع نداشته باشیم کاربر با چه تعداد آرگومان تابع را فراخوانی خواهد کرد.
آرگومان جایگاهی دلخواه (Arbitrary Positional Argument)
برای مشخص کردن آرگومان جایگاهی دلخواه از کاراکتر ستاره (*) قبل از نام پارامتر استفاده میکنیم. این آرگومان مانند یک چندتایی (تاپل) در نظر گرفته میشود.
مثال:
def add(*a):
result = 0
for item in a:
result += item
return result
print(add(1, 2, 3))
print(add(10, 20))خروجی:
6
30آرگومان کلمهکلیدی دلخواه (Arbitrary Keyword Argument)
برای مشخص کردن آرگومان کلمهکلیدی دلخواه از دو کاراکتر ستاره (**) استفاده میکنیم. روش استفاده از آن مشابه با آرگومان جایگاهی دلخواه است با این تفاوت که ورودی به صورت کلید-مقدار است. این آرگومان مانند یک دیکشنری در نظر گرفته میشود.
مثال:
def print_values(**a):
for v in a.values():
print(v)
print_values(s="salam", i=5, d=1.5)خروجی:
salam
5
1.5مشابه با آرگومان جایگاهی و کلمهکلیدی، ابتدا باید آرگومان جایگاهی دلخواه و سپس آرگومان کلمهکلیدی دلخواه را بنویسیم.
توابع بازگشتی در پایتون
زبان برنامه نویسی پایتون از توابع بازگشتی (Recursive Function) پشتیبانی میکند. تابع بازگشتی تابعی است که خودش را فراخوانی میکند.
مثال:
def factorial(n):
if n == 1:
return n
else:
return n * factorial(n-1)
factorial(5)خروجی:
120در مثال بالا الگوریتم فاکتوریل را با استفاده از توابع بازگشتی پیاده سازی کردیم. البته همین تابع را بدون استفاده از تابع بازگشتی نیز میتوان پیادهسازی کرد.
برای استفاده از توابع بازگشتی باید دقت کرد که حتما الگوریتم به شکل صحیح پیادهسازی شود. در غیر این صورت ممکن است وارد حلقه بینهایت از فراخوانی تابع شویم و سیستم از نظر منابع سختافزاری مانند RAM یا CPU با مشکل روبرو شود.