مبانی زبان
متغیرها در پایتون: انتساب، نامگذاری و جابهجایی مقادیر
متغیر نامی است که به یک مقدار در حافظه وصل میشود تا بعداً با همان نام به آن مقدار دسترسی داشته باشیم.
انتساب با =
علامت = برای انتساب (assignment) است، نه برابری ریاضی:
pi = 3.14159
pi_approx = 22 / 7
print(pi, pi_approx)
در این مثال pi متغیر است و 3.14159 مقدار. پایتون انتساب را در دو قدم انجام میدهد:
- سمت راست را محاسبه میکند تا به یک مقدار برسد.
- آن مقدار را به نام سمت چپ وصل میکند.
برای همین x = x * x در ریاضی بیمعناست، اما در برنامهنویسی کاملاً درست است: «مقدار فعلی x را در خودش ضرب کن و نتیجه را دوباره در x بگذار».
x = 2
x = x * x
y = x + 1
print(x, y)
تغییر اتصال (Rebinding)
میتوانید با یک انتساب جدید، متغیر را به مقدار جدیدی وصل کنید:
pi = 3.14
radius = 2.2
area = pi * (radius ** 2)
radius = radius + 1
print(radius) # 3.2
print(area) # هنوز همان مساحت قبلی (حدود 15.1976) است!
دو نکتهٔ مهم در این مثال هست:
- وقتی
radiusبه3.2وصل میشود، مقدار قبلی (2.2) ممکن است هنوز در حافظه باشد، اما دیگر نامی به آن اشاره نمیکند و دسترسی به آن از دست رفته است. پایتون با سازوکاری به نام جمعآوری زباله (Garbage Collector) این مقدارهای بیصاحب را خودکار از حافظه پاک میکند. (در زبانی مثل C باید خودتان حافظه را آزاد کنید.) - مقدار
areaخودکار بهروز نمیشود. (اینکه پایتون15.197600000000003چاپ میکند بهجای15.1976، به نحوهٔ ذخیرهٔ اعداد اعشاری در کامپیوتر برمیگردد و در درس جواب تقریبی توضیح داده شده.) متغیر یک فرمول نیست؛ فقط نتیجهٔ محاسبه در لحظهٔ اجرای آن خط را نگه میدارد. اگر مساحت جدید را میخواهید، باید آن خط را دوباره اجرا کنید.
نامگذاری متغیرها
قواعد اجباری
- فقط از حروف، ارقام و زیرخط
_استفاده کنید و با رقم شروع نکنید:name2درست است،2nameنه. - بزرگی و کوچکی حروف مهم است:
Ageوageدو متغیر جدا هستند. - کلمات کلیدی ممنوعاند. این کلمهها برای خود زبان رزرو شدهاند، مثل
if،else،for،while،def،return،True،False،None،and،or،not،in،import.
import keyword
print(keyword.kwlist)
قواعد خوب (توصیه)
- توصیفی و معنادار:
ageبهجایa،number_of_repetitionبهجایn. کدی که خودش گویاست، کمتر به توضیح جداگانه نیاز دارد. شما شش ماه بعد از خودتان تشکر خواهید کرد! - در پایتون رسم است نام متغیر با حروف کوچک و کلمهها با
_جدا شوند (snake_case):my_sum،is_prime.
⚠️ دام خطرناک: پایتون اجازه میدهد نام توابع آماده را برای متغیر استفاده کنید، اما با این کار آن تابع را خراب میکنید. اگر بنویسید
str = "salam"یاsum = 0، از آن به بعد دیگر نمیتوانید از تابعstr()یاsum()استفاده کنید. نامهایی مثلlist،str،sum،max،min،input،typeرا برای متغیر انتخاب نکنید.
sum = 10
print(sum([1, 2, 3])) # TypeError: 'int' object is not callable
(در Jupyter اگر چنین اشتباهی کردید، با Kernel › Restart همهچیز به حالت اول برمیگردد.)
جابهجا کردن مقدار دو متغیر
میخواهیم مقدار x و y را با هم عوض کنیم. آیا این روش درست است؟
x = 1
y = 2
y = x
x = y
print(x, y)
نه! خروجی 1 1 است. در خط سوم مقدار 2 از دست میرود، چون y به 1 وصل میشود و دیگر هیچ نامی به 2 اشاره نمیکند.
روش کلاسیک: متغیر کمکی
در همهٔ زبانها (C، C++، جاوا و…) از یک متغیر موقت استفاده میشود تا مقدار قبلی گم نشود:
x = 1
y = 2
temp = y # یک نسخه از y را نگه دار
y = x
x = temp
print(x, y)
روش پایتونی: انتساب همزمان
پایتون اجازه میدهد این کار را در یک خط انجام دهید:
x = 1
y = 2
x, y = y, x
print(x, y)
این جادو نیست: پایتون اول سمت راست را کامل محاسبه میکند و یک تاپل (2, 1) میسازد، بعد مقادیرش را به ترتیب در x و y میگذارد. تاپلها را در بخش ساختمان دادهها کامل میبینیم. با همین روش چند متغیر را همزمان مقدار بدهید:
name, age, city = "سارا", 30, "تهران"
print(name, age, city)
تمرین
بدون اجرا بگویید در پایان مقدار a، b و c چیست:
a = 5
b = a
a = a + 1
c = a * b
a, b = b, a
print(a, b, c)
جواب
5 6 30. وقتی b = a اجرا میشود، b به همان عدد 5 وصل میشود. تغییر بعدی a (به 6) روی b اثری ندارد. بعد c = 6 * 5 = 30 و در آخر جای a و b عوض میشود.