در این قسمت از سری آموزشی از مقدماتی تا پیشرفته با پایتون به مبحث انواع توابع در پایتون می رسیم. به زبان ساده یک تابع، بلوکه ای (مجموعه ای) از کد است که فقط زمانی اجرا می شود که صدا زده شود. همچنین شما می توانید داده هایی را نیز به یک تابع پاس بدهید که به آن ها پارامتر می گوییم. نتیجه ی اکثر توابع تغییر یک مقدار یا برگرداندن یک مقدار جدید است.
در زبان پایتون برای تعریف توابع از کلیدواژه ی def استفاده می شود:
def my_function(): print("Hello from a function")
در این کد یک تابع به نام my_function انتخاب کرده ایم (نام توابع کاملا دلخواه و طبق سلیقه ی شما است) و تنها کاری که می کند پرینت کردن یک پیام ساده (Hello from a function) است. زمانی که این تابع را تعریف کردیم، هیچ اتفاقی نمی افتد و کدهای درون آن اجرا نمی شوند مگر آنکه کدها را فراخوانی کنیم. به این کار (call کردن)، صدا زدن یا فراخوانی تابع می گوییم که به شکل زیر است:
def my_function(): print("Hello from a function") my_function()
به عبارت دیگر برای فراخوانی توابع باید نام آن ها را به همراه یک جفت پرانتز مقابل آن ها بیاورید.
اطلاعات به صورت پارامتر به درون توابع فرستاده می شوند. شما پس از انتخاب نام تابع می توانید پارامترها را درون پرانتز های آن بیاورید. شما می توانید هر تعداد پارامتر که بخواهید را اضافه کنید، تنها کافی است آن ها را با ویرول از یکدیگر جدا کنید. برای مثال در تابع زیر یک پارامتر به نام fname (مخفف first name و به معنی «نام کوچک») داریم. یادتان باشد نام پارامترها نیز کاملا به دلخواه شما هستند و اهمیتی در اجرا تابع ندارند. اگر برای تابعی پارامتر تعیین کردید در هنگام فراخوانی باید حتما به جایش مقداری را در تابع وارد کنید:
def my_function(fname): print(fname + " Refsnes") my_function("Emil") my_function("Tobias") my_function("Linus")
خروجی:
Emil Refsnes
Tobias Refsnes
Linus Refsnes
سوال: تفاوت میان پارامتر (parameter) و آرگومان (argument) چیست؟
پاسخ: زمانی که در حال نوشتن تعریف یک تابع هستم به مقادیر داخل پرانتز پارامتر می گوییم (مثل fname) که در واقع جایی برای داده های اصلی نگه می دارند اما هنگامی که تابع را فراخوانی می کنیم به مقادیر درون پرانتز آرگومان می گویند (مانند Emil و Tobias و Linus) که داده های اصلی هستند.
در کد بالا اگر برای تابعی پارامتر تعریف شود اما هنگام فراخوانی مقداری (آرگومان) برایش قرار ندهیم با خطا روبرو خواهیم شد اما برخی اوقات پیش می آید که می خواهیم برای پارامترهای خود یک مقدار پیش فرض داشته باشیم تا اگر کاربر مقداری وارد نکرد، آن مقدار پیش فرض به جایش ارسال شود. با این کار پارامترها را دلخواه و غیراجباری کرده ایم:
def my_function(country = "Norway"): print("I am from " + country) my_function("Sweden") my_function("India") my_function() my_function("Brazil")
خروجی:
I am from Sweden
I am from India
I am from Norway
I am from Brazil
شما می توانید از هر data type ای برای پارامترها استفاده کنید (رشته ها، اعداد، لیست ها، dictionary ها و...) اما حواستان باشد که (به طور مثال) اگر به عنوان پارامتر به تابعی یک لیست پاس بدهید، درون تابع نیز همچنان لیست باقی می ماند:
def my_function(food): for x in food: print(x) fruits = ["apple", "banana", "cherry"] my_function(fruits)
خروجی:
apple
banana
cherry
برخی اوقات می خواهیم تابع ما مقدار خاصی را برگرداند (مثلا بعد از محاسبه و پردازش یک عدد نتیجه را به ما بدهد) در این حالت باید از کلیدواژه ی return استفاده کنیم:
def my_function(x): return 5 * x print(my_function(3)) print(my_function(5)) print(my_function(9))
خروجی:
15
25
45
در حالت عادی اگر تابعی تعریف کنید و پارامترهایی برایش قرار دهید، در هنگام فراخوانی ترتیب آرگومان ها بر اساس ترتیب پارامترها خواهد بود. به زبان ساده تر اگر تابعی داشته باشیم که دو پارامتر بگیرد (اسم کوچک و فامیل):
def my_function(firstName, lastName): print(firstName + lastName)
در هنگام فراخوانی اولین آرگومانی که به تابع بدهیم به جای firstName قرار خواهد گرفت، حتی اگر یک مقدار عددی باشد. بنابراین ترتیب کاملا اهمیت دارد اما اگر می خواهید ترتیب آرگومان ها اهمیتی نداشته باشد باید آن ها را به صورت key=value به تابع پاس بدهید:
def my_function(child3, child2, child1): print("The youngest child is " + child3) my_function(child1 = "Emil", child2 = "Tobias", child3 = "Linus")
خروجی:
The youngest child is Linus
همانطور که می بینید ترتیب پاس دادن آرگومان ها هیچ تاثیری بر نتیجه نداشت. به این نوع آرگومان ها، آرگومان های کلیدواژه ای یا Keyword Arguments می گویند.
نکته: در documentation رسمی پایتون به جای Keyword Arguments حالت خلاصه شدهی آن، یعنی kwargs، را خواهید دید.
برخی اوقات نمی دانیم که قرار است چند آرگومان به تابع خود پاس بدهیم یا اینکه تعداد آرگومان های پاس داده شده در هر دفعه فرق می کند. با اضافه کردن علامت ستاره (*) قبل از نام پارامتر این مسئله را به پایتون اعلام می کنیم. در واقع با این کار تابع ما یک tuple از آرگومان های مختلف را می گیرد و می تواند به آن ها دسترسی داشته باشد:
def my_function(*kids): print("The youngest child is " + kids[2]) my_function("Emil", "Tobias", "Linus")
خروجی:
The youngest child is Linus
توابع بازگشتی
بازگشت در توابع (مبحث recursion) یعنی یک تابع در تعریف خودش می تواند خودش را صدا بزند؛ به زبان ساده تر، تابع خودش را صدا می زند! هنگام استفاده از بازگشت باید بسیار مراقب بود چرا که کدنویسی اشتباه و گیرکردن در حلقه های نامحدود بسیار آسان می شود اما اگر بتوانید به شکل صحیح از این بحث استفاده کنید، کدهای تمیز و بهینه ای خواهید نوشت.
در مثال زیر تابع ()tri_recursion را تعریف کرده ایم. این تابع خودش را صدا میزند و با هر بار بازگشت از متغیر k یک واحد کم می شود و زمانی که شرط دیگر بزرگ تر از صفر نباشد از اجرا میایستد. درک این نوع توابع در پایتون کمی برای افراد مبتدی دشوار است بنابراین سعی کنید با تمرین بیشتر به آن ها مسلط شوید:
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)
خروجی:
Recursion Example Results
1
3
6
10
15
21
یک مثال دیگر از توابع بازگشتی، تابع فاکتوریل است:
def recur_factorial(n): if n == 1: return n else: return n*recur_factorial(n-1) # take input from the user num = int(input("Enter a number: ")) # check is the number is negative if num < 0: print("Sorry, factorial does not exist for negative numbers") elif num == 0: print("The factorial of 0 is 1") else: print("The factorial of",num,"is",recur_factorial(num))
امیدوارم با تمرین زیاد و ویرایش کدهای بالا در محیط کدنویسی خود بتوانید نحوه ی کار با توابع در پایتون را درک کنید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.