توابع

تابع یک مجموعه یا قطعه کدی می باشد که با یک نام خاص یا محدوده اسمی منحصر بفرد شناخته می شوند . بنابراین به دفعات زیادی می توانند اجرا گردند . از طریق توابع می توان پارامتر هایی را به کد مورد نظر ارسال کرده و نتایج حاصله از آن ورودی را دریافت کرد . در نتیجه تابع می تواند در دفعات مختلف اجرا متفاوت باشد . برای تعريف و استفاده از توابع در پایتون از عبارت های ویژه و از پیش تعیین شده def , return و global استفاده می گردد که در ادامه درس به توضیح هر یک پرداخته می شود .

چرا از توابع استفاده می کنیم ؟

قبل از ورود به جزییات بهتر است یک تصویر و دید کلی از توابع و نحوه کار آنها بدست آوریم . بسیار از شما حتما با توابع و نحوه استفاده آن آشنایی دارید . این روش یکی از ساده ترین و در عین هال قوی ترین و پرکاربردترین روش های برنامه نویسی می باشد که هنوز هم استفاده زیادی دارد . توابع در حالت کلی دو نقش و هدف مهم برنامه نویسی را برآورده می کنند .

استفاده مجدد از کد

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

تجزیه رویه ای

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

اصول توابع در پایتون

در فصل های قبل شما با توابع کار کردید ! برای مثال تابع len که طول یک متغییر را بر می گرداند . در این فصل شما یاد خواهید گرفت که توابع جدید ایجاد کنید .

تعریف تابع

با استفاده از عبارت def یک تابع ایجاد شده و نامی به آن تعلق می گیرد . در زبان پایتون برای تعریف یک تابع جدید از دستور def استفاده می گردد . با استفاده از def یک تابع جدید ایجاد شده و اسمی به آن تعلق می گیرد . نام تابع درست بعد از عبارت def ظاهر می گردد در مقابل نام تابع و در داخل پارانتز تنها نام پارامتر های قابل دریافت توسط تابع نوشته می شود و در نهایت همانند سایر قطعه کد های موجود با کاراکتر دو نقطه (:) ختم می گردد . در ادامه و در سطر های بعدی و با رعایت کردن تورفتگی کد های داخل تابع نوشته می شود .

بازگشت مقدار از تابع

زمانی که یک تابع فراخوانی می شود ، فراخواننده تابع تا زمان اتمام کار تابع و برگشت نتیجه تابع منتظر می ماند . در حقیقت روند اجرا برنامه به از سطر فراخوانده شده به داخل تابع منتقل و پس از اتمام کار از سطر بعدی ادامه می یابد . در صورتی که تابعی بخواهد مقداری را به عنوان نتیجه کار برگشت دهد از دستور return برای انجام این کار استفاده می کند .

استفاده از متغییر های سراسری

در حالت معمول تمام متغییر های تعریف شده در داخل تابع محلی می باشند . یعنی طول عمر آنها تا زمان اجرا تابع بوده و فقط از داخل تابع امکان دسترسی را دارند . در صورتی که بخواهیم از نام یا متغییری در خارج از تابع نیز استفاده کنیم از دستور global استفاده می کنیم . این دستور متغییر های محلی را به متغییر های سراسری تبدیل می نماید .

ارسال پارامتر به تابع

در پایتون ارسال متغییر به توابع از طریق مقدار دهی صورت می گیرد . این مقدار دهی و ارسال آرگومان ها به توابع بر خلاف زبانهای C و ++C به صورت مرجع (reference) می باشد . یعنی همان متغییر و نه یک کپی از آن به تابع ارسال می گردد . پس هر گونه دستکاری آن در داخل تابع باعث تغییر متغییر اصلی خواهد شد . حتی با تغییر نام و مقدار دهی دوباره به متغییری جدید باعث ایجاد متغییر جدیدی در حافظه نخواهد شد ! و فقط داده موجود یک نام (اشاره گر) جدید خواهد داشت .

مقدار دهی پیش فرض پارامتر ها

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

def make_omelet2(omelet_type = “cheese”):

حال شما می توانید این تابع را با ورودی یا بدون ورودی فراخوانی کنید .

تابع در داخل تابع

شما می توانید تابعی را درون تابع تعریف کنید . زمانی که می خواهید تابعی بزگتر و پیچیده را به بخش هایی کوچکتر تقسیم کنید می توانید هر یک از این بخش ها را به عنوان یک تابع درون تابع اصلی تعریف کنید . که در این حالت نحوه تعریف همانند تعریف تابع معمولی می باشد . با این تفاوت که از بیرون تابع اصلی نمی توان به توابع عضو دسترسی داشت .

تست پارامتر ها

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

def make_omelet(omelet_type):
    if type(omelet_type) == type():
        print “omelet_type is a dictionary with ingredients”
        return make_food(omelet_type, “omelet”)
    elif type(omelet_type) == type(“”):
        omelet_ingredients = get_omelet_ingredients(omelet_type)
        return make_food(omelet_ingredients, omelet_type)
    else:
        print “I don’t think I can make this : %s” % omelet_type

در این مثال ابتدا نوع متغییر omelet_type بررسی می شود اگر نوع آن دیکشنری باشد نشان دهنده مواد لازم برای تهیه غذا می باشد پس تابع make_food با این دیکشنری و غذایی با نام omelet که به همراه آن ارسال شده فراخوانی و سپس نتیجه از طریق دستور return برگشت داده می شود . در قسمت بعدی (elif معادل else if می باشد ) اگر متغییر ارسالی از نوع رشته باشد فرض بر این خواهد بود که نام نوع خاصی از املت می باشد پس ابتدا از طریق تابع get_omelet_ingredients مواد لازم برای پختن آن را بدست آورده و این مواد را همراه با نام آن به تابعی که کار درست کردن غذا را انجام میدهد ارسال می کنیم . در بقیه موارد پیامی را چاپ می کنیم مبنی بر اینکه نمی توانیم غذای خواسته شده را درست کنیم !!


صفحه قبلی: پایتون
صفحه بعدی: PyGTK