من برای منظم بودن جستارها، جستار کتاب های زیادی رو اینجا بهکار میگیرم؛ یکیش هم "پایتونِ مهربان" هست که با ۸ ویژگی کلیدی پایتون خیلی تند و تیز آشنا میشیم و توی پست ها بعدی هر کدوم رو به صورت مفصل توضیح میدیم.
بخش ۱:گونه دادهایتوی تمام زبانهای برنامه نویسی یک چیز پایهای وجود داره، اونم اینه که به بهترین روش بتونه با آیتمهای دادهای کار کنه و اونها رو نمایش بده. پایتون گونههای دادهای زیادی رو برای بهکارگیری فراهم کرده، ولی ما فعلن دوتا از اونا برای ما اهمیت داره. پایتون برای نمایش اعداد صحیح (integer / whole numbers) منفی و مثبت از گونه int استفاده میکنه و برای نمایش دادن رشتهها (مجموعهای از کارکترها) گونه str استفاده میکنه، اینجا چند مثال از اعداد صحیح و رشتههای
لفظی آورده شده:
-973
210624583337114373395836055367340864637790190801098222508621955072
0
"Infinitely Demanding"
'Simon Critchley'
'پایتون αβγ ÷©'
''
عدد دوم ۲
۲۱۷ هستش، درضمن اعداد صحیح در پایتون تنها به حافظه دستگاه محدود میشن، نه به تعدادِ ثابتی از بایتها، رشتهها میتونن هم با "(double quote) و هم با '(single quote) تعریف بشن (داخل هر دو علامت قرار بگیرن) و تا زمانی که پایتون از یونیکد UTF-8 استفاده کنه، رشتهها فقط به کارکترهای ASCII محدود نمیشن(مثل رشتهی یکی مونده به آخر) و برای تعریف یک رشته خالی بین دو علامت "" و '' نباید چیزی قرار بگیره، مثل رشته آخر.
پایتون برای دسترسی به یک آیتم در یک گونه دادهای ترتیبی مثل رشتهها از [](square brackts / U-turns) استفاده میکنه، برای مثال اگه ما داخل پایتون شل (خود مفسر داخل شل یا IDLE) باشیم، میتونیم با وارد کردن نوشته زیر :
>>> "GNU/Linux"[5]
'i'
>>> "giraffe"[0]
'g'
این خروجی رو دریافت کنیم، با استفاده از [] میتونیم به آیتمهای تمام گونههای دادهای ترتیبی مثل رشتهها، لیستها دسترسی داشته باشیم. این سازگاری در گرامر پایتونِ که اونو به یکی از بهترین زبانها تبدیل کرده. توجه داشته باشید که اندیس در زبان پایتون از صفر شروع میشه.
در پایتون هر دو گونهی str , int تغییر ناپذیر (immutable) هستند و این به معنی که وقتی تعریف میشن، دیگه نمیشه تغییرشون داد(یک بار دیگه درجای دیگه بهشون مقدار داد) شاید این به نظرتون محدودیت به حساب بیاد و با امکاناتی که پایتون فراهم کرده هیچ مشکلی در گرامر و چیزهای دیگه ایجاد نمیکنه. برای این اینارو گفتم که شما شاید پیش خودتون فکر کنید وقتی میشه با [] به آیتمی در یک گونه دادهای ترتیبی (فقط ترتیبی) دسترسی داشت، پس صدرصد میشه آیتمی به اون اضافه و یا حذف کرد ولی این امکان وجود نداره چون هر دو گونه str, int از نوع تغییرناپذیر هستند (پس نمیشه چیزی ازشون کم و یا بهشون اضافه کرد) و به این توجه داشته باشید که در پایتون یک کارکتر به معنای یک رشته با طول ۱ هستش.
برای تبدیل گونههای دادهای به یکدیگر باید از این قانون پیروی کنید (datatype(item، برای مثال:
>>> int(" 45 ")
45
>>> str(912)
'912'
تابع تبدیلی ()int فاصله و فضای خالی رو نادیده میگیره، بنابراین (" 45 ")int هم بدرستی کار میکنه. تابع تبدیل ()str میتونه برای تبدیل اکثر گونههای دادهای بهکار گرفته بشه. ما میتونیم گونههای دادهای خودمون رو بسازیم و قابلیت اینکه از تابع های تبدیلی مثل ()int(), str و دیگر تابعها رو پشتبانی کنند؛ براشون تعریف کنیم.(در پست های بعدی میبینین) اگه تبدیل دادهای شکست بخوره یک استثناء یا واخواهی پیش میاد که روش اداره کردنشون رو بعدا آموزش خواهیم داد.
بخش ۲:شیء مرجعی(اشاره کننده به مرجع)وقتی ما تعدادی گونه دادهای داریم، چیز بعدی که نیاز داریم چندتا متغیرِ که اینارو درونشون ذخیره کنیم. پایتون به معنای واقعی چیزی به اسم متغیر نداره، ولی بجاش یک چیزی به اسم شیء مرجعی (object refrence) داره. وقتی به گونههای تغییرناپذیر میرسیم فرقی بین یک متغیر و یک آبجکت رفرنس وجود نداره، ولی در گونههای تغییرپذیر کمی فرق میکنه، البته توی تمرین زیاد مهم نیست. ما توی این سری آموزش اونجایی که بشه از این کلمات به جای هم استفاده کرد، استفاده میکنیم(بعضی جاها متغیرِ، بعضی جاها آبجکت رفرنس).
خوب بریم سراغ چندتا تمرین کوچیک و دربارشون صحبت کنیم:
x = "blue"
y = "green"
z = x
سینتکسش به این صورته objectRefrence = value. هیچ نیازی به از پیش تعریف کردن یا تعریف گونهی مقداری که قرار در آبجکترفرنس قرار بگیره نیست. وقتی پایتون خط اول رو اجرا میکنه، یک شیء str با متن "blue" میسازه، و بعد یک آبجکت رفرنس به نام x میسازه که به شیء str اشاره میکنه. خط دوم هم به همین شکل. خط سوم یک آبجکت رفرنس به نام z میسازه که به همون آبجکت رفرنس x اشاره میکنه(که اینجا x به شیء str با مقدار "blue" اشاره میکنه).
عملگر = در واقع یک آبجکت رفرنس رو به یک شیء در حافظه وصل میکنه، اگر آبجکت رفرنسی با این نام وجود داشته باشه، دوباره به سر جای اولش برمیگرده به شیءای که درسمت راست عملگر قرار داره وصل میشه؛ اگر این آبجکت رفرنس وجود نداشته باشه توسط عملگر = ساخته میشه.
بریم تمرین بالا رو ادامه بدیم و چندتا دوبارهپیوندی(rebinding) انجام بدیم(مثل z = x که یک آبجکت رفرنس به آبجکت رفرنس دیگه اشاره میکنه)
print(x, y, z) # prints: blue green blue
z = y
print(x, y, z) # prints: blue green green
x = z
print(x, y, z) # prints: green green green
بعد از خط چهارم تمام آبجکت رفرنس ها به یک شیء اشاره میکنن و آبجکت رفرنسی وجود نداره که به شیء str با مقدار "blue" اشاره کنه، برای همین زباله جمعکن پایتون آزاده که زباله هارو جمع کنه( شیء str با مقدار "blue" رو حذف کنه) برای درک بهتر به تصویر زیر خوب نگاه کنید.
Figure 1.1 Object references and objects
برای نامی که برای آبجکت رفرنسها انتخاب میشه(معرف / identifier) یکسری قوانینی وجود داره. از نامهای کلیدی پایتون نمیشه استفاده کرد، باید با یک حرف، ـ(underscore / زیرخط) یا یک رقم شروع بشه. محدودیتی برای طول اسم وجود نداره. تمام عداد و حروف ی که به صورت یونیکد UTF-8 هستند قابل استفاده اند (مثل عدد ۱، ۲ اسمهایی مثل تراکنش، پاسخ، نتیجه و ...) و اسمها فقط به اعداد و حروف کارکتری ASCII محدود نمیشن (“a”,“b”,…,“z”,“A”,“B”,…,“Z”,“0”,“1”,…, “9”). توی پایتون معرفها به حروف کوچک و بزرگ حساس هستند، برای مثال معرفهای LIMIT, Limit و limit هر سه باهم متفاوتاند.
پایتون از گونهدهی پویا(dynamic typing) استفاده میکنه، یعنی اینکه یک آبجکت رفرنس میتونه هر زمانی تعریف بشه و به شیء موردنظرش اشاره کننه، مثل جاوااسکریپت و ... برخلاف اینها زبانهایی مثل Java و ++C که از گونهدهی سخت استفاده میکنند و باید قبل از اینکه یک متغیر تعریف بشه گونهاش مشخص بشه و گرنه اگر مقداری به متغیر داده بشه با خطا مواجه میشه، اونم خطای گرامری نه خطای زمان اجرا(runtime)، پایتون هم اجازه نمیده عملیاتی که مربوط به یک گونهی دادهای نیست صورت بگیره، ولی زبان بهش گونهدهی سخت گفته نمیشه چون ممکنه یک عملیات درست تغییر کنه(درواقع پایتون هم یک زبان گونهدهی پویا و هم یک زبان گونهدهی سخت حساب میشه این موضوع کمی پیچیده است و ما نمیخوایم واردش بشیم، برای اطلاعات بیشتر به
اینجا مراجعه کنید). اگه متوجه نشدید به شکل زیر نگاه کنید:
Figure 1.2 Dynamic Typing
(در یک زمان یک آبجکت رفرنس با نام x تعریف میشه و به یک شیء اشاره میکنه و در همون زمان گونهاش بررسی میشه)
برای اینکه بیشتر متوجه بشید به مثال زیر توجه کنید که یک آبجکت رفرنس به یک شیء دوبارهپیوند داده میشه:
route = 866
print(route, type(route)) # prints: 866 <class 'int'>
route = "North"
print(route, type(route)) # prints: North <class 'str'>
اینجا ما یک آبجکت رفرنس با نام route ایجاد کردیم و وادارش کردیم به مقدار 886 از گونهی int اشاره کنه. الان ما میتونیم از عملگر / استفاده کنیم، چون تقسیم برای اعداد سحیح عمل درستی به حساب میاد. سپس ما دوباره از آبجکت رفرنس route استفاده میکنیم و وادرش میکنیم به مقدار "North" از گونهی str اشاره کنه، پس الان شیء int میره تو سطل آشعال تا زباله جمعکن پایتون جمعآوریش کنه چون دیگه هیچ آبجکت رفرنسی بهش اشاره نمیکنه. پس الان اگه ما از عملگر / (تقسیم) استفاده کنیم با خطای TypeError مواجه میشیم چونکه تقسیم عملگری درستی برای گونهی str به حساب نمیاد(رشته رو نمیشه تقسیم کرد).
تابع ()type گونهی دادهای یک آیتم دادهای رو برمیگردونه(بهش کِلَس هم میگن)-این تابع برای تست و دیباگ کردن برنامه خیلی بدرد میخوره ولی توی سورس کد(برنامه اصلی) ازش استفاده چندانی نمیشه.
اگه شما از IDLE یا پایتون شل استفاده میکنید، نیازی نیست که برای نمایش دادن مقدار آبجکت رفرنس ها از تابع ()print استفاده کنید، اسم آبجکت رفرنسها رو که توی شل یا IDLE بنویسد کافیه، مقدار رو برمیگردونه. برای مثال:
>>> x = "blue"
>>> y = "green"
>>> z = x
>>> x
'blue'
>>> x, y, z
('blue', 'green', 'blue')
این مناسب تر از اینکه از تابع ()print استفاده کنید ولی توجه کنید که این مزیت فقط در ّIDLE و پایتون شل وجود داره و اگر بخواید با استفاده IDE یا ویرایشگر متن کدهای پایتونتون رو بنویسد حتما باید از تابع ()print استفاده کنید.
اگه توجه کرده باشید توی آخرین خروجی مقدار ها با استفاده از کاما جدا شدند، این نشون دهندهی گونهی دادهای توپل / تاپل(چندتایی) هستش، توپل مجموعهای مرتب شده از آبجکتهای تغییرناپذیر هستش. بعدا درباره توپل که یک گونه دادهای اجتماعی هست توضیح داده میشه.
خوب دوستان امیدوارم از این پست نهایت استفاده رو بکنید چون واقعا حدود ۵ ساعت وقت من رو گرفت، چون زبان فارسی در بیان کلمات فنی دچار ضعف هستش خیلی سعی شده که نزدیکترین کلمه که هست استفاده بشه .
لطفا هرگونه خطا گرامری و یا دستوری در نوشته و کدها رو از طریق پ.خ به بنده اطلاع بدید.