تابع پیشرفته

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

یادآوری

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

تابع ()help

در جلسه قبل اشاره کردیم که یکی از دسته های توابع، توابع توکار یا Built in Function ها هستند. توابعی که از قبل تعریف شده‌اند و ما از آن‌ها استفاده می‌کنیم. یکی از کاربردی‌ترین آن‌ها تابع ()help است.

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

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

برای فراخوانی این تابع کافی است در محیط پایتون عبارت ()help را وارد کنیم.

Scope (متغیّرهای Local و Global)

کلمه scope به معنی «قلمرو» است و به ناحیه‌ای گفته می‌شود که در آن یک متغیّر پذیرفته شده و می‌تواند استفاده شود. این ناحیه‌ها local یا global هستند.

قبل از این که منظور از متغیّرهای local و global را توضیح دهیم، بهتر است با معنی خود کلمات local و global آشنا شویم.

کلمه local در فارسی به معنی  «محلّی» ترجمه شده است. برای درک بهتر این کلمه می‌توانید یک محلّه را در نظر بگیرید. جایی که تعدادی خانه و خیابان، یا یکی دو سوپر مارکت موجود و در جمع به نسبت کوچک است.

در مقابل آن کلمه‌ی Global استفاده می‌شود که در فارسی «سراسری» یا جهانی ترجمه شده است. کلمه Global را می‌توان مشابه با یک شهر بزرگ در نظر گرفت. شهر یک ناحیه بسیار بزرگ تر  پر از خیابان است و خودش از چندین محلّه‌ی بزرگ تشکیل گردیده.

مثال:

بیایید برای درک بهتر این موضوع مثالی را ارائه دهیم:

دقیقاً افرادی که در یک محلّه یا یک شهر زندگی می‌کنند را در نظر بگیرید.

فرض کنید یک محلّه داریم و در آن محلّه اکبرآقا فرد معروفی است. اگر اکبر آقا به یک سوپر مارکتی برود، همه او را می شناسند و به او نسیه می‌دهند. چون او یک فرد آشنا است، می‌تواند با تمامی افراد آن محله سلام و علیک داشته باشد.

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

امّا فرض کنید که یک فرد مشهور

مثل سعدی

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

مثال بالا دقیقاً مفهوم متغیّرهای local و global را بیان می‌کند. در مثال بالا  اکبر آقا نقش یک متغیر local و جناب سعدی نقش یک متغیّر global را دارد.

مانند سایر زبان‌های برنامه نویسی، در پایتون نیز متغیرهای local و global وجود دارند. این دو کلمه حوزه کاری متغی،رها را مشخص می‌کنند. امّا منظورمان از متغیرهای local و global چیست؟

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

حال بیایید همه آن چه که در بالا گفته شد را در قالب کد پایتون ببینیم تا به درک بهتری برسیم. کد زیر را در نظر بگیرید:

my_var1 = 3
my_var2 = True
def fucn_1(x):
    new_var = 2
if x == 4:
return new_var
print(new_var)

در کد بالا ما سه متغیر داریم. دو متغیر my_var1 و my_var2 که در ابتدای برنامه تعریف شده اند. متغیر new_var نیز در داخل تابع func_1 تعریف شده است. در انتهای برنامه ما خواسته‌ایم که مقدار متغیّر new_var که داخل تابع تعریف شده است را ببینیم. اگر این کد را اجرا کنیم به نظر شما چه اتفاقی می افتد ؟ (لطفا یک بار خودتان این کد را تست کنید و سپس ادامه این مطلب را بخوانید.)

اگر این کد را اجرا کنیم، با خطا ی زیر روبرو می شویم:

NameError: name 'new_var' is not defined