مدل ذهنی درست از همین ابتدا
در بسیاری از کتابها متغیر را «جعبهای که مقدار در آن ریخته میشود» معرفی میکنند. برای پایتون این تصویر گمراهکننده است. در پایتون هر مقدار یک شیء (object) در حافظه است و متغیر فقط یک نام یا برچسب است که به آن شیء چسبانده میشود. عبارت price = 1200000 یعنی «یک شیء عدد صحیح بساز و برچسب price را به آن بزن».
price = 1_200_000 # زیرخط فقط برای خوانایی است
discount = price # برچسب دوم روی همان شیء
price = price - 200_000 # شیء جدید ساخته شد؛ price به آن اشاره میکند
print(price, discount) # 1000000 1200000
print(type(price)) # <class 'int'>
print(id(price) == id(discount)) # False
برای اعداد و رشتهها این تفاوت به چشم نمیآید چون این اشیا تغییرناپذیر (immutable) هستند. اما در فصل ۴ میبینید که وقتی دو برچسب به یک لیست اشاره کنند، تغییر از طریق یکی در دیگری هم دیده میشود؛ منشأ یکی از رایجترین باگهای تازهکارها.
تایپ پویا
پایتون نوع را به شیء نسبت میدهد، نه به نام. پس یک نام میتواند اول به عدد و بعد به متن اشاره کند. این آزادی است، نه دعوت: اگر متغیری را برای دو نوع مختلف استفاده کنید، خوانندهی کد (یعنی خود شما در سه ماه بعد) گیج میشود.
قواعد و قراردادهای نامگذاری (PEP 8)
PEP 8 راهنمای رسمی سبک کد پایتون است. قواعد اجباری زبان: نام با حرف یا _ شروع شود، فقط حرف و رقم و _ داشته باشد و کلمهی کلیدی نباشد (class، for، if و…). قراردادها:
| چه چیزی | سبک | مثال |
|---|---|---|
| متغیر و تابع | snake_case | order_count، calc_area() |
| ثابت | UPPER_CASE | TAX_RATE = 0.10 |
| کلاس | PascalCase | CarpetOrder |
| «خصوصی» (قرارداد) | با _ شروع | _cache |
| متغیر دورریختنی | فقط _ | for _ in range(3): |
نام خوب، توضیح میدهد چه چیزی نگه داشته شده، نه چه نوعی: width_cm بهتر از w و بهتر از int_value است. واحد را در نام بیاورید (_cm، _rial)؛ باگهای تبدیل ریال و تومان را با همین کار ساده کم میکنید. تورفتگی استاندارد ۴ فاصله است و طول خط حداکثر ۷۹ تا ۱۰۰ کاراکتر.
انتساب چندگانه
width, length = 250, 350 # دو متغیر در یک خط
width, length = length, width # جابهجایی بدون متغیر کمکی
a = b = 0 # هر دو به همان شیء 0
نکتههایی که کمتر کسی میداند
- نام متغیر فارسی در پایتون ۳ مجاز است (
قیمت = 1000کار میکند)، اما بهخاطر جابهجایی جهت متن و کیبورد، در کد واقعی استفاده نکنید. - نامهایی مثل
list،str،id،typeوsumکلمهی کلیدی نیستند و پایتون جلوی استفاده را نمیگیرد؛ اما باlist = [1, 2]تابع list را تا پایان برنامه از دست میدهید. - پایتون اعداد صحیح -5 تا 256 را از قبل میسازد و بازاستفاده میکند؛ به همین دلیل
isروی اعداد کوچک «کار میکند» و روی اعداد بزرگ نه. برای مقایسهی مقدار همیشه==بنویسید. match،caseوtype«کلمهی کلیدی نرم» هستند؛ میتوانید متغیری به نامmatchداشته باشید و در عین حال ازmatch/caseاستفاده کنید.del xشیء را پاک نمیکند، فقط برچسب را برمیدارد؛ شیء وقتی از حافظه آزاد میشود که هیچ برچسبی به آن اشاره نکند.