یکی از موضوعات مهم در برنامه نویسی کاربرد توابع است کاربرد توابع رو میتوان به یک سازمان تشبیه کرد که در آن از بالاترین سطح که مدیر قرار دارد تا سلسه مراتب و کارمندانی که هر یک وظیفه ای دارند و وظایفی را به آنها محول میکنند اگر مدیران و معاونین را تابع در نظر بگیریم هر کارمندی هم می تواند تابع دگیر باشد از کاربردهای توابع می توان به :
- کوچک کردن برنامه ها و استفاده از آنها در هر جای برنامه
- خوانایی برنامه افزایش و اشکال زدایی آن راحت تر می شود
- توابع امکان ساخت کتابخانه ها را آسان می کند هر کتابخانه بسته ای است که برای نیازهای خاصی طراحی می شوند
- انواع توابع :
1- نوع کتابخانه ای : توابعی که همراه با کامپایلر و مفسر هستند و نام دیگر آنها توابع عمومی است
2- توابعی که برنامه نویس می سازد
- از آنجایی که زبان پایتون هم دارای توابع زیادی است اما همه آنها برای برنامه نویس کافی نیستند نوشتن توابع در پایتون دو راه کار زیر را دارد :
- نوشتن تابع - فراخوانی تابع
- نوشتن تابع : ابتدا تعریف کرد ورودی و خروجی تابع مشخص می شود و الگوی آن به صورت :
def نام تابع ( لیست پارامتر ها )
بدنه تابع
...
- توابع از نظر مقدار سه نوع هستند :
1- توابعی که هیچ مقداری را بر نمی گردانند
2- توابعی که فقط یک مقدار را بر می گردانند ( برای مثال تابعی که نشان دهد عددی اول هست یا خیر ؟ )
نکته : توابع برای برگشت از دستور Return استفاده می کنند ( خروجی تابع ) و به صورت :
1- return
2- return (عبارت)
3- return مقدار
ساختار اول مقداری را بر نمی گرداند
ساختار دوم هم یک عبارت را ارزیابی می کند مثلاً return (2*i-3)
ساختار سوم هم یک مقدار شبیه false بودن و یا 2 را بر می گرداند
- توابعی که چند مقدار را بر می گردانند :
نکته : نام تابع از قانون نام گذاری شناسه ها و متغیر ها پیروی میکند این نام در تمام برنامه یکسان بکار می رود - پارامتر های تابع مقادیری هستند که جلوی تابع نوشته می شوند و هنگام فراخوانی تابع از آنها استفاده می شود این نوع توابع از نوع پارامتری انواع زیر را دارند :
- بدون پارامتر برای چاپ و نمایش پیغام ها کاربرد دارد
- آنها که تک پارامتری هستند فاکتوریل یک عدد
- چند پارامتری برای مثال برنامه ای که دو عدد بگیرید و بزرگترین آنها را نمایش دهد
بدنه تابع :
عملی که تابع باید انجام دهد در بدنه تابع است و بدنه مجموع دستوراتی که تابع باید انجام دهد
فراخوانی تابع :
دستوری که تابع را صدا زده از آن استفاده می کند فراخوانی تابع نام دارد و به صورت زیر است :
( لیست آرگومان ها ) نام تابع :
در هنگام کار با توابع به تعداد پارامتر ها و تساوی بین آرگومان ها دقت شود و در پایتون می توان توابع را داخل هم تعریف کرد
تشریح عملکرد تابع :
برای درک بیشتر تابع برنامه بدون تابع زیر رو در نظر بگیرید :
(a = int( input (" Enter a : " )
(b = int (input (" Enter b : " )
c = a + b
print(a,"+", b , "= ", c )
در این برنامه c بخش اصلی کد و محلی است که محاسبات را خود انجام می دهد این شبیه این است که مشتری به نانوایی می رود و از نانوا می پرسد چقدر شد نانوا در بخش اصلی برنامه می گوید این مبلغ شده است !!! حالا نوع تابعی این سوال را بررسی می کنیم :
def SUM (a,b) :
return a + b
a = int(input( " Enter a : " ))
b = int(input (" Enter a : " ))
c = SUM (a, b)
print(a," + ", b , " = ", c )
این روند به صورت SUM (a,b) و برگشت 8 ازین محل به عبارت c = SUM (a, b) می باشد با فرض اینکه a برایر 5 و b برابر 3 باشد ارگومان ها ( پارامتر واقعی گویند ) به a,b تابع برگشت می خورد و حاصل 8 هم متعاقباً از تابه به سمت c پاسخ داده می شود
در روش بعدی تابع می تواند خود عملیات جمع را مدیریت کند و هیچ مقداری را بر نگرداند این فرم به صورت :
def SUM (a,b) :
c = a + b
return a + b
a = int(input( " Enter a : " ))
b = int(input( " Enter b : " ))
print(SUM (a, b))
روش بعدی SUM (a,b) مقداری را بر نمی گرداند و در بدنه محاسبات صورت می گیرد و تابع در اختیار کاربر است تا a و b را محاسبه و سپس به تابع اصلی برگرداند
def SUM ()
a = int(input " Enter a : " )
b = int(input " Enter a : " )
return a+b
c = SUM ()
print(c )
حالت آخر هم به این صورت عمل می کند که تابع اصلی کار خاصی نمی کند و بدنه تابع عملیات را انجام داده و سپس نمایش نتایج را انجام می دهد و نتیجه ای هم بر نمی گرداند ( Return اختیاری است )
v
# Calling the SUM function
SUM()
نکته : تابع می تواند مقداری را برنگرداند :
def hello ():
print("Hello World")
همچنین می تواند مقداری را برگرداند و خروجی داشته باشد :
def hello ():
return " Hello World "
s = def hello()
print(s)
خروجی تابع مقداری است که داخل s ریخته می شود
نکته : تابع با ورودی و مولفه های پارامتر و آرگومان :
def hello (p):
p پارامتر گویند ( آن را پارامتر مجازی گویند )
print(p)
s = " hello world "
hello (p)
p را آرگومان گویند که صدازدن تابع را انجام می دهد ( آن را پارامتر واقعی گویند )
به طور خلاصه توابع به صورت زیر عمل می کنند :
1- بدنه تابع می تواند دستوری داخل print باشد آنگاه تابع را خارج از بدنه فراخوانی کند :
:()def hello
(' Hello Word ")print
فرامین بدنه تابع و حالا فراخوانی که خارج از آن رخ می دهد این را همان خروجی تابع می گویند :
()hello
2- تابع در بدنه از Return استفاده کند و مقدار خواسته شده را برگرداند :
:()def hello
" return " hello world
در خارج از آن :
()s = hello
(s)hello
3- تابع می تواند ورودی داشته باشد این ورودی همان پامتر است :
:(p)def hello
(p)print
خارج بدنه هم داریم :
s = "Hello World"
hello(s)
ارسال پارامتر ها :
هنگام فراخوانی توابع مقادیر آرگومان ها ی مجازی به پارامترهای واقعی ارسال می گردند این عمل با دو روش صورت می گیرد :
- ارسال پارامتر از طریق مقدار
در این روش ، هنگام فراخوانی مقدار آرگومان مجازی در پارامتر واقعی کپی می شود و بعد این ارتباط قطع می شود تغییر در پارامترها هیچ گونه تاثیری در آگومان متناظر ندارد
- ارسال پارامتر از طریق ارجاع
آرگومان های توابع :
با توجه به نوع آرگومان های تابع می توان فراخوانی های متعددی از یک تابع انجام داد برای توابع می توان انواع آرگومان را معرفی کرد :
- آرگومان اجباری : همانطور که در پارامتر تعریف شدند مرتب باید باشند
- آرگومان های کلمه کلیدی : با کلمات کلیدی باعث می شود برنامه نویس آنها را به ترتیب تغییر دهد
- آرگومان های با مقدار پیش فرض : اگر برنامه نویس در هنگام فراخوانی تابع مقداری برای آن ارسال نکند به طور خودکار مقدار پیش فرض تعیین شده در هنگام تعریف پارامتر برای آن در نظر گرفته می شود
- آرگومان های با طول متغیر : در پایتون می توان پارامترهای متغیر به تعداد مورد نیاز را تعریف کرد این توابع با * شروع می شوند
توابع بی نام :
که به لامدا معروف هستند و کلمه کلیدی def برای آنها استفاده نمی شود به آنها توابع بی نام گفته می شود و در نوشتن آنها از کلمه lambda استفاده می شود برای تعریف نکاتی باید رعایت شود :
- می تواند چندین آرگومان بپذیرد اما تنها یک مقدار را در خروجی بر می گردانند
- توابع بی نام نمی توانند از چندین دستور یا عبارت تشکیل شوند
نمی توان با دستور print آنها را فراخوانی کرد و کلمه کلیدی lambda به یک عبارت نیاز دارد
- این توابع در فضای نام محلی خود هستند و نمی توانند به متغییرهایی که در لیست پارامتری آنها ذکر نشده اند مانند متغیرهای فضای نام سراسری دسترسی داشته باشند تعریف این تابع :
متغیر = lambda پارامتر 1 ... پارامتر n : عبارت
طول عمر و محدوده حضور متغیر ها :
متغیر ها علاوه بر ویژگی های نام ، نوع ، مقدار ، اندازه ، دو ویژگی دیگر دارند که :
- طول عمر متغیر - محدوده حضور متغیر
طول عمر متغیر ===> مدت زمانی که متغیر ها وجود دارند و فضا اشغال می کنند ، طول عمر متغیر نامیده می شود
محدوده حضور متغیر ===> بخشی از برنامه که متغیر قابل استفاده است اگر بخواهید خارج از محدوده حضور متغیر به آن دسترسی داشته باشد با خطا مواجه خواهد شد بنابراین متغیر ها به دو دسته تقسیم می شوند
متغیر های محلی :
متغیرهایی هستند که در داخل بدنه تابع به عنوان پارامتر تابع تعریف می شوند پس و در همان تابع می توان به آن دسترسی داشت و با خاتمه تابع از بین می رود و هیچ اثری از آن نمی ماند و در پشته نگهداری می شوند چون کار پشته همین است
متغیر سراسری :
در بالای برنامه قرار می گیرند و قبل تعریف تابع قرار می گیرند و در تمام بخش های برنامه قابل دسترسی است
دستور Global :
یک تابع می تواند متغیری داشته باشد که در درون آن تعریف می شود و با کلمه کلیدی Global تعریف می شود :
:()def setScope
global scope
scope = "local"
scope = " global "
setScope()
print(scope)
نکته : اگر Global در داخل تابع استفاده شد نیازی به Return کردن ندارد و بیرون هم از آن استفاده شود
توابع بازگشتی :
توابعی که خودشان را صدا می زنند ، دو نوع مستقیم و غیر مستقیم دارند ! فاکتوریل مثال کلاسیکی برای آن است یک مثال معروف مثال پیرزنی است که گربه ای داشت و گربه گوشت هایی که پیرزن در خانه گذاشته بود خورد و پیرزن گربه را به همین دلیل کشت و سپس آن را خاک کرد و در سر خاک او نوشت پیرزنی است که گربه ای داشت و گربه گوشت هایی که پیرزن در خانه گذاشته بود خورد و پیرزن گربه را به همین دلیل کشت
: (n)def f1
: 0 => if n
return 1
: else
(n-2)return n * f1
این مثال تابع مستقیم است
:(n)def f1
: 0 => if n
return 1
: else
(n-2)return n * f1
: (n)def f2
: 0 => if n
return 1
: else
return n * f1(n-2)
" در حال تکمیل شدن "