ایجاد یک تابع در پایتون (Python)
در پایتون یک تابع با کلمه کلیدی def تعریف می شود.
مثال: در زیر یک تابع با نام my_function ایجاد شده است که وظیفه چاپ یک مقدار رشته ای را دارد.
def my_function():
print("Hello from a function")
فراخوانی یک تابع
برای استفاده از مقدار برگشتی یک تابع حتما باید آن را فراخوانی کنید. در زیر طریقه فراخوانی یک تابع را برای شما شرح داده ایم.
برای فراخوانی یک تابع ابتدا نام تابع و بعد پرانتز باز و بسته را قرار می دهیم.
def my_function():
print("Hello from a function")
my_function()
آرگومان ها (Arguments)
اطلاعات را می توان به عنوان آرگومان ها به توابع پاس بدهیم.
آرگومان ها بعد از نام تابع، در داخل پرانتزها قرار می گیرند، می توانید هر تعداد آرگومان که بخواهید به یک تابع پاس بدهید، فقط باید آن ها را با کاما از یکدیگر جدا کنید.
مثال: تابع زیر یک آرگومان به اسم (fname) دارد، وقتی تابع فراخوانی می شود یک نام کوچک به آن پاس می دهیم و در داخل خود تابع نام کامل را چاپ می کند.
def my_function(fname):
print(fname + " Refsnes")
my_function("Emil")
my_function("Tobias")
my_function("Linus")
نکته: در مستندات پایتون اغلب به جای Arguments از نام کوتاه شده args استفاده شده است.
پارامتر یا آرگومان ؟
هر دو اصطلاح آرگومان و پارامتر می توانند برای یک کار استفاده شوند و آن هم انتقال اطلاعات به یک تابع است.
نکته : از دیدگاه یک تابع
یک پارامتر متغیری است که در داخل پرانتز در تعریف یک تابع ذکر شده است.
یک آرگومان مقداری است که هنگام فراخوانی به تابع ارسال می شود.
تعداد آرگومان ها
به طور پیش فرض یک تابع باید با تعداد آرگومان درست فراخوانی شود، به این معنی که اگر تابع انتظار 2 آرگومان را دارد، شما باید تابع را با دو آرگومان فراخوانی کنید، نه بیشتر و نه کمتر.
مثال: در این مثال تابع انتظار 2 آرگومان را دارد و 2 آرگومان را نیز دریافت می کند.
def my_function(fname, lname):
print(fname + " " + lname)
my_function("Emil", "Refsnes")
اگر بخواهید تابع را با 1 آرگومان و یا 3 آرگومان فراخوانی کنید با خطا مواجه می شوید.
مثال: در این مثال تابع انتظار 2 آرگومان را دارد ولی تنها 1 آرگومان فراخوانی شده است و با خطا مواجه می شود.
def my_function(fname, lname):
print(fname + " " + lname)
my_function("Emil")
توابع خودسرانه، *args
اگر نمی دانید که چه تعداد آرگومان به تابع شما منتقل می شود می توانید از یک * قلل از نام پارامتر در تعریف یک تابع استفاده کنید.
به این ترتیب تابع چندین آرگومان را دریافت می کند و بر این اساس می توانید به آیتم های آن دسترسی پیدا کنید.
مثال: در این مثال به دلیل اینکه تعداد آرگومان ها مشخص نیست از یک * قبل از نام پارامتر استفاده کرده است.
def my_function(*kids):
print("The youngest child is " + kids[2])
my_function("Emil", "Tobias", "Linus")
نکته: در مستندات پایتون برای استفاده از توابع خودسرانه اغلب از کوتاه شده *args استفاده می شود.
Keyword Arguments
می توانید آرگومان ها را به شکل key : value ارسال کنید.
به این شکل ترتیب آرگومان ها مهم نخواهد بود.
مثال: در این مثال آرگومان های تابع my_function به شکل key : value ارسال شده اند.
def my_function(child3, child2, child1):
print("The youngest child is " + child3)
my_function(child1 = "Emil", child2 = "Tobias", child3 = "Linus")
نکته: در مستندات پایتون عبارت keyword arguments به kwargs کوتاه می شود.
Keyword Arguments خودسرانه، **kwargs
اگر نمی دانید که چند Keyword Arguments به تابع شما منتقل می شود، قبل از نام پارامتر در تعریف تابع از ** استفاده کنید.
به این شکل تابع Dictionary آرگومان ها را دریافت می کند و بر این اساس می توانید به آیتم های آن ها دسترسی پیدا کنید.
مثال: در این مثال چون تعداد Keyword Arguments های تابع مشخص نیست از ** قبل از نام پارامتر kid استفاده کرده است.
def my_function(**kid):
print("His last name is " + kid["lname"])
my_function(fname = "Tobias", lname = "Refsnes")
نکته: در مستندات پایتون عبارت keyword arguments خودسرانه به **kwargs کوتاه می شود.
مقادیر پیش فرض پارامترها
در مثال زیر نحوه استفاده از مقادیر پیش فرض پارامترها نشان داده شده است.
اگر تابع را بدون آرگومان فراخوانی کنیم از مقدار پیش فرض استفاده می کند.
def my_function(country = "Norway"):
print("I am from " + country)
my_function("Sweden")
my_function("India")
my_function()
my_function("Brazil")
همانطور که می بینید اگر به تابع آرگومان ارسال نکنیم از مقدار پیش فرض تعریف شده پارامترها در تعریف در تابع استفاده می کند.
پاس دادن یک لیست به عنوان آرگومان
می توانید انواع داده های قابل پیمایش (رشته در پایتون , لیست در پایتون , تاپل در پایتون , مجموعه در پایتون , دیکشنری در پایتون) را به عنوان آرگومان به یک تابع ارسال کنید و در داخل تابع بسته به نوع مقدار به همان شکل با آن رفتار شود.
به عنوان مثال اگر یک لیست را به عنوان آرگومان به یک تابع پاس دهید، در داخل تابع هم مانند یک لیست با آن رفتار می شود.
def my_function(food):
for x in food:
print(x)
fruits = ["apple", "banana", "cherry"]
my_function(fruits)
مقادیر برگشتی
برای این که یک تابع مقداری را برای ما برگشت بدهد، از دستور Return استفاده می کنیم.
مثال: در این مثال تابع زیر مقداری را برگشت می دهد.
def my_function(x):
return 5 * x
print(my_function(3))
print(my_function(5))
print(my_function(9))
دستور pass در توابع
در تعریف یک تابع بلوک آن نمی تواند خالی از دستور باشد، اما اگر به هر دلیلی یک تابع بدون محتوا داشتید برای جلوگیری از بروز خطا از دستور pass استفاده کنید.
مثال: در این مثال یک تابع بدون محتوا تعریف شده است که برای جلوگیری از بروز خطا از دستور pass استفاده شده است.
def myfunction():
pass
Rrcurtion (بازگشت)
در پایتون یک تابع می تواند خودش را درون خودش فراخوانی کند.
Recurtion یک مفهوم رایج در ریاضیات و برنامه نویسی است. این بدین معنا است که شما می توانید یک تابع را در خودش فراخوانی کنید. این بدین معناست که شما می توانید داده ها را پیمایش کنید تا به نتیجه برسید.
برنامه نویسان باید در استفاده از Recurtion بسیار محتاط باشند، نوشتن یک تابع که هرگز پایان نمی پذیرد یا تابعی که از حافظه زیاد یا قدرت پردازنده زیاد استفاده می کند بسیار آسان است. با این حال، هنگامی که Recurtion به درستی نوشته شود می تواند یک رویکرد ریاضیاتی زیبا و بسیار کارآمد برای برنامه نویسی باشد.
در این مثال، tri_recurtion() یک تابعی است که تعریف کرده ایم و خودش را صدا می زند. از متغیر k به عنوان داده استفاده کرده ایم، که با هر بار صدا زدن تابع درون خودش یک واحد کاهش می یابد. بازگشت زمانی پایان می پذیرد که شرط بیشتر از 0 نباشد (یعنی وقتی 0 باشد)
اگر بخواهم عامیانه توضیح بدهم اینطور می شود که از مقدار 6 به عنوان ورودی اولیه استفاده می کند و هر بار تابع در صدا زدن خودش یک واحد از مقدار ورودی کم می کند و هر بار تابع جمع اعداد مقدار ورودی تا 1 را محاسبه و در خروجی نمایش می دهد.
برای یک توسعه دهنده تازه کار مدتی طول می کشد تا بفهمد که این مساله دقیقا چگونه عمل می کند، برای کشف این مساله بهترین راه حل تمرین و آزمایش کردن آن است.
def tri_recursion(k):
if(k > 0):
result = k + tri_recursion(k - 1)
print(result)
else:
result = 0
return result
print("\n\nRecursion Example Results")
tri_recursion(6)
مبحث توابع هم به پایان رسید، در مقاله بعدی درباره مبحث Lambda در پایتون با شما حرف خواهیم زد.