جشنواره نوروزی سون لرن

آموزش مقدماتی پایتون - قسمت چهارم

دسته بندی: پایتون
زمان مطالعه: 8 دقیقه
۲۸ اسفند ۱۳۹۸

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

فهرست محتوای این مقاله

فضای نام در پایتون:

پایتون بر اساس یک مجموعه اصولی بنیان نهاده شده است. برای مشاهده‌ی اصول بنیادی پایتون که به ذن پایتون معروف است، می‌توانید در خط فرمان پایتون import this را تایپ کنید.

در آخرین خط در خصوص ایده‌ی اساسی فضای‌ نام‌ها صحبت می‌کند و باید بیشتر از آن پیش رفت. اما، این موارد اسرارآمیز در فضای‌ نام چیست؟ برای بررسی این موضوع ابتدا بهتر است درمورد نام (name) توضیح دهیم.

نام در پایتون چیست؟

به بیان ساده نام که به آن شناسه (identifier) نیز گفته می‌شود به یک شی اشاره می‌کند. همه چیز در پایتون یک شی است. نام راهی برای دستیابی به اصول شی است. برای مثال وقتی از یک عبارت جایگزینی ساده c=5‌ استفاده می‌شود 5 یک شی ذخیره شده در حافظه و c نامی برای دستیابی به آن شی است. برای گرفتن آدرس این شی در حافظه رم کامپیوتر از تابع داخلی id() استفاده می‌شود. به برنامه زیر توجه کنید.

c = 5
print ('id (5) = ‘, id (5))
print ('id (c) = ',id (c))

خروجی این برنامه:

id (5) =  1722284016

id (c) =  1722284016

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

c = 5
print ('id (5) = ', id (5))
print ('id (c) = ', id (c))

c = c + 1
print ('id (c) = ', id (c))
print ('id (6) = ', id (6))

d = 5
print ('id (5) = ',id (5))

خروجی

id (5) =  1722284016

id (c) =  1722284016

id (c) =  1722284032

id (6) =  1722284032

id (5) =  1722284016

شما فکر می‌کنید که چه اتفاقی افتاده است؟ به شکل زیر توجه کنید:

namespace python 01

ابتدا شی 5 ساخته می‌شود، سپس نام c به آن وابسته خواهد شد. وقتی که c=c+1 انجام می‌شود، شی جدید 6 ساخته خواهد شد و c به شی جدید 6 وابسته می‌شود. همان‌طور که در خروجی برنامه ملاحظه می‌شود شناسه c و 6 یکسان است. علاوه بر آن وقتی d=5 اجرا می‌شود نام جدید d به شی 5 وابسته خواهد شد. این قدرت و توان پایتون است که یک شی جدید نمی‌سازد. این طبیعت دینامیکی بهم‌پیوستگی نام‌ از پایتون، یک زبان برنامه‌نویسی قدرتمند ساخته است. یک نام می‌تواند به نمونه‌ای از اشیا با نوع متفاوت اشاره کند.

l = 7
print ('id (l) = ', id(l))
l = '7learn.ac'
print ('id (l) = ', id(l))
l = [1,2,3]
print ('id (l) = ', id (l))

خروجی

id (l) =  1722284048

id (l) =  10093296

id (l) =  9917832

همان‌طور که ملاحظه می‌شود نام (l) به سه نوع شی با نمونه‌های متفاوت اشاره می‌کند و در مقابل شناسه آن برای هر نوع شی متفاوت است. در پایتون توابع نیز شی هستند و در نتیجه می‌توان توسط یک نام به آن اشاره کرد.

def helloPrint():
    print ('Hello 7learn.ac') 
m = helloPrint()
print('id (m) = ',id(m))

خروجی

Hello 7learn.ac

id (m) =  1722195176

فضای نام در پایتون چیست؟

حال که درک درستی و دقیقی از نام پیدا شد، می‌توانیم به مفهوم فضای نام یا namespace بپردازیم. به عبارت ساده، می‌توان گفت که فضای‌ نام یک مجموعه از نام‌ها است. در پایتون، فضای نام را می‌توان به عنوان نگاشتی از هر نام ( که شما تعریف کرده‌اید ) به اشیا متناظر آن تعریف کرد. در هر لحظه، فضای‌ نام‌های متفاوت می‌توانند وجود داشته باشند اما، کاملا از هم جدا و نسبت به هم ایزوله هستند.

یک فضای‌ نام شامل کلیه نام‌های داخلی است که هنگام شروع به کار پایتون ایجاد می‌شود. این فضای‌ نام به این دلیل که توابع داخلی مانند id()، print() و غیره همیشه و همه‌جا در دسترس ما باشند، ساخته می‌شود. هر ماژول به طور اتوماتیک یک فضای نام سراسری (global namespace) برای خودش ایجاد می‌کند. این فضای‌ نام‌ها متفاوت از هم جدا هستند، به همین دلیل نام‌های یکسان در دو فضای نام متفاوت با هم تداخل ندارند، زیر از هم جدا هستند.

ماژول‌ها می‌توانند دارای توابع و کلاس‌های متفاوت و گوناگون باشند. وقتی که یک تابع فرخوانی می‌شود یک فضای‌‌ نام محلی (local namespace) ایجاد می‌شود که می‌تواند نام‌های تعریف ‌شده خاص خود را که به اشیای مورد نظری اشاره می‌کند را شامل شود.

namespace python 02

برای داشتن یک نام یکتا برای هر شی ( متغیر یا متد ) در پایتون از فضای نام (Namespace) استفاده می‌شود. پایتون خود دارای یک فضای نام در قالب یک دیکشنری است. به عنوان مثال ساختار پوشه‌های فایل را در یک رایانه در نظر بگیرید. واضح است که دو فایل هم‌نام را در چند پوشه می‌توان قرار داد، اما برای دسترسی به فایل مورد نظر باید مسیر کامل دسترسی به آن را مشخص کرد.

برای روشن شدن موضوع، مثالی در زندگی روزمره را در نظر بگیرید. نام‌ خانوادگی مانند فضای نام است بدین معنی که در یک کلاس درس ممکن است که چندین علی وجود داشته باشد ولی علی عسگری یکتا است. ( در این مثال فرض شده که از هر نام‌خانوادگی فقط یکی وجود دارد).

به طور مشابه، مترجم یا مفسر پایتون بسته به فضای‌ نام می‌تواند تشخیص دهد که کدام متد یا متغیر در کد برنامه فراخوانی شده است. هم‌چنین، با تقسیم واژه‌ی انگلیسی فضای‌ نام namespace‌ به دو واژه‌ی name و space توجه کنید. واژه‌ی name به معنای شناسه و space نیز به معنای فضا یا محدوده است. بنابراین ترکیب این دو با هم به معنی شناسه‌‌ای یکتا که در محدوده‌ی معین معنا دارد. در اینجا، شناسه اشاره به یک متد یا متغیر است.

دامنه‌ی عملکرد متغیر در پایتون:

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

  • دامنه تابع جاری که دارای نام‌های محلی است.
  • دامنه ماژول دارای نام‌های سراسری است.
  • بیرونی‌ترین دامنه که دارای نام‌های داخلی است.

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

مثال ۱:

def outer_function():
    b = 20
    def inner_function():
        c = 30
a = 10

در این‌جا متغیر a در فضای‌ نام سراسری، متغیر b در فضای‌ نام محلی outer_function() و c‌ در فضای‌ نام محلی داخلی innetr_function()‌ است.

وقتی‌که مفسر پایتون در تابع inner_function()‌ است متغیر c برای ما محلی یا local، b غیر‌محلی یا nonlocal و a سراسری یا global است.

اگر مفسر پایتون در داخل تابع inner_function()‌ باشد، چنانچه در نظر داشته باشیم که مقادیر متغیر‌های a و b را تغییر دهیم پایتون در فضای‌ نام محلی دو نام جدید a و b ایجاد می‌کند و شی مربوطه را به آن نسبت می‌دهد.

مثال 2:

# Python program showing 
# a scope of object 

def some_func(): 
	print("Inside some_func") 
	def some_inner_func(): 
		var = 10
		print("Inside inner function, value of var:",var) 
	some_inner_func() 
	print("Try printing var from outer function: ",var) 
some_func()

خروجی:

Inside some_func

Inside inner function, value of var: 10

Traceback (most recent call last):

File "/home/1eb47bb3eac2fa36d6bfe5d349dfcb84.py", line 8, in

some_func()

  File "/home/1eb47bb3eac2fa36d6bfe5d349dfcb84.py", line 7, in some_func

print("Try printing var from outer function: ",var)

NameError: name 'var' is not defined

طول عمر یک فضای نام:

طول عمر یک فضای‌ نام بستگی به دامنه‌ی نام‌ها و اشیا وابسته آن دارد، اگر کنترل مفسر پایتون به انتهای دامنه‌ی یک نام یا شی در یک فضای‌ نام برسد، آن فضای‌ نام از بین می‌رود که آن را طول عمر آن فضای نام می‌گویند. از این رو، دسترسی به اشیای فضای‌ نام داخلی از یک فضای نام بیرونی، ممکن نیست.

مثال:

# var1 is in the global namespace 
var1 = 5
def some_func(): 

	# var2 is in the local namespace 
	var2 = 6
	def some_inner_func(): 

		# var3 is in the nested local 
		# namespace 
		var3 = 7

همان‌طور که در شکل زیر می‌بینید، نام شی یکسان، می‌تواند در چندین فضای‌ نام وجود داشته باشد، زیرا در فضای‌ نام‌های متفاوت بین نام‌ها و شی وابسته به آن جداسازی انجام می‌شود.

scope python

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

# Python program processing 
# global variable 

count = 5
def some_method(): 
	global count 
	count = count + 1
	print(count) 
some_method()

خروجی :

6

نتیجه گیری

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

سعی ما این بوده که با سادگی برنامه نویسی پایتون را به شما آموزش دهیم

در قسمت پنچم این آموزش، مباحث مربوط به عبارات، تورفتگی و توضیحات در پایتون، را شرح خواهیم داد.

چه امتیازی به این مقاله می دید؟

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :