فهرست مطالب
در این مقاله راجع به توابع پایتون صحبت میکنیم. توابع جزو کلیدیترین مفاهیم کدنویسی هستند و حکم بلوکهایی از کد را دارند که میتوانند ورودی بگیرند، کار، عملیات یا Task مشخصی را انجام بدهند و خروجی مورد نظر را تولید کنند یا در اصلاح برنامهنویسی برگردانند. مفهوم و ساز و کار تابع در پایتون، فرق چندانی با سایر زبانهای برنامهنویسی ندارد. در واقع یادگیری توابع پایتون، باعث میشود که از توابع سایر زبانها مثل جاوا اسکریپت یا ++C یا PHP و غیره هم سر بیاوریم. پس با این مطلب همراه باشید تا با این ابزارهای بدردبخور، که کار کدنویسی را به مراتب سادهتر میکنند، آشنا شویم.
منظور از تابع در پایتون چیست؟
اصلیترین فایدهٔ تابع در پایتون و تمام زبانهای برنامهنویسی، جلوگیری از اتلاف وقت و انرژی برنامهنویس و ایجاد خوانایی بیشتر در کد است. چون یک تابع (Function یا Method) را یکبار مینویسیم و بینهایت بار در بدنهٔ برنامه استفاده یا به قولی فراخوانی میکنیم. یعنی مجبور نیستیم چند خط کد تکراری را بارها و بارها بازنویسی کنیم. مورد زیر یک مثال ساده از تابع در پایتون است.
اسم این تابع یا فانکشن را به دلخواه fun تعریف میکنیم. عبارت def که پیش از اسم تابع ما آمده مخفف define است و برای تعریف یک تابع جدید به کار میرود. حالا هرجایی از برنامه که به دستور ()fun برخورد کنیم، جملهٔ Welcome to IranLearn در نمایشگر یا خروجی مورد نظر به نمایش در میآید.
def fun(): print("Welcome to IranLearn")
محض یادآوری، خود print هم یکی از توابع پایتون محسوب میشود. منتها جزو توابع پیشفرض است و کارش گرفتن ورودی (در اینجا جملهٔ خوشامدگویی) و چاپ آن در خروجی میباشد. پس خروجی کد بالا چیزی شبیه به این میشود:
Welcome to IranLearn
نکته: همانطور که در مثال بالا ملاحظه شد، تابع ()fun ورودی یا پارامتر (parameter) یا آرگومان (Argument) خاصی نداشت. یعنی توابع پایتون میتوانند، بدون ورودی هم کار کنند. همانطور که میتوانند چندین پارامتر بگیرند و عملیات خاصی را روی آنها انجام دهند.
سینتکس (نحو) توابع پایتون
همانطور که اشاره کردیم، یکی از دلایل وجود توابع، قابلیت استفادهٔ مجدد از کد یا Reusability است. حالا چند مثال میزنیم تا ببینیم نحوهٔ تعریف تابع در پایتون به چه صورت است. فرمول زیر، شیوهٔ مرسوم تعریف تابع در پایتون است که در ادامه بخشهای مختلف آن را توضیح میدهیم.
- عبارت def یک عبارت کلیدی و اجباری برای تعریف تابع در پایتون است و پیش از اسم تابع میآید.
- اسم تابع بعد از def میآید و اختیاری است. اما چه بهتر که واضح و توصیفکنندهٔ ماهیت تابع باشد.
- بعد از اسم تابع، دو عدد پرانتز داریم که در بین آنها parameters یا ورودیهای تابع قرار میگیرند.
- عبارت statement به دستورات داخل یا بدنهٔ تابع اشاره دارد که میتواند یک یا صدها خط باشد.
- حواسمان به تورفتگیهای بدنهٔ تابع باشد. دستورات بدنه معمولا با ۴ اسپیس از اسم تابع جلوترند.
- مورد آخر تابع return است که کارش بازگرداندن یک مقدار خاص (درصورت نیاز) و خروج از تابع است.
- وجود return در انتهای توابع پایتون اجباری نیست.
نکته: ممکن است در حین مطالعه و یادگیری پایتون با عبارت docstring برخورد کنید. این یک متن دلبخواه و توضیحی تحت عنوان است که به درد مستندسازی میخورد. و بین دو جفت گیومه یا دبلکُتِیشن سهتایی یعنی
« “”” » قرار میگیرد. این متن تاثیری در کد ندارد و فقط برای توضیحات به کار میرود.
نحوه ایجاد تابع در پایتون
مثال زیر نمونهای از تعریف یک تابع ساده در پایتون است. این تابع یک اسم دلخواه میگیرد و با آن چاق سلامتی میکند. همانطور که ملاحظه میکنید، اسم تابع greet و به معنی احوالپرسی است و یک ورودی یا پارامتر با عنوان name میگیرد. به خط اول از تعریف تابع که شامل def و اسم تابع و ورودیهاست، هِدِر تابع function header هم گفته میشود.
def greet(name): """ This function greets to the person passed in as a parameter """ print("Hello, " + name + ". Good morning!")
در ادامه متن توضیحی را داریم که در ابتدا و انتهایش سه عدد علامت نقل قول یا دبل کتیشن « ” » قرار دارد. همانطور که در نکتهٔ بالا گفتیم، بودن یا نبودن این توضیحات دلبخواه است، اما در پروژههای بزرگ و کدهای پیچیده، مستندسازی و documentation میتواند بسیار مفید و کارساز باشد.
در انتهای تعریف تابع، بدنه یا statement را داریم که در این مثال یکی از توابع پیشفرض پایتون به اسم ()print است و سه عدد پارامتر یا ورودی میگیرد. دو عبارت متنی یا string اول و سوم یعنی Hello و Good morning ثابتند و پارامتر دوم که name باشد، همان ورودی اصلی تابع ()greet است. یعنی باید در لحظهٔ استفاده یا فراخوانی این تابع، یک عبارت دلخواه به عنوان اسم وارد شود.
نحوه فراخواندن توابع در پایتون
در بخش قبلی تابعی به اسم ()greet تعریف کردیم. اما حالا چطور از آن استفاده کنیم؟ برای استفاده یا به عبارتی فراخوانی تابع در پایتون، کافیست که داخل کد همان برنامه یا یک برنامهٔ دیگر و یا در داخل یک ترمینال کامندلاین CLI (چیزی شبیه به command prompt در ویندوز) اسم تابع را بیاوریم. فقط حواسمان باشد که فراخوانی تابع، باید با ورودیهایی که در تعریفش آمده هماهنگ باشد. یعنی اگر از تابع ()greet استفاده کنیم، باید مانند مثال زیر، چیزی به عنوان ورودی (یا آرگومان یا پارامتر) در داخل پرانتزها قرار دهیم.
def greet(name): """ This function greets to the person passed in as a parameter """ print("Hello, " + name + ". Good morning!") greet('Paul')
اجرای این چند خط کد، منجر به نمایش جمله زیر در خروجی یا نمایشگر میشود:
Hello, Paul. Good morning!
نکته: دقت کنیم که تعریف توابع پایتون، باید همیشه قبل از فراخوانی آنها بیاید. چون در غیر اینصورت برنامه Error میدهد و نمیتواند ماهیت تابع فراخوانی شده را تشخیص بدهد.
آرگومانهای تابع در پایتون
آرگومان یا Argument همان ورودیهای توابع پایتون در زمان فراخوانی هستند. فرق ظریف آرگومان با پارامتر در همین است. پارامترها متغیرهایی هستند که در زمان تعریف تابع به عنوان ورودی تعیین میشوند. مثلا در تابع زیر، دو متغیر num1 و num2 پارامترهای تابع ()add هستند. اما در زمان اجرا یا فراخوانی تابع، دو عدد دلخواهی (مثلا ۱۵ و ۵) که به عنوان ورودی به داخل تابع میفرستیم، با عنوان آرگومانهای تابع شناخته میشوند. پس بین پارامتر ورودی و آرگومان ورودی فرق چندانی نیست. جز اینکه اولی در حین تعریف و دومی در زمان فراخوانی تابع معنا پیدا میکنند.
def add(num1: int, num2: int) -> int: """Add two numbers""" num3 = num1 + num2 return num3 # Driver code num1, num2 = 5, 15 ans = add(num1, num2) print(f"The addition of {num1} and {num2} results {ans}.")
انواع توابع در پایتون
در زبان برنامه نویسی پایتون چند نوع تابع داریم که هرکدام از کاربردها و ویژگیهای خاص خود برخوردارند و در موقعیتهای مختلف به کارمان میآیند. توابع پایتون به چهار گروه زیر تقسیم میشوند.
- Built-in Functions – توابع توکار یا پیشفرض پایتون
- Recursive Functions – توابع بازگشتی پایتون
- Lambda Functions – توابع لامبدا یا بینام در پایتون
- User-defined Functions – توابع تعریفشده توسط کاربر
توابع پیش فرض
این گروه از توابع پایتون، همانطور که از اسمشان پیداست، جزوی از جعبه ابزار پایتون هستند و با آوردن اسمشان در بدنهٔ کد، آنها را فراخوانی و استفاده میکنیم. درست مثل همان تابع ()print که در مثال بالا اشاره کردیم. پایتون در نسخهٔ ۳ چیزی در حوالی ۶۰ عدد تابع Built-in یا پیشفرض دارد که برای نمونه چند مورد از آنها را مثال میزنیم:
- ()abs = عددی را میگیرد و مستقل از علامت، مقدار مثبتش را برمیگرداند.
- ()bin = عدد دلخواهی دریافت میکند و معادل دودویی یا باینتری آن را برمیگرداند.
- ()len = هر نوع آبجکتی مثل (string, bytes, tuple, list) را میگیرد و طول یا length آنرا برمیگرداند.
توابع بازگشتی
توابع پایتون میتوانند چند تابع دیگر را در خودشان فراخوانی کنند. یعنی دستمان برای تعریف یک تابع پیچیده که میتواند مجموعهای از توابع دیگر باشد، باز است. حالا اگر یک تابع، خودش را درون خودش فراخوانی کند چه؟ این هم امکانپذیر است و نوع دیگری از توابع پایتون یعنی توابع Recursive یا بازگشتی را مطرح میکند. در مثال زیر تابع ()calc_factorial نمونهای از یک تابع بازگشتی برای محاسبه عملیات فاکتوریل است. محض یادآوری فاکتوریل ۵ که با !۵ نشان میدهیم، مساویست با ۱×۲×۳×۴×۵ و فاکتوریل ۳ مساویست با ۱×۲×۳.
def calc_factorial(x): <em>"""This is a recursive function to find the factorial of an integer""" </em>if x == 1: return 1 else: return (x * calc_factorial(x-1)) num = 4 print("The factorial of", num, "is", calc_factorial(num))
توابع لامبدا یا بینام
برخلاف سایر توابع پایتون که تعریفشان با def و سپس اسم تابع مثل ()fun آغاز میشود، این نوع توابع بی نام و نشان هستند و در تعریفشان از کلمهٔ lambda استفاده میکنیم. به همین خاطر، از توابع لامبدا با عنوان توابع ناشناس، بینام یا Anonymous Function هم نام میبرند. ویژگی توابع بینام یا ناشناس اینست که هر تعدادی ورودی یا آرگومان میگیرند، اما فقط میتوانند یک خروجی مشخص داشته باشند. یعنی سینتکس یا نحو آنها به صورت تکخطی و چیزی در این مایههاست:
lambda arguments: expression
مثال زیر نمونهای از این مدل توابع پایتون است که در آن lambda x: x * 2 یک تابع لامبداست. در تابع زیر x آرگومان ورودی است و را میگیرد و x * 2 همان خروجی یا expression تابع میباشد. این تابع دوبرابر x را در آبجکتی به اسم double میریزد و در خروجی چاپ میکند:
double = lambda x: x * 2 # Output: 10 print(double(5))
کد بالا، فرق خاصی با نمونهٔ زیر ندارد:
def double(x): return x * 2
توابع تعریف شده توسط کاربر
توابع تعریف شده توسط کاربر یا User-Defined توابعی هستند که خودمان در بدنهٔ کد تعریف میکنیم تا یک کار یا task خاص را انجام دهند. یا یک بخش بزرگ و یا تکراری از کد را در بر بگیرند و به خوانایی و خلاصه شدن کد کمک کنند. این توابع از لحاظ ساز و کار و سینتکس هیچ تفاوتی با باقی توابع پایتون ندارند و تمام آنچه در مورد آنها گفتهایم، در توابع کاربرساز هم صادق است.
سینتکس یا نحو این نوع تابع در پایتون به صورت زیر است:
def function_name(argument1, argument2, ...) : statement_1 statement_2 ....
مثال زیر نمونهای از یک تابع تعریف شده توسط کاربر است که دوعدد را میگیرد و جمعشان را چاپ میکند:
def add_numbers(x,y): sum = x + y return sum num1 = 5 num2 = 6 print("The sum is", add_numbers(num1, num2))
جمعبندی
در این مطلب درباره ماهیت تابع در پایتون، نحوه تعریف و استفاده از تابع صحبت کردیم. همچنین با اصطلاحاتی مثل پارامتر و آرگومان و انواع توابع پایتون آشنا شدیم. برنامهنویسی به تمرین و تکرار زیادی نیاز دارد و اساس دوره آنلاین پایتون ایرانلرن، انجام تکالیف و پروژههای ریز و درشت و آموزش عملی است. مضاف بر اینکه میتوانید به صورت نامحدود با مدرس دوره در ارتباط باشید و رفع اشکال کنید. البته دوره برنامه نویسی ایرانلرن شامل کورسهای دیگری هم میشود که میتوانند یکجا و یا به صورت مستقل توسط علاقمندان انتخاب شوند.