این جلسه، اولین جلسه از مبانی اولیه برنامه نویسی با زبان پایتون است. برای شروع کار با پایتون باید ابتدا مبانی اولیه آن را یاد بگیریم.
برای اینکه به یک برنامه نویس واقعی تبدیل شوید، فارغ از اینکه با چه زبانی شروع کرده اید، باید چهار مبحث اصلی را به طور کامل یاد بگیرید:
در زبان پایتون انواع داده های مختلفی وجود دارد شما می توانید نوع داده های موجود در این زبان را در لیست زیر مشاهده کنید:
به این نوع داده ها fundamental data types (انواع داده بنیادین) می گویند. چرا بنیادین؟ به دلیل اینکه در هسته اصلی پایتون قرار دارند و به صورت پیش فرض در اختیار شما هستند. همانطور که قبلا توضیح دادم هر کدام از این انواع داده، روشی خاص برای ذخیره سازی داده های شما دارند و بسته به نیاز شما در یک برنامه، از یکی از آن ها استفاده خواهید کرد. ما باید ابتدا با انواع داده ها آشنا شویم و سپس روش های مختلف برای ویرایش آن ها را نیز یاد بگیریم تا بتوانیم داده های مختلفی را در آن ها ذخیره کنیم. پس از fundamental data types نوبت به کلاس ها می رسد که به ما اجازه می دهند انواع داده خودمان را بنویسیم به همین دلیل به این قسمت custom types (انواع داده شخصی سازی شده) می گوییم و در طول دوره با آن ها آشنا خواهیم شد. در دسته سوم نیز specialized data types (انواع داده تخصصی) قرار دارند که به صورت پیش فرض در زبان پایتون وجود ندارند، بلکه پکیج ها یا ماژول های آماده ای هستند که مانند کتابخانه ها مورد استفاده قرار می گیرند. در نهایت و در دسته چهارم نوع داده خاصی به نام none (به معنی «هیچ») را داریم که مانند صفر در ریاضی است و به عدم وجود یک مقدار اشاره می کند. ما در طول دوره با این انواع داده آشنا خواهیم شد بنابراین جای نگرانی نیست.
نکته: در پایتون نوع داده دیگری به نام complex وجود دارد که بسیار پیشرفته است و تقریبا فقط در محاسبات سنگین ریاضی از آن استفاده می شود. ما به دلیل کاربردی نبودن این نوع داده آن را در این دوره بررسی نمی کنیم.
برای کار با اعداد دو نوع داده int و float در پایتون را داریم که به ترتیب به اعداد صحیح (integer) و اعداد اعشاری (floating point number) اشاره می کنند. ما می توانیم در زبان پایتون عملیات های ریاضی را با اعداد انجام بدهیم که در تمام زبان های برنامه نویسی موجود است:
print(4 + 2) print(4 * 2) print(4 - 2) print(4 / 2)
اگر کدهای بالا را در repl.it یا وب سایت مورد نظرتان وارد کنید نتایج این عملیات های ریاضی را مشاهده خواهید کرد. هر دو این اعداد (اعداد دو و چهار) integer یا عدد صحیح هستند چرا که هیچ قسمت اعشاری ندارند. ما می توانیم با دستور type در زبان پایتون متوجه بشویم که نوع داده یک مقدار خاص چیست. مثلا:
print(type(4 + 2))
در این کد ابتدا اعداد ۴ و ۲ باهم جمع می شوند و نتیجه خود را به type می دهند. تایپ نتیجه را مشاهده می کند (عدد ۶) و می گوید نوع داده ۶ یک integer است و آن را به print پاس می دهد و در نهایت print نیز این نوع داده را چاپ می کند. حتما متوجه شده اید که type نیز یک action است چرا که عملیات خاصی را انجام می دهد (نوع داده را تعیین می کند). با اجرای کد بالا نتیجه زیر را دریافت خواهیم کرد:
<class 'int'>
ما هنوز با کلیدواژه class آشنا نشده ایم، بنابراین آن را نادیده بگیرید اما int (مخفف integer) برایمان واضح است و می توانیم بفهمیم که نتیجه همان عدد صحیح بوده است. حالا سوال دیگری از شما دارم. اگر دستور زیر را بنویسیم چه نتیجه ای می گیریم؟
print(type(2 / 4))
طبیعتا نتیجه به شکل زیر خواهد بود:
<class 'float'>
چرا؟ به دلیل اینکه ۲ تقسیم بر ۴ برابر با 0.5 است و یک رقم اعشار دارد و ما می دانیم که اعداد اعشاری در پایتون از نوع داده float هستند.
شاید بپرسید چرا باید بین اعداد صحیح و اعشاری تفاوت قائل شویم؟ چرا نوع داده های مختلفی را برایشان داریم؟ آیا نمی توانیم از آن ها یکجا و به عنوان «عدد» استفاده کنیم؟ پاسخ خیر است! ما این تفاوت ها را قائل شده ایم چرا که ذخیره اعداد اعشاری، حافظه بسیار بیشتری نسبت به اعداد صحیح اشغال می کند. حافظه یا RAM یا همان مموری دستگاه شما محدود است و نباید به هیچ بهانه ای آن را هدر بدهیم بنابراین استفاده از این دو نوع داده مختلف باعث هدر نرفتن مموری خواهد شد. یادتان باشد که کامپیوترها کدهای ما را نمی فهمند و این کدها در هنگام اجرا به باینری تبدیل می شوند، بنابراین باید در حافظه سیستم ذخیره شوند تا عملیات تمام شود. مشکل اینجاست که تبدیل اعداد اعشاری به باینری کار سختی است چرا که در وسط خود یک نقطه (نقطه اعشار) را دارند. به همین دلیل کامپیوترها عددی مثل 10.25 را به صورت دو عدد جداگانه 10 و 25 ذخیره می کنند.
حالا سوال دیگری از شما دارم. به نظر شما اگر دستور زیر را اجرا کنیم چه نتیجه ای می گیریم؟
print(type(9.9 + 0.1))
حتما می گویید ۹.۹ به علاوه ۰.۱ می شود ۱۰ بنابراین integer را دریافت خواهیم کرد اما در اصل مقدار زیر را می گیریم:
<class 'float'>
چرا؟ بیایید قسمت type را حذف کنیم:
print(9.9 + 0.1)
با اجرای کد بالا عدد 10.0 را دریافت خواهیم کرد! در واقع دو عدد float یا یک float و یک integer همیشه نتیجه float (اعشاری) دارند. البته جمع و تفریق و ضرب و تقسیم تنها عملیات های ریاضی ممکن در پایتون نیستند. به طور مثال برای استفاده از توان می توان گفت:
print(5 ** 2)
علامت دو ستاره به معنی «توان» است بنابراین کد بالا می گوید ۵ به توان ۲ (نه ۵ ضرب در ۲) که نتیجه اش ۲۵ خواهد شد. همچنین اگر در مواقعی بخواهیم دو عدد را تقسیم کنیم اما نتیجه همیشه به یک عدد صحیح گِرد شود می توانیم از دستور // استفاده کنیم:
print(5 // 4)
ما می دانیم که ۵ تقسیم بر ۴ برابر 1.25 است اما نتیجه دستور بالا ۱ خواهد بود. چرا؟ همانطور که گفتم استفاده از اپراتور // باعث گِرد شدن نتیجه می شود. اگر از ریاضی دبیرستان به یاد داشته باشید گِرد کردن اعداد دو حالت داشت:
همچنین اپراتوری به نام modulo داریم که همان علامت درصد (%) است اما درصد گیری نمی کند بلکه کارش محاسبه باقی مانده یک تقسیم است. به طور مثال:
print(6 % 4)
یعنی اگر ۶ را بر ۴ تقسیم کنیم، باقی مانده این تقسیم چقدر می شود؟ نتیجه برگردانده شده عدد ۲ می باشد.
توابع یا همان function ها یک action هستند چرا که یک کار خاص را برای ما انجام می دهند. به طور مثال print یک تابع است که کارش چاپ کردن یک مقدار می باشد. ما در آینده یک فصل کامل را به توابع اختصاص می دهیم اما فعلا در همین حد بدانید که توابع مسئله پیچیده ای نیستند.
دسته ای از توابع هستندد که فقط برای کار با اعداد طراحی شده اند و در هنگام انجام عملیات های مختلف کار ما را بسیار ساده تر می کنند. به طور مثال برای گِرد کردن اعداد تابعی به نام round داریم:
print(round(3.9))
ما در دستور بالا عدد ۳.۹ را به تابع round پاس داده ایم. کار این تابع گِرد کردن اعداد است بنابراین آن را به ۴ تبدیل می کند و سپس به print پاس می دهد. به همین دلیل پس از اجرای این کد، عدد ۴ را دریافت خواهید کرد.
همچنین تابع دیگری به نام abs (مخفف absolute) داریم که برای محاسبه قدر مطلق اعداد استفاده می شود:
print(abs(-20))
ما می دانیم که «قدر مطلق» در ریاضی به معنای مقدار حقیقی یک عدد بدون در نظر گرفتن علامت آن است. به عبارتی هیچ عدد منفی از قدر مطلق عبور نمی کند بلکه همه چیز به عدد مثبت تبدیل می شود بنابراین دستور بالا مقدار ۲۰ را برایمان چاپ می کند. در واقع تعداد این توابع بسیار زیاد است و نمی توان در چند جلسه ساده همه آن ها را بررسی کرد. همچنین نیازی به بررسی تک تک آن ها نیز نمی باشد چرا که زمان گیر است و سودی ندارد. به هر حال در صورتی که دوست دارید لیستی از توابع ریاضی در پایتون را مشاهده کنید به وب سایت های مختلفی از جمله سایت رسمی پایتون یا جست و جو در گوگل و پیدا کردن سایت های جانبی مراجعه کنید. بسیاری از این توابع آنقدر کم استفاده هستند که احتمالا هیچ وقت از آن ها استفاده نکنید مگر اینکه برای پروژه خاصی مورد نیاز باشند. به همین دلیل است که می گویم با حفظ کردن آن ها وقت خود را هدر خواهید داد.
در طول این دوره سرتیترهایی به نام «مهارت یادگیری» خواهیم داشت که شماره گذاری نیز شده اند. من در این بخش ها نکاتی را برایتان توضیح می دهم که برای افراد تازه کار حیاتی و ضروری هستند و باید حتما آن ها را مطالعه کنید. این نکات به شما کمک خواهند کرد که در مسیر یادگیری از اشتباهات رایج دوری کرده و از روش های عملی و توصیه شده استفاده کنید. این بخش، اولین بخش از مهات یادگیری است و موضوع آن حفظ کردن لیست توابع و دستورات مختلف در یک زبان برنامه نویسی است.
در واقع یکی از جملاتی که بین توسعه دهندگان رد و بدل می شود جمله don't read the dictionary است که به فارسی یعنی «فرهنگ لغت را مطالعه نکن!». منظور ما از این جمله چیست؟ زمانی که می خواهید زبان دومی مانند انگلیسی یا فرانسوی یا روسی را یاد بگیرید، هیچ وقت یک فرهنگ لغت (دیکشنری) را از صفحه ۱ تا آخرین صفحه مطالعه نمی کنید. چرا؟ به دو دلیل اصلی:
افرادی که زبان برنامه نویسی خاصی را یاد می گیرند دوست دارند همه چیز را از سیر تا پیاز در همان روز اول بدانند و شروع به مطالعه و حفظ کردن انواع و اقسام توابع می کنند. این کار علاوه بر هدر دادن وقت شما باعث می شود که نتوانید از زبان برنامه نویسی به خوبی استفاده کنید.
تقریبا تمام توسعه دهندگان دنیا هر جا به مشکلی برخورد می کنند، آن مشکل را در گوگل جست و جو می کنند و این مسئله ربطی به سطح مهارتشان ندارد. در تمام نظرسنجی ها و پژوهش های انجام شده، جست و جو در گوگل یکی از مهم ترین مهارت های هر برنامه نویسی در هر سطحی است (چه تازه کار و چه کار کشته ای در شرکت هایی مانند گوگل و فیسبوک).
یکی از مباحث بسیار مهم در برنامه نویسی اولویت اپراتور ها است. اگر یادتان باشد در مدرسه یاد گرفتیم که در عملیات های ریاضی نوعی اولویت وجود دارد. به طور مثال به دستور ریاضی زیر توجه کنید:
20 + 3 * 4
به نظر شما مقدار نهایی و پاسخ سوال بالا چیست؟ ما می دانیم که در ریاضی اولویت همیشه ابتدا با براکت (علامت []) است و سپس با پرانتز، سپس توان، سپس با ضرب و تقسیم و سپس با جمع و تفریق! همچنین اولویت همیشه از چپ به راست محاسبه می شود؛ یعنی اگر ۲ + ۵ - ۳ را داشتیم باید ابتدا عملیات ۵ - ۳ را انجام بدهید (چپ تر است) و سپس جواب آن را با ۲ جمع کنید. با در نظر گرفتن این قوانین برای سوال بالا می گوییم ۴ * ۳ ابتدا انجام می شود و نتیجه اش (۱۲) با ۲۰ جمع خواهد شد که ۳۲ را به ما می دهد.
پایتون نیز مانند اکثر زبان های برنامه نویسی از این قوانین ریاضی تبعیت می کند:
print(20 + 3 * 4)
این تابع نتیجه ۳۲ را برایمان چاپ خواهد کرد. سعی کنید مقدار نهایی عملیات زیر را حدس بزنید:
print((20 - 10) + 2 ** 2)
مقدار این عملیات 14 می شود. چرا؟ به دلیل اینکه اولویت با پرانتز است بنابراین ابتدا ۲۰ از ۱۰ کم می شود (نتیجه ۱۰) و سپس اولویت با توان است بنابراین ۲ به توان ۲ می رسد (نتیجه ۴) و سپس دو نتیجه با هم جمع می شوند (۴ + ۱۰) و عدد ۱۴ به دست می آید. من چند تمرین را برایتان آماده کرده ام، سعی کنید ابتدا خودتان آن ها را حل کنید:
print((5 + 4) * 10 / 2) print(((5 + 4) * 10) / 2) print((5 + 4) * (10 / 2)) print(5 + (4 * 10) / 2) print(5 + 4 * 10 // 2)
امیدوارم در حل آن ها موفق بوده باشید. پاسخ معادلات بالا به ترتیب بدین شرح است:
توجه داشته باشید که تنها مورد آخر integer است و موارد دیگر همگی float شده اند. چرا؟ به دلیل اینکه در پایتون ۳ اپراتور تقسیم (علامت /) نتیجه را به صورت float برمی گرداند. ما در مورد آخر به جای / از // استفاده کرده ایم که عدد را گِرد نیز می کند بنابراین اعشار آن حذف شده است.
در تمام زبان های برنامه نویسی مفهومی به نام متغیر یا variable وجود دارد بنابراین قبل از ادامه این دوره باید با آن ها آشنا شویم. برای آشنایی راحت تر می توانیم یک مثال بزنیم؛ متغیرها مانند ظرف های غذا هستند و غذا نیز داده های ما می باشد! شما در طول روز نیاز به ظروف مختلفی دارید تا غذاهای مختلفی بخورید، محتویات این ظروف دائما تغییر می کند و هر روز شسته می شوند (خالی می شوند). متغیرها نیز در برنامه نویسی به همین شکل هستند؛ ما در طول کدنویسی و کار روی یک پروژه نیاز به ذخیره موقت اطلاعات داریم و برای انجام این کار از متغیرها استفاده می کنیم. به مثال ساده زیر توجه کنید:
height = 190 weight = 100 print(height)
در این مثال دو متغیر به نام های height و weight داریم. شما می توانید هر نامی را برای متغیرهایتان انتخاب کنید (به طور مثال aslufgaligalefulaehaeih هم یک نام معتبر است!). این دو متغیر اعداد ۱۹۰ و ۱۰۰ را در خود ذخیره می کنند و ما متغیر height را در انتها چاپ کرده ایم اما کاری با weight نداشته ایم. شاید بپرسید متغیرها چطور داده ها را در خود ذخیره می کنند؟ برای پاسخ به این سوال باید مطلبی را درک کنید؛ علامت تساوی (=) در کدنویسی واقعا تساوی نیست بلکه اپراتور انتساب (assignment operator) نام دارد. با این حساب کد بالا عدد ۱۹۰ را به متغیری به نام height منتسب می کند. این یعنی چه؟ متغیرها فقط آدرس های ساده ای به مموری هستند، یعنی height به یک مکان مشخص در مموری (همان RAM سیستم شما) اشاره می کند و صرفا یک آدرس است. به همین خاطر در بعضی از زبان ها به مقداردهی یا انتساب مقدار به متغیرها binding (یعنی چسباندن یا متصل کردن) نیز می گویند.
همچنین در نظر داشته باشید که عدد ۱۹۰ به صورت باینری (اعداد صفر و یک - زبان کامپیوترها) ذخیره می شود. باینری یعنی اعداد در مبنای ۲ در صورتی که ما انسان ها با اعداد در مبنای ۱۰ کار می کنیم و به همین خاطر شاید داده های باینری برایتان عجیب باشند. به طور مثال ۱۹۰ به باینری می شود 10111110. به همین خاطر متغیرها را داریم تا به جای نوشتن عدد عجیبی مثل 10111110 بتوانیم یک آدرس ساده تر و خواناتر به محل این عدد در مموری داشته باشیم.
نکته: برای برنامه نویسی نیازی به دانستن چنین موضوعاتی ندارید و من آن ها را صرفا جهت پاسخ به حس کنجکاوی شما توضیح می دهم. در صورتی که دوست دارید بدانید اعداد باینری چطور محاسبه می شوند می توانید به این لینک از محاسبه عدد ۱۹۰ مراجعه کنید اما یادتان باشد که هیچ وقت و در هیچ موقعیتی نیاز به دانستن باینری نخواهید داشت.
با اینکه شما در انتخاب نام متغیرها آزاد هستید اما چند قانون کوچک و قرارداد وجود دارند که باید/بهتر است همیشه از آن ها تبعیت کنید. زمانی که صحبت از قراردادها می کنیم یعنی پیروی از آن ها الزامی نیست اما پیشنهاد می شود طبق آن قرارداد عمل کنید. از طرفی زمانی که بحث از قانون می کنیم یعنی پیروی از آن صد در صد الزامی بوده و در صورتی که خلاف آن عمل کنید کدهایتان کار نخواهند کرد.
کلیدواژه ها یا همان کلمات رزرو شده (reserved) کلماتی هستند که در زبان پایتون معنی خاصی دارند و از قبل توسط توسعه دهندگان زبان پایتون اختراع شده اند. به طور مثال print نام یک تابع است و نمی توانید نام متغیر خود را print بگذارید بلکه باید چیزی به آن اضافه کنید (مثلا print_my_name).
شما می توانید لیستی از کلیدواژه های پایتون را در این لیست پیدا کنید اما یادتان باشد که این کلیدواژه ها لزوما محدود به این لیست نیستند. همچنین به یاد داشته باشید که هیچ نیازی به حفظ کردن این کلیدواژه ها نیست چرا که در طول این دوره با بیشتر آن ها آشنا می شوید و در آخر می دانید که از چه نام هایی دوری کنید (فرآیند یادگیری آن ها یک فرآیند طبیعی و آرام است).
همانطور که قبلا توضیح دادم، به فرآیند زیر انتساب می گوییم:
height = 190
چرا انتساب؟ به دلیل اینکه در این مقداردهی، یک مقدار خاص (عدد ۱۹۰) را به یک متغیر (آدرسی در حافظه) منتسب کرده ایم. از طرفی می دانیم که متغیرها فقط آدرسی در RAM سیستم هستند بنابراین اگر دو متغیر داشته باشیم که هر دو به یک آدرس اشاره کنند چه می شود؟ یا به طور مثال اگر یک متغیر به یک متغیر دیگر اشاره کند چه می شود؟
height = 190 weight = height print(weight)
نتیجه کد بالا عدد ۱۹۰ خواهد بود و هیچ مشکلی نخواهیم داشت. همانطور که می بینید در این کد از این جهت «انتساب مجدد» داریم که یک متغیر را به یک متغیر دیگر منتسب کرده ایم. حتی می توانیم عملیات های دیگری را نیز روی آن ها انجام بدهیم:
height = 190 weight = height - 100 print(weight)
نوع دیگری از انتساب مجدد در پایتون و زبان های برنامه نویسی دیگر وجود دارد و زمانی که بحث «انتساب مجدد» می شود معمولا این نوع در نظر توسعه دهندگان است:
height = 190 height = 100 print(height)
به نظر شما پاسخ کد بالا چیست؟ روند اجرای کدها در پایتون مانند بسیاری دیگر از زبان های برنامه نویسی از بالا به پایین است بنابراین ابتدا عدد ۱۹۰ را به متغیر height داده ایم، سپس عدد ۱۰۰ را دوباره به height داده ایم و از آنجایی که روند اجرا از بالا به پایین می باشد عدد ۱۰۰ برایمان چاپ می شود. در واقع کدی که پایین تر باشد جایگزین مقادیر قبلی می شود بنابراین متغیر height قبل از اینکه چاپ شود مقدار ۱۰۰ را خواهد داشت.
در برخی از زبان های برنامه نویسی مفهومی به نام ثابت ها وجود دارند که برخلاف متغیرها هستند، یعنی نمی توانید در آن ها انتساب مجدد داشته باشید و هیچ وقت عوض نمی شوند. به طور مثال در زبان PHP برای تعریف ثابت ها از متد define استفاده می کنیم:
define("GREETING", "Welcome to W3Schools.com!");
در برخی دیگر از زبان های برنامه نویسی مانند پایتون ثابت ها خودشان نوعی متغیر هستند! شاید کمی سردرگم شده باشید، بگذارید توضیح بدهم. در پایتون دستور خاصی برای تعریف ثابت ها نداریم بلکه ثابت همان متغیر است و ما به دلیل قراردادهای خودمان قرار گذشته ایم که آن را تغییر ندهیم (قراردادی بین تمام توسعه دهندگان پایتون). زمانی که می خواهید یک ثابت را در پایتون مشخص کنید قرارداد این است که نام آن را همیشه با حروف بزرگ بنویسید. مثلا:
PI = 3.14
همانطور که می بینید از نظر فنی و عملیاتی مفهوم جداگانه ای به نام «ثابت» در پایتون وجود ندارد بنابراین از قراردادها استفاده می کنیم یا به زبان ساده تر وانمود می کنیم که وجود دارند! در حالی که از نظر فنی کد بالا فقط یک متغیر است و من می توانم آن را تغییر بدهم:
PI = 3.14 PI = 5 print(PI)
کد بالا عدد ۵ را چاپ می کند. شاید در ابتدا این مفهوم برایتان گیج کننده باشد اما به مرور زمان به آن عادت می کنید. به عنوان قانونی کلی می گویم که اگر متغیری را دیدید که تمام حروف نامش با حروف بزرگ نوشته شده بودند (مثلا MY_NAME) بدانید که آن متغیر یک ثابت است و نباید آن را تغییر بدهید.
قراردادهای اینچنینی در پایتون زیاد وجود دارند و به ندرت به آن ها عادت می کنید. به طور مثال در پایتون متد هایی به نام dunder داریم (مخفف double underscore) که با دو علامت آندرلاین یا همان آندراسکور شروع می شوند (مثال: __len__) و کار های خاصی انجام می دهند که فعلا مورد بحث ما نیستند و در آینده با آن ها آشنا خواهیم شد. بر اساس قرارداد نام متغیرهای شما نباید با ۲ عدد آندرلاین شروع شود چرا که شبیه به dunder ها خواهد شد.
فرض کنید 5 متغیر داشته باشیم و بخواهیم به آن ها مقادیر مختلفی را پاس بدهیم. بر اساس چیزی که تا حالا یاد گرفته ایم می گوییم:
age = 25 height = 190 weight = 90 cars = 10 books = 20
اما روش خلاصه و میانبری نیز وجود دارد:
age, height, weight, cars, books = 25, 190, 90, 10, 20 print(age) print(height) print(weight) print(cars) print(books)
با اجرای کد بالا مقادیر زیر برایتان چاپ می شود:
25 190 90 10 20
به زبان ساده تر می توانیم با ویرگول انگلیسی چندین متغیر را یکجا تعریف کرده و مقداردهی کنید. این عملیات به ترتیب خواهد بود بنابراین age برابر ۲۵ و height برابر ۱۹۰ و الی آخر.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.