تابع (مقدّماتی)

بگذارید درس امروز را با یک بازی قدیمی به نام هُب شروع کنیم!

اگر تا به حال این بازی را انجام داده باشید، به خاطر دارید که ابتدا یک عدد انتخاب می‌شد و همه‌ی بازیکنان باید با دقّت در آن عدد، وقتی به  مضارب آن می‌‌رسیدند به جای آن مضرب کلمه‌ی «هُب» را به زبان می‌آوردند.

برای مثال وقتی عدد ۴ انتخاب می‌شد باید بازیکنان از یک می‌شمردند تا به ۴ یا ۸ یا ۱۲ و … یعنی مضارب ۴ می‌رسیدند و به جای آن هُب می‌گفتند.

اگر دقیق تر به این بازی توجّه کنیم درخواهیم یافت که هر بازیکن در ذهن خودش سعی می کرد که مضرب بعدی عددِ گفته شده را بیابد و ببیند که به او خواهد افتاد یا نه! یعنی عدد را به ذهن خود وارد می‌کرد و خروجی آن که مضارب عدد در نظر گرفته شده بود را در ذهن خود جای می‌داد تا نوبتش فرا برسد.

این عمل توسّط تابعی انجام می‌گیرد که حاصل‌ضرب اعداد طبیعی در عدد دریافتی را به عنوان خروجی می‌دهد. یعنی برنامه‌ی آن بدون دانستن مدل تابع به صورت زیر است:

number = int(input(‘Enter a number:‘))

counter = 0

while True:

      counter += 1

      if counter % number = 0:

            print(‘Hob‘)

      else:

            print(counter)

تابع

در دنیای برنامه نویسی مفهومی وجود دارد که به آن تابع یا Function می گوییم.

تابع یا عمل کننده، یک بسته، حاوی دستورات چیده شده و تنظیم شده است که عمل یا کاری را انجام می‌دهد.

تابع جایگزینی برای بخش‌های تکراری برنامه است که با یک بار نوشتن و چندین بار فراخوانی و اجرای آن می‌توان از پیچیدگی برنامه جلوگیری و تغییر در آن را آسان نمود. استفاده از توابع باعث بالابردن قابلیت استفاده مجدد از کدها می‌شود و شلوغی را نیز کاهش می‌دهد. توابع ابزاری برای خرد کردن برنامه به واحدهای اجرایی کوچکتر برای آسان نمودن برنامه‌های بزرگ هستند.

برای مثال تابعی می‌نویسیم که هر عبارتی را دریافت کرد آن‌ را با گذاشتن علامت ! در انتها چاپ کند …

برای درک بهتر تابع می توان به آنها به شکل یک ماشین نگاه کرد.

1. آنها یک مقدار را به عنوان ورودی می گیرند

2. تغییراتی روی آن اعمال می کنند

3. مقدار خروجی را ارائه می دهد

توابع پیش‌فرض یا توکار (Built-in Functions)

در دروس قبل با توابع مختلفی روبرو شده و از آنها استفاده کرده‌ایم، بدون آنکه درباره توابع چیزی بدانیم. به مثالهای زیر توجّه کنید:

برخی از توابع به صورت پیش فرض در زبان پایتون حضور دارند مثل نمونه های بالا که به آن‌ها توابع پیش‌فرض یا توکار (Built-in Functions) می‌گویند.

توابع تعریف شده توسط کاربر (User-Defined Functions)

به غیر از آن توابع موجود، شما می‌توانید هر تابعی را که خواستید برای خودتان تعریف کنید و استفاده نمایید.

تعریف کردن تابع

در زبان پایتون توابع به صورت زیر تعریف می‌شوند:

کار با تابع در پایتون به صورت کلی با سه قدم زیر انجام می‌شود:

۱- نام گذاری:

شما باید برای تابع خود یک اسم بگذارید تا هنگام فراخوانی از آن استفاده کنید.

در برنامه نویسی ( و کلا زندگانی) سعی کنید از نام‌گذاری‌های تصادفی و بدون منطق اجتناب کنید، زیرا به هنگامی فراخوانی ممکن است فراموش کنید. اگر برنامه نوشته شده توسط شما منظّم نباشد، قطعاً نمی‌توانید مشکل آن را به راحتی پیدا و رفع کنید.

اصول نامگذاری توابع، با اصول نامگذاری متغیّرها در پایتون یکی است که در جلسات قبل به آن اشاره کردیم.

همانطور که قبلاً گفته بودیم، یک سری از عبارات در زبان پایتون پیش فرض هستند و شما کلاً برای نام گذاری نمی‌توانید از آن‌ها استفاده کنید.(Black List)

خطایی که در صورت استفاده از لغات کلیدی (Keyword) نشان داده می‌شود.

۲- تعریف عملکرد:

عملکرد یا functionality کاری است که تابع باید انجام دهد. این کار می‌تواند شامل تمامی دستورات پایتون باشد که قبلاً آن‌ها را آموخته‌ایم.

۳- فراخوانی:

تابع به خودی ‌خود کاری انجام نمی‌دهد مانند دستگاهی که هنوز آن را روشن نکرده‌ایم و ورودی به آن نداده‌ایم. برای آن که کار مورد نظر را انجام دهد، باید آن را صدا بزنیم. به این کار Function Invocation یا Function Call می گوییم. به مدل زیر برای فراخوانی تابع زیر توجّه کنید:

خروجی تابع (Return):

برای آن که تابع ما مقداری را به عنوان خروجی بازگرداند تا برای کاری بتوان در بیرونِ تابع از آن استفاده نمود، از عبارت return استفاده می‌کنیم و در مقابل آن مقدار یا عبارت خروجی را می‌نویسیم.

دقّت داشته باشید که استفاده از دستور print در داخل تابع به عنوان خروجی تابع منظور نمی‌شود!

به مثال زیر توجه کنید:

def power(number):

      return number ** 2

در این مثال number به عنوان ورودی به تابع داده شده و تابع توان دوم ورودی را با کمک عبارت return باز می‌گرداند. دقّت داشته باشید که این مقدار چاپ نمی‌شود و باید بیرون تابع آن را در صورت نیاز به کار بگیریم یا چاپ کنیم.

آرگومان (Argument):

آرگومان‌ها شبیه پارامترها یا همان مقادیر ورودی به تابع هستند. یعنی  مقداری عددی یا رشته‌ای حتی منطقی و… را به داخل تابع ‌می‌فرستیم تا بر روی آن کاری انجام دهد، این متغیّرها را آرگومان می‌نامیم.

در بیشتر مواقع، تعدادی آرگومان را وارد یک تابع می‌کنیم و تابع آن‌ها را دریافت و پس از انجام کارها، مقادیری را بعنوان خروجی برمی‌گرداند. با این‌حال ممکن است همیشه به این شکل نباشد. حالت‌های زیر نشان دهنده‌ی مدل‌های تعریف توابع هستند:

  • تابعی که ورودی و خروجی ندارد

def greeting():

      print(‘Hello!‘)

فقط برای چاپ یک عبارت استفاده شده است و خروجی خاصی را با return بر نمی‌گرداند.

  • تابعی که ورودی ندارد اما خروجی دارد

import random

def rand_num():

      number = random.randit(0, 10)

      return number

print(rand_num())

در این تابع عددی تصادفی بین ۰ تا ۱۰ تولید و مقدار آن به کمک return از تابع خارج می‌شود. همان‌طور که مشخص است آرگومان یا ورودی در تعریف تابع مشاهده نمی‌شود!

  • تابعی که ورودی دارد اما خروجی ندارد

number = int(input(‘Enter a number:‘))

def is_prime(number):

      prime = True

      for i in range(2,number):

            if number % i == 0:

                 prime = False

                 print(‘Not Prime!‘)

                 break

      if prime == True:

                 print(‘Is Prime!‘)

is_prime(number)

در این برنامه تابعی نوشته شده که با دریافت یک عدد چاپ می‌کند که عدد اوّل است یا نه! بنابر این ورودی دارد ولی خروجی ندارد…

  • تابعی که هم ورودی و هم خروجی دارد

number = int(input(‘Enter a number:‘))

def power(number):

      return number ** 2

print(power(number))

در این برنامه تابعی نوشته شده که عددی را دریافت نموده و توان دو آن را بر می‌گرداند. در واقع تابع نباید آن را پرینت کند!

نکته:

ممکن است در بعضی موارد نخواهیم که مقدار محاسبه شده یا خروجی تابع مستقیماً در تابع چاپ شود و آن را به عنوان خروجی به بیرون از تابع بازگردانیم (return کنیم)، تا وقتی با دستور پرینت آن را چاپ نکنیم این مقدار قابل دیدن نیست. این کار وقتی انجام می‌شود که بخواهیم محاسبه‌ای با خروجی تابع انجام دهیم یا در جایی خاص آن را چاپ کنیم، یا حتی از آن به عنوان ورودی تابع دیگری استفاده نماییم.