پیش از این گفتیم که انجام عملیات پردازشی روی دادههای برنامه توسط عملگرها و توابع انجام میشود و در آموزشهای گذشته با مفهوم عملگرها آشنا شدیم و اکنون در این بخش میخواهیم به معرفی مفهوم Function (تابع) بپردازیم.
تا به حال بیشتر کدهای خود را در محیط تعاملی IDLE وارد کردهایم اما از این پس قصد داریم از محیط اسکریپتنویسی این نرمافزار نیز استفاده کنیم (در آموزش شروع کار با حالت اسکریپتی مفسر زبان برنامهنویسی پایتون با نحوهٔ باز کردن پنجرهٔ نرمافزار آیدل، نوشتن کدهای برنامه در آن، ذخیره و اجرای اسکریپتها آشنا شدیم.) برای شروع کار، در ابتدا قطعه کد زیر را در نظر میگیریم:
number1 = 8
number2 = 5
sum = number1 + number2
mean = sum / 2
در این برنامه، مجموع دو عدد که متغیرهای number1
و number2
به آنها منتسب شدهاند محاسبه میشود و حاصل این عملیات به متغیر sum
به معنی «مجموع» منتسب میشود و در ادامه با تقسیم مجموع دو عدد بر تعداد آنها، میانگین دو عدد محاسبه شده و به متغیر mean
به معنی «میانگین» اختصاص داده میشود.
در نظر بگیرید اگر قرار باشد در برنامهٔ خود میانگین صد جفت عدد متفاوت را محاسبه کنیم، باید یکصد بار قطعه کد فوق را برای عددهای مختلف تکرار کنیم یا فرض کنید اگر قرار بود برنامهٔ ما مثلاً میانگین هزار عدد را محاسبه کند یا میانگینهای یک هزار جفت عدد را محاسبه کند، چند بار باید یک قطعه کد را تکرار میکردیم.
خوشبختانه فیچرهایی در زبانهای برنامهنویسی گنجانده شده است که به برنامهنویسان کمک میکنند تا با حذف کارهای تکراری، با سرعت و دقت بیشتری دست به توسعهٔ نرمافزار بزنند که یکی از این امکانات مفید Function (تابع) نام دارد. میتوان گفت فانکشن برنامهٔ کوچکی است که قابلیت استفادهٔ مجدد را دارد به طوری که ایجاد و استفاده از یک فانکشن مثل این است که مجموعهای از دستورات را در یک بلوک کد قرار دهیم و نامی برای آن انتخاب کنیم و از این پس هر زمانی که لازم باشد دستورات داخل این بلوک را اجرا کنیم، کافی است نام آن را فراخوانی کنیم. در حقیقت، با این کار به مفسر پایتون آدرس آن بلوک کد را میدهیم تا با مراجعه به آن، دستورات مد نظرمان را اجرا کند.
مزیتهای استفاده از فانکشن در توسعهٔ نرمافزار
به طور کلی، فانکشنها را میتوان به دو دستهٔ کلی تقسیمبندی کرد که عبارتند از Built-in و User-Defined اما پیش از پرداختن به قابلیتهای هر کدام از اینها، ابتدا قصد داریم ببینیم که مزیتهای استفاده از فانکشنها چیست:
- جلوگیری از تکرار کد
- تجزیهٔ مسائل پیچیده به بخشهای سادهتر
- واضح کردن کدها
- استفادهٔ مجدد از کدها
Built-in Function تعداد محدودی از فانکشنها را شامل میگردد که طراحان زبان پایتون به صورت پیشفرض آنها را برای مفسر پایتون تعریف کردهاند و برنامهنویسان نیز میتوانند هر زمان که به این فانکشنها نیاز داشتند، از آنها استفاده کنند (پیش از این به کرات در کدهای خود از فانکشنی تحت عنوان ()print
به عنوان دستوری برای چاپ متن روی صفحهنمایش استفاده کردهایم که یکی از انواع فانکشنهای Built-in پایتون است.)
در حقیقت، کدنویسی فانکشنی که به کامپیوتر بفهماند باید چیزی را روی خروجی چاپ کند بسیار سخت و پیچیده است و علت اصلی تعریف فانکشنهای پیشفرض هم این است که کاربرد آنها بسیار زیاد است و تعریف آنها به صورت پیشفرض این مزیت را برای برنامهنویسان دارا است تا بدون آنکه درگیر پیچیدگیهای کدنویسی این تَسکها شوند، بتوانند در زمان نیاز به راحتی از آنها استفاده کنند. برخی از فانکشنهای پیشفرض پرکاربرد زبان برنامهنویسی پایتون عبارتند از:
abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() ascii() enumerate() input() oct() staticmethod() bin() eval() int() open() str() bool() exec() isinstance() ord() sum() bytearray() filter() issubclass() pow() super() bytes() float() iter() print() tuple() callable() format() len() property() type() chr() frozenset() list() range() vars() classmethod() getattr() locals() repr() zip() compile() globals() map() reversed() __import__() complex() hasattr() max() round() delattr() hash() memoryview() set()برای بهکارگیری هر یک از این فانکشنها کافی است با کاری که آنها انجام میدهند آشنا باشیم و در شرایط مناسب بر اساس نیاز خود از آنها استفاده کنیم. در برنامهنویسی بهکارگیری فانکشنها را اصطلاحاً Call (فراخوانی) میگوییم و برای فراخوانی یک فانکشن کافی است نام آن را نوشته سپس دو پرانتز باز و بسته ()
جلوی آن قرار دهیم.
اگر فانکشنها را مانند دستگاههایی ببینیم که کاری خاص را انجام میدهند، برخی از این دستگاهها برای شروع کار نیاز به ورودی خاصی دارند که در اصطلاح برنامهنویسی به آنها Argument (آرگومان) گفته میشود. برای مثال، یک آبمیوهگیری را در نظر بگیرید که برای شروع کار نیاز به یک ورودی مثل هویج دارد تا آب آن را بگیرد (البته شما بر اساس نیاز خود میتوانید ورودیهای دیگری هم به این دستگاه بدهید به طوری که مثلاً شاید دوست داشته باشید با دستگاه خود آبِ سیب بگیرید و دوست شما از آن برای گرفتن آب انبه استفاده کند.)
همچنین باید در نظر داشته باشیم با وجود اینکه دستگاه شما میتواند ورودیهای مختلفی بگیرد، به هر حال یک سری محدودیتهایی برای ورودیها وجود دارد به طوری که مثلاً نمیتوانید در دستگاه خود گوشت بریزید چرا که در این صورت دستگاه به درستی عمل نخواهد کرد!
شبیه همین عملکرد در فانکشنها نیز وجود دارد. به عبارتی، با وجود آنکه یک فانکشن میتواند آرگومانهای متنوعی را به عنوان ورودی خود بگیرد، اما باز هم محدودیتهایی روی نوع آرگومانهای ورودی وجود دارد و نمیتوانیم هر نوع دادهای را به عنوان آرگومان ورودی در اختیار فانکشن قرار دهیم.
برای وارد کردن این ورودیها یا آرگومانها فقط کافی است در زمان فراخوانی فانکشن آنها را میان علائم ()
قرار دهیم. برای مثال، می توانیم استرینگ «SokanAcademy.com» را به عنوان آرگومان به فانکشن ()print
بدهیم که برای این کار فانکشن را به صورت زیر فراخوانی میکنیم:
print("SokanAcademy");
در مقابل، User-Defined Function به توابعی گفته میشود که بر اساس اصول مشخص زبان پایتون توسط خودِ برنامهنویس تعریف میشوند سپس از آنها در زمان احتیاج استفاده خواهد شد و نیاز به توضیح نیست که این نوع فانکشنها این اختیار را به برنامهنویسان میدهند تا هر تَسکی که مد نظر داشته باشند را پیادهسازی کنند که در آموزشهای آینده با نحوهٔ تعریف این نوع فانکشنها و همچنین نحوهٔ استفاده از آنها نیز آشنا خواهیم شد.