آشنایی با مفهوم متغیر در زبان برنامه نویسی پایتون


آشنایی با مفهوم متغیر در زبان برنامه نویسی پایتون


در این قسمت از دوره ی آموزش زبان برنامه نویسی پایتون در سکان آکادمی، می خواهیم به توضیح مفهوم Variable یا متغیر بپردازیم. در آموزش آشنایی مقدماتی با مفهوم شیء گرایی در زبان برنامه نویسی پایتون، با مفهوم برنامه نویسی شیء گرا آشنا شدیم و دیدیم که به منظور توسعه ی نرم افزار با زبان برنامه نویسی Python، می توانیم از کلاس های مختلف از پیش ساخته شده یا کلاس های جدیدی که خودمان آن ها را تعریف می کنیم، به هر تعدادی که نیاز داشته باشیم نمونه -یا بهتر بگوییم آبجکت- بسازیم و از آن ها در نرم افزارهای خود استفاده کنیم.

بنابراین لازم است که برنامه ی ما اطلاعات آبجکت هایی را که می سازیم به خاطر بسپارد تا بعداً بتواند از آن ها استفاده کند. برای این کار، مفسر پایتون از حافظه ی کامپیوتری که برنامه روی آن اجرا می شود استفاده می کند، به این صورت که برای ذخیره ی هر آبجکت دلخواه مثل یک عدد صحیح، یک استرینگ، یک تصویر، یک قطعه موسیقی و یا سایر آبجکت هایی که بعداً نحوه ی ساخت آن ها را خواهیم آموخت، مکانی از حافظه ی کامپیوتر را به آن اختصاص می دهد که این مکان آدرس منحصر به فردی دارد که به صورت یک عدد مثل 0000 0000 0111 1101 است.

پس اگر بخواهیم مجدداً از آن آبجکت در برنامه ی خود استفاده کنیم لازم است که دقیقاً آدرس جایی از حافظه ی کامپیوتر که شیء مد نظر ما در آن جا ذخیره شده است را بدانیم و آن را در اختیار مفسر پایتون بگذاریم تا بتواند به آن مکان مراجعه کرده و اطلاعات آبجکت را به دست آورد. اما به خاطر سپردن یا حتی تهیه ی لیستی از تمام این آدرس ها و استفاده از آن ها کاری بسیار سخت است که فرآیند کدنویسی را به شدت کند کرده و امکان اشتباه را به مراتب زیاد می کند!

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

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

حال با هم خواهیم دید که چه طور می توانیم یک متغیر را در زبان برنامه نویسی پایتون تعریف کنیم. وارد پنجره ی Shell در IDLE شوید و دستورهای زیر را در آن تایپ کنید:

>>> Name = "SokanAcademy.com"  >>> Age = 2  

در حقیقت با وارد کردن این دستورات، دو متغیر را با نام های Name و Age ایجاد کردیم. متغیر Name به صورت برچسبی به یک آبجکت از جنس استرینگ با مقدار SokkanAcademy.com الصاق شده و متغیر Age به یک داده ی عددی با مقدار 2 منتسب شده است. اکنون نام این متغیرها را در Shell صدا می زنیم تا ببینیم مفسر چه اطلاعاتی را در اختیار ما خواهد گذاشت:

>>> Name  'SokanAcademy.com'  >>> Age  2  >>>  

همان طور که می بینید، در پنجره ی Shell، وقتی متغیر Name را وارد کنیم مفسر همان آبجکت استرینگ ‘SokanAcademy.com’ که به آن منتسب کرده بودیم را در خروجی نمایش می دهد، و با وارد کردن متغیر Age نیز مقدار عددی 2 را در پنجره چاپ می کند.

در ادامه قصد داریم نحوه ی تعریف یک متغیر را با جزئیات بیش تر بررسی کنیم. در دستورات بالا اولین چیزی که مشخص کردیم نام متغیر بود. نام متغیر یک Identifier یا شناسه است. در حقیقت، شناسه نمادی است که از آن برای شناسایی متغیرها، متدها، کلاس ها، و سایر اجزای برنامه که نیاز به نام گذاری دارند استفاده می شود. شناسه ها به صورت دلخواه تعیین می شوند، یعنی شما هر نام دلخواهی را می توانید به یک متغیر بدهید. با این وجود، در زبان برنامه نویسی پایتون قواعدی برای انتخاب شناسه ها وجود دارد:

1- اولین کاراکتر هر شناسه تنها یکی از حروف بزرگ یا کوچک الفبا و Underscore (یا همان کاراکتر _) است.

2- اگر بخواهیم شناسه ای با بیش از یک کاراکتر انتخاب کنیم می توانیم هر ترکیب دلخواه از حروف بزرگ و کوچک الفبا، کاراکتر _ و ارقام 0 تا 9 را در ادامه بیاوریم.

هشدار

باید توجه کنیم که:
استفاده از فاصله یا Space در شناسه مجاز نیست.
استفاده از کاراکترهایی مانند .، @، $، #، %، !، ?، و … در شناسه ها مجاز نمی باشد.
شناسه ها نباید از میان کلمات کلیدی یا Keyword های پایتون انتخاب شوند. کلمات کلیدی شناسه هایی هستند که طراحان زبان پایتون آن ها را به صورت پیش فرض برای مفسر این زبان تعریف کرده اند و استفاده از آن ها در زمان کدنویسی معنای خاصی را به مفسر می رساند و ما اجازه نداریم به جز مصارف خاصی که برای آن ها در نظر گرفته شده است، برای کار خاص دیگری بسته به نیاز خود از آن ها استفاده نماییم!

با استفاده از دستور ()help به صورت زیر می توانیم به فهرستی از این کلمات در هر نسخه ای از پایتون دست پیدا کنیم:

>>> help("keywords")    Here is a list of the Python keywords.  Enter any keyword to get more help.    False               def                 if                  raise  None                del                 import              return  True                elif                in                  try  and                 else                is                  while  as                  except              lambda              with  assert              finally             nonlocal            yield  break               for                 not                   class               from                or                    continue            global              pass      

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

I   number2   object_name   MyVar   __var1  _n  setColor   PS2  

هم چنین استفاده از مثال های زیر به عنوان شناسه در کدهای نوشته شده به زبان پایتون مجاز نیست:

Object.color   1name   8   m@mail   True   $sign   2c#  

سعی کنید با توجه به نکات گفته شده، دلیل غیر مجاز بودن شناسه های بالا را حدس بزنید!

در زبان برنامه نویسی پایتون، استانداردی برای نام گذاری متغیرها وجود دارد. بر اساس این استاندارد نام یا شناسه مناسب برای متغیرها تنها از کاراکترهایی با حروف کوچک انگلیسی تشکیل می شود که در صورت انتخاب نام چند بخشی کاراکترهای آن با _ از هم جدا می شوند. بر اساس این استاندارد، شناسه هایی مانند name یا object_name شناسه های استاندارد برای نام گذاری متغیرها هستند. هیچ اجباری برای رعایت این استانداردها وجود ندارد و شما می توانید یک متغیر را حتی با استفاده از الفبای فارسی نیز نام گذاری کنید، اما باید بدانید که پیروی از آن ها باعث می شود خوانایی برنامه هایی که می نویسیم بیش تر شود.

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

نکته
زبان برنامه نویسی پایتون نسبت به حالت حروف حساس است و بین حروف کوچک و بزرگ تمایز قائل است. به عبارت دیگر، این زبان Case Sensitive است و از همین رو است که هر یک از شناسه های NUM، num، Num، nUm، nuM، NUm، NuM، و nUM یک شناسه ی متمایز برای مفسر هستند.

در تعریف یک متغیر برای مفسر، پس از انتخاب نام مناسب و نوشتن آن از عملگر یا Operator انتساب که با نماد = مشخص می شود استفاده می کنیم. عملگرها نمادهایی هستند که عمل خاصی را روی عناصر برنامه که به آن ها Operand یا عملوند می گوییم انجام می دهند. در حالت معمول = دو عملوند می گیرد، یکی در سمت چپ خود و دیگری در سمت راست، به گونه ای که عملوند سمت راست را به عملوند سمت چپ منتسب می کند. گفتیم که در یک دستور انتسابی عملوند سمت چپ نام یک متغیر است، و با توجه به مثال های ابتدایی عملوندی هم که در سمت راست قرار می گیرد یک آبجکت دلخواه از هر نوعی متناسب با نیاز برنامه است. وقتی به این طریق یک دستور انتسابی را می نویسیم و برنامه را اجرا می کنیم، مفسر با رسیدن به دستوری این چنین به صورت زیر عمل می کند:

ابتدا آبجکتی را که در سمت راست = قرار دارد ایجاد می کند و آن را در محلی از حافظه ی کامپیوتر ذخیره می کند. آن گاه در صورتی که متغیری با نامی که در سمت چپ = قرار دارد در حافظه وجود نداشته باشد آن را در محل دیگری از حافظه ایجاد و ذخیره می کند. در مرحله ی آخر متغیر را به صورت برچسبی به آبجکت تعریف شده می چسباند یا اصطلاحاً به آن Reference یا ارجاع می دهد.

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

2- پس از آن که برای اولین بار یک متغیر را تعریف کردیم می توانیم آبجکتی که به آن اشاره می کند را تغییر دهیم. به مثال زیر توجه کنید:

>>> i = 10  >>> i  10  >>> i = 20  >>> i  20  >>> i = "number"  >>> i  'number'  

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

3- فرض کنید بخواهیم متغیری را تعریف کنیم که فعلاً به آبجکت خاصی ارجاع نداشته باشد. در این صورت در سمت راست عملگر تساوی به جای تعریف یک آبجکت جدید از کلمه ی کلیدی None استفاده می کنیم:

>>> i = None  >>> i  >>>  

می بینیم که با فراخوانی متغیر i مفسر هیچ مقداری را نمایش نمی دهد و تنها کاری که می کند این است که نام متغیر را در حافظه ی کامپیوتر ذخیره می کند تا بعداً از آن برای ارجاع به یک آبجکت استفاده کنیم (توجه داشته باشید که None یک کلیدواژه ی از پیش تعریف شده در زبان پایتون است و هرگز نمی بایست به جای آن از none استفاده کنید.)

4- در زبان برنامه نویسی Python این امکان وجود دارد که در یک دستور انتسابی، چند متغیر را به صورت هم زمان به تعدادی آبجکت منتسب کرد. به طور مثال دستورات زیر را در نظر بگیرید:

>>> first_name , last_name , age = "Narges" , "Asadi" , 25  >>> first_name  'Narges'  >>> last_name  'Asadi'  >>> age  25  >>>  

در دستور اول، برای انتساب آبجکت های مختلف به متغیرها از یک عملگر = و ویرگول استفاده کرده ایم و آن گاه با فراخوانی متغیرها ترتیب انتساب ها را در خروجی می بینیم که چه طور اولین متغیر از سمت چپ تساوی یعنی first_name به اولین آبجکت از سمت راست که استرینگی با مقدار “Narges” است ارجاع داده می شود و به همین ترتیب پیش می رود. نکته مهم در این جا آن است که حتماً باید تعداد متغیرهای سمت چپ با تعداد آبجکت های سمت راست برابر باشد که در غیر این صورت با خطا مواجه خواهیم شد. برای نمونه خروجی قطعه کدهای زیر را ببینید:

>>> first_name , last_name , age = "Narges" , "Asadi"  Traceback (most recent call last):    File "<pyshell#0>", line 1, in       first_name , last_name , age = "Narges" , "Asadi"  ValueError: not enough values to unpack (expected 3, got 2)  >>> first_name  Traceback (most recent call last):    File "<pyshell#1>", line 1, in       first_name  NameError: name 'first_name' is not defined  

همان طور که مشخص است چون متغیرها سه تا هستند اما در سمت راست تساوی دو آبجکت وجود دارد، مفسر پایتون با رسیدن به این دستور انتسابی اعلام خطا می کند و هیچ یک از متغیرها را به آبجکت های سمت راست ارجاع نمی دهد، به طوری که با فراخوانی متغیر اول یعنی first_name اعلام می کند که این نام تعریف نشده است.

5- هم چنین این قابلیت در پایتون وجود دارد که در قالب یک دستور انتسابی، یک آبجکت را به چندین متغیر منتسب کنیم. برای مثال دستورات زیر را در IDLE وارد کنید:

>>> i = j = k = 5  >>> i  5  >>> j  5  >>> k  5  

همان طور که می بینید هر سه متغیر i، j، و k به یک آبجکت از نوع عدد صحیح با مقدار 5 ارجاع می دهند. حال ممکن است این سؤال پیش آید که اگر مقدار یکی از این متغیرها تغییر کند آیا مقدار متغیرهای دیگر نیز تغییر می کند؟ اجازه دهید این مورد را بررسی کنیم:

>>> i = 10  >>> i  10  >>> j  5  >>> k  5  

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

نکته
در حین تعریف یک متغیر، عملوند سمت راست عملگر تساوی می تواند یک متغیر دیگر نیز باشد.

به طور مثال دستورات زیر را در نظر بگیرید:

>>> i = 5  >>> j = i  >>> j  5  >>> i = 9  >>> j  5  

همان طور که می بینید ابتدا متغیر j را با استفاده از متغیر i تعریف کردیم، با این وجود بر اساس توضیحات قبل با تغییر ارجاع i به آبجکت جدیدی با مقدار 9، متغیر j هم چنان به همان آبجکت قبلی یعنی داده ی عددی 5 ارجاع می دهد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *