رفتن به مطلب
انجمن تخصصی بات چی | BotChi | انجمن ربات تلگرام

اموزش کامل پایتون به زبان فارسی جلسه هفتم


ارسال های توصیه شده

قراردادن برنامه در فایل

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

توابع

منطق توابع در پایتون شبیه به دیگر زبانهای برنامه نویسی می باشد . برای تعریف یک تابع از کلمه کلیدی def استفاده می کنیم و سپس نام تابع را نوشته و نام پارامتر ها را در داخل پارانتز وارد می کنیم و با قرار دادن دو نقطه روی هم شروع به تایپ متن تابع می کنیم . در صورتی که اولین سطر بعدی یک رشته یاشد این رشته به عنوان توضیحات کنار گذاشته می شود و شما می توانید با متغییر __doc__ عضو کلاس تابع آن را مشاهده کنید .

def in_fridge ():
“””This is a function to see if the fridge has a food.
fridge has to be a dictionary defined outside of the function.
the food to be searched for is in the string wanted_food”””
try:
count = fridge[wanted_food] except KeyError:
count = 0
return count

دیدن مستندات تابع

>>> print “%s” % in_fridge.__doc__
This is a function to see if the fridge has a food.
fridge has to be a dictionary defined outside of the function.
the food to be searched for is in the string wanted_food

مشاهده سایر متغییر ها و توابع عضو کلاس

>>> dir(in_fridge)
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']

متغییر ها و توابعی که با کاراکتر ‘ __ ‘ شروع شده اند خصوصی (private ) می باشند که نوضیحات بیشتر در مورد آنها را در بخش کلاس ها خواهیم آموخت .به هریک از این متغییر ها یا توابع می توان با روشی همانند دسترسی به متغییر __doc__ دسترسی داشت.

استفاده از اسامی یکسان در جاهای مختلف

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

>>> special_sauce = [‘ketchup’, ‘mayonnaise’, ‘french dressing’] >>> def make_new_sauce():
...     “””This function makes a new special sauce all its own”””
...     special_sauce = [“mustard”, “yogurt”] ...     return special_sauce
...

یک لیست با نام special_sauce در ناحیه کاری بالا (top level) ایجاد گردیده است . و تابعی تعریف می شود که ناحیه کاری آن زیر مجموعه ناحیه کاریی می باشد که متغییر مورد نظر در آن تعریف شده است . پس می توان از درون تابع make_new_sauce به یک کپی از متغییر special_sauce دسترسی داشت . در داخل این تابع متغییری هم اسم با متغییر تعریف شده در سطح بالاتر (global) را تعریف می کنیم و مقداری متفاوت با آنچه قبلا تعریف شده را به آن می دهیم . و آن را با دستور return بر می گردانیم . زمانی که این دستورات اجرا شوند شما مشاهده خواهید کرد که مقدار متغییر تعریف شده در ناحیه سراسری بدون تفییر می ماند.

>>> print “%s” % special_sauce
[‘ketchup’, ‘mayonnaise’, ‘french dressing’] >>> new_sauce = make_new_sauce()
>>> print special_sauce
[‘ketchup’, ‘mayonnaise’, ‘french dressing’] >>> print new_sauce
[‘mustard’, ‘yogurt’]

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

ارسال متغییر به تابع

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

def in_fridge(some_fridge, desired_item):
try:
count = some_fridge[desired_item] except KeyError:
count = 0
return count

این تابع را در فایلی با نام func1.py ذخیره کرده و با دستور python -i func1.py اجرا کرده و وارد حالت محاوره ای شوید .

>>> fridge = {‘apples’:۱۰, ‘oranges’:۳, ‘milk’:۲}
>>> wanted_food = “oranges”
>>> in_fridge(fridge, wanted_food)
۳

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

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

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 مواد لازم برای پختن آن را بدست آورده و این مواد را همراه با نام آن به تابعی که کار درست کردن غذا را انجام میدهد ارسال می کنیم . در بقیه موارد پیامی را چاپ می کنیم مبنی بر اینکه نمی توانیم غذای خواسته شده را درست کنیم !!

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   بازگردانی قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • اضافه کردن...