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


در این قسمت از دوره ی آموزش زبان برنامه نویسی پایتون در سکان آکادمی، می خواهیم به توضیح مفهوم 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 ارجاع می دهد.

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمان
?????
سلام
من می خواستم که اگر لاکپشت فلان رنگ رو لمس کرد آنگاه...
اما نمی دونم که کد لمس کردنن رنگ چیه ؟؟
?????
soldier
soldier
با تشکر حتما تمرین بگذارید همراه با جواب
milad
milad
ممنون خیلی عالی بود.
کاربر میهمان
کاربر میهمان
تا اینجا اموزشون فوق العاده بوده
کاربر میهمان
کاربر میهمان
سلام
عالی بی نقص کامل
مرسی
arman
arman
لطفا برای هر بخش چند تمرین بزارین تا مطالب خوب جا بیوفته با تشکر از سایت خوبتون
mortaza
mortaza
نقل قول:شما می توانید یک متغیر را حتی با استفاده از الفبای فارسی نیز نام گذاری کنید
شما خودت گفتی باید در نام گذاری متغیر ها از حروف کوچک و بزرگ انگلیسی و _ و اعداد(البته نه در اول متغیر) استفاده میشه بعدش گفتی از حروف فارسی هم میتونید استفاده کنید؟؟؟(اصلاح کنید معلومه فارسی نمیشه)
نرگس اسدی
نرگس اسدی
دوست عزیز در زبان پایتون امکان نامگذاری متغیرها با استفاده از کارکترهای فارسی وجود داره و می تونید این مورد رو تست کنید، با این حال جدای از قوانینی مثل این که نباید شناسه ی متغیرها با عدد شروع بشه و ما ملزم به رعایت اون ها هستیم، یک استانداردی برای نامگذاری متغیرها وجود داره که نیازی به رعایت اون ها نیست، با این حال پیروی از این استاندارد باعث میشه کدهای شما تمیز و برای دیگران خوانا باشه. یکی از این استانداردها هم نامگذاری متغیرها با کاراکترهای انگلیسیه.

در پاسخ به

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

در پاسخ به

reza norouzi
reza norouzi
بله آموزش های قبلی رو خوندم و متوجه شدم این موضوع را که فرمودید.
یعنی هیچ راه حلی برای این کار در محیط آید وجود نداره؟

در پاسخ به

محمدهادی
محمدهادی
:| :|

در پاسخ به

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

در پاسخ به

فرهاد فرهادی
فرهاد فرهادی
مثل قبلیها کامل و بی نقص
sahmada
sahmada
با سلام
تا آنجا که بخاطر دارم ، پایتون برای هر خط فرمان محدودیت 255 کاراکتری قائل است.
لطفا توضیح مختصری بفرمایید.
کاربر میهمان
کاربر میهمان
that's good
کاربر میهمان
کاربر میهمان
salam.pas key amozesha update mishe???
ادمین سایت
ادمین سایت
سلام
آموزش های جدید در دست تالیف است و به زودی منتشر خواهد گشت.

در پاسخ به

کاربر میهمان
کاربر میهمان
salam man kama ro nmitnm bzaram ! hame kelidaro hamemtehan krdam :( koli ham tu net gashtam b javabe khasi naresidam
mmnum misham rahnamaii konin
نرگس اسدی
نرگس اسدی
معمولاً با فشار دادن کلید > تو کیبورد کاراکتر camma ظاهر میشه.

در پاسخ به

رضا
رضا
خيلي خوبه.ممنون