فهرست
حالا که پایتون را نصب کردیم و با هر یک از ویرایشگرهای مورد نظرمان مثل Jupyter Notebook و Spyder کار را با آن آغاز کردیم، میتوانیم با خیال راحت سراغ مواد اولیه برنامهنویسی در محیط پایتون برویم.
پایتون به مثابه ماشینحساب
برای اینکه کار با پایتون را شروع کنیم بهترین کار این است که پایتون را به عنوان یک ماشینحساب در نظر بگیریم. برای این کار کافیست در کنسولِ ویرایشگر خود یا هرجا که میتوانیم به صورت تعاملی دستوری به زبان پایتون به کامپیوتر بدهیم و نتیجه آن را مشاهده کنیم محاسبات رایج بنویسیم و اجرا کنیم. مثلا اگر بنویسیم 3 * 6
و آن را اجرا کنیم،
3 * 6
نتیجه محاسبه در مقابلمان درج خواهد شد:
18
به همین صورت میتوانیم انواع دیگر محاسبه مانند 3 + 7
یا 10 / 4
را نیز درست همانطور که در ماشین حساب انجام میدهیم در محیط پایتون هم انجام دهیم.
عملگر
در اصطلاح برنامهنویسی برای انجام عملیاتهایی مانند جمع، تفریق، ضرب، تقسیم و مانند آنها از عملگر[1] استفاده میشود. به عبارت دیگر اگر بخواهیم دو مقدار 3
و 6
را در یکدیگر ضرب کنیم باید این دو مقدار[2] را همراه با عملگر ضرب *
به صورت 3 * 6
عنوان ورودی به کامپیوتر بدهیم تا پردازش مورد نظرمان انجام شود و نتیجه محاسبه یا خروجی بازگردانده شود.
دقت داشته باشید ترتیبی نوشتن عملوندها و عملگر نیز مهم است. یعنی اگر عبارتی که برای اجرا به کامپیوتر میدهیم ترتیبی غیر از <مقدار> <عملگر> <مقدار> مثلا * 6 3
داشته باشد، کامپیوتر با دستوری مواجه میشود که برایش تعریف نشده و از محاسبه نتیجه باز میماند.
همچنان که در ماشین حساب که خود نوعی کامپیوتر اولیه است میتوانیم دستوراتی مانند 3 + 7
یا 3 / 19
را به راحتی اجرا کنیم، در محیط پایتون نیز با دسترسی به عملگرهای متنوع میتوانیم چنین محاسباتی را انجام دهیم.
عملگرهایی که در محیط برنامهنویسی به آنها دسترسی داریم بسیار متنوعتر آن چیزی است که در ماشین حساب با آن سر و کار داریم و علاوه بر عملگرهای محاسبه، عملگرهای منطقی و مقایسه و … را هم در بر میگیرد. در ادامه با عملگرها بیشتر آشنا خواهیم شد.
عملگرهای محاسبه
مجموعه عملگرهایی که میتوانیم برای انجام محاسبات ریاضی در محیط پایتون از آنها استفاده کنیم عبارتند از
نام | نماد |
جمع | + |
تفریق | - |
ضرب | * |
توان | ** |
تقسیم اعشاری | / |
تقسیم صحیح | // |
باقیمانده | % |
اگر عملگرهای محاسبه را در عباراتی مانند عبارات زیر در محیط پایتون اجرا کنیم، میتوانیم نتیجه آنها را به راحتی مشاهده کنیم.
20 + 10
2.8 - 1.6
10 * 10
10 ** 3
25 / 10
25 // 10
25 % 10
وقتی دستورات فوق را در محیط پایتون اجرا کنیم، نتایج هر یک به صورت زیر قابل مشاهده خواهد بود.
30
1.2
100
1000
2.5
2
5
برای اینکه با این عملگرها بیشتر ارتباط برقرار کنید چند محاسبه دلخواه را برای خود در محیط پایتون با استفاده از همین عملگرها پیاده کنید. مثلا اگر بخواهید به این سوال «یک سال چند هفته دارد؟» پاسخ دهید میتوانید دستور زیر را در محیط پایتون اجرا کنید:
365 // 7
52
اولویت در اجرا
اگر با جمله «شانهام شکست» مواجه شوید، احتمالا خواهید پرسید کدام شانه؟ کتف یا ابزاری که برای مرتب کردن موها استفاده میشود؟ علت اینکه این سوال برای ما مطرح میشود این است که ما میتوانیم هر دو معنا را به صورت همزمان برداشت کنیم. اما وقتی دستوری را برای اجرا به کامپیوتر تحویل میدهیم، کامپیوتر یک چیز بیشتر نمیفهمد. به بیان دیگر، برداشتهای چندمعنایی هنگام مواجهه با دستورات برای کامپیوتر مجاز نیست. کامپیوتر تنها میتواند چیزهایی را که از قبل برایش قراردادشده پردازش کند.
اگر از ما بپرسند حاصل 5 * 4 + 3
چیست، ممکن است با خود فکر کنیم پاسخ این سوال به اینکه اول جمع را انجام بدهیم یا ضرب بستگی دارد. در حالت اول نتیجه محاسبه 35
و در حال دوم 23
خواهد بود. حتی ممکن است فکر کنیم که نتیجه نهایی به این بستگی دارد که محاسبه را از سمت چپ شروع کنیم یا از سمت راست. اما چنین چیزی برای ماشین امکانپذیر نیست. خروجی دستوری که برای اجرا به کامپیوتر میدهیم یک چیز بیشتر نیست. به عبارت دیگر، کامپیوتری یک برداشت بیشتر از دستوراتی که در محیطهای برنامهنویسی به او داده میشود ندارد و در نتیجه خروجی نهایی وی نیز دستخوش چندگانگی نمیشود.
اگر همین عبارت را به عنوان دستوری برای کامپیوتر در محیط پایتون بنویسیم چه اتفاقی میافتد؟
3 + 4 * 5
با توجه به آنچه گفته شد، کامپیوتر ناگزیر است در مواجهه با دستور 5 * 4 + 3
یک برداشت بیشتر نداشته باشد و یک خروجی بیشتر تولید نکند. این کار با تعریف اولویتهای از پیش تعیینشده بین عملگرها تعریف شده است. به عنوان مثال عملگر ضرب بر عملگر جمع اولویت دارد. یعنی اگر عبارت یادشده را به کامپیوتر بدهیم، کامپیوتر بدون توجه به اینکه کدام عملگر اول آمده، ابتدا عملیات ضرب را انجام میدهد، بعد سراغ عملیات جمع میرود و در نهایت خروجی زیر را به عنوان نتیجه محاسبه باز میگرداند.
23
آیا میتوانید حدس بزنید کامپیوتر هنگام اجزرای دستورات زیر در محیط پایتون اول سراغ کدام عملگرها میرود و نتیجه نهایی محاسبات چیست؟
3 * 2 ** 3
23 - 8 % 3
نتیجه این دو عبارت را در ادامه ببینید:
24
21
از کجا بفهمیم کدام عملگر اولویت دارد؟
- اول جمع انجام شود یا ضرب؟
- اول توان محاسبه شود یا ضرب؟
- اول باقیمانده حساب شود یا تفریق؟
- اول ضرب اولویت انجام میشود بعد جمع، چون ضرب دشوارتر است.
- اول توان محاسبه میشود بعد ضرب چرا که توان عملیاتی پیشرفتهتر به حساب میآید.
- اول باقیمانده حساب شود چون محاسبه آن نسبت به تفریق، پردردسرتر است.
همچنان که از گزارههای فوق نیز قابل برداشت است، معمولا عملگری که ساختار پیچیدهتر دارد اول پیادهسازی میشود بعد نوبت به عملگرهای ابتداییتر میرسد. به عنوان نمونه عملگر توان**
نسبت به ضرب *
پیچیدهتر به حساب میآید، چون توان خودش از ضرب ساخته شده و با استفاده از آن تعریف شده است. بنابراین ما در محاسبه نتیجه عبارت 3 ** 2 * 3
میتوانیم ابتدا توان را به ضرب تبدیل کنیم 2 * 2 * 2 * 3
تا به این ترتیب تنها با عملگر ضرب سر و کار داشته باشیم و مسئله اولویتبندی دیگر مطرح نباشد و خروجی به راحتی محاسبه شود: 24
. برعکسِ این تبدیل از ضرب به توان امکانپذیر نیست چراکه ضرب نسبت به توان عملگری ابتدایی به شمار میآید. همین رویکرد را میتوان برای پیدا کردن اولویت بین ضرب *
و جمع +
در عبارت 5 * 4 + 3
به کار برد و عملگر ضرب را به جمع تبدیل کرد و با این عبارت طرف شد 4 + 4 + 4 + 4 + 4 + 3
و خروجی نهایی را تنها با استفاده از عملگر جمع محاسبه کرد: 23
.
انتزاع عملکردی
این مشاهده در عین سادگی نشاندهندۀ یکی از ویژگی بنیادی کامپیوتر به نام «انتزاع عملکردی» نیز هست[3]. ویژگیها و امکاناتی که در کامپیوتر با آنها سر و کار داریم سلسله مراتبی از قابلیتها هستند. این قابلیتها اگرچه خود از اجزای سادهتر ایجاد شدهاند، اما میتوان آنها را فارغ از اینکه چه اجزایی دارند و چه فعل و انفعالاتی درونشان رخ میدهد به عنوان اجزای سازنده برای به وجود آوردن ساختارهای پیچیدهتر نیز به کار برد. پردازش در این ساختار سلسلهمراتبی تنها زمانی امکانپذیر است که موجودیتهای پیچیده و سطح بالا به اجزای ساده و سطح پایین تبدیل شوند. نمونهای دیگر از این پدیده را وقتی درباره سطح انتزاع در زبانهای برنامهنویسی مشاهده کردیم و دیدیم مفسر استاندارد پایتون میتواند به زبان سی نوشته شود اما برعکس آن هیچ گاه اتفاق نمیافتد.
البته بحث اولویتبندی عملگرها به این پیچیدگی نیست. هر وقت درباره اولویت عملگرها تردید داشتید از پرانتز ()
استفاده کنید.
عملگرهای مقایسه
در محیط پایتون علاوه بر عملگرهای محاسبه که در ماشینهای حسابهای ساده نیز به بیشتر آنها دسترسی داریم، به عملگرهایی برای بررسی برابری، نابرابری، کوچکتر بودن یا بزرگتر بودن نیز دسترسی داریم. فهرستی از عملگرهایی که برای مقایسه استفاده میشوند در جدول زیر آمدهاند.
نام | نماد |
برابری | == |
نابرابری | =! |
بزرگتر | < |
بزرگتر یا مساوری | =< |
کوچکتر | > |
کوچکتر یا مساوی | => |
مثلا اگر بخواهیم ببینیم آیا حاصل جمع 34 + 43
از حاصل ضرب 15 * 5
بیشتر است میتوانیم آن را به صورت زیر در محیط پایتون اجرا کنیم.
43 + 34 > 5 * 15
برای محاسبه خروجی این عبارت ابتدا دو طرف عملگر <
محاسبه میشوند مقایسه انجام میشود. اگر مقدار سمت چپ از مقدار سمت راست بزرگتر باشد ارزش گزاره درست True
و در غیر این صورت ارزش آن نادرست False
خواهد شد. در عبارت فوق چون مقدار سمت چپ عملگر مقایسه از سمت راست آن بزرگتر است خروجی نهایی به صورت زیر خواهد بود:
True
خروجی محاسباتی که با استفاده از عملگرهای محاسبه در بخش نخست دیدیم، اعداد صحیح یا اعداد اعشاری بود. اما خروجی عملگرهای مقایسه از نوع عددی است. خروجی عملگرهای مقایسه دو مقدارِ از پیشتعریفشده بیشتر نیست: True
و False
. به این نوع مقدار، اصطلاحا مقدار منطقی یا بولیَن گفته میشود. در درس بعد بیشتر درباره انواع مقدارها صحبت خواهیم کرد.
برای اینکه مطمئن شویم عملگرهای مقایسه چگونه کار میکنند بیاید سعی کنیم خروجی عبارات زیر را حدس بزنیم.
17 <= 14 + 3
2 * 3 == 5
6 != 5
4 > 7
مقدار خروجی عبارات بالا در محیط پایتون به ترتیب به صورت زیر است.
True
False
True
False
اول محاسبه بعد مقایسه
برای رسیدن به خروجی نهایی این عبارت، ابتدا نتیجه عبارات موجود در دو طرف عملگر منطقی محاسبه میشوند. نتیجه عبارت سمت چپ عملگر منطقی True
و نتیجه عبارت سمت راست آن True
است. وقتی هر دو مقداری که به عملگر and
داده میشود True
باشد، خروجی آن نیز True
خواهد بود. در نتیجه خروجی عبارت بالا به صورت زیر خواهد بود:
شاید توجه شما هم به این نکته جلب شده باشد که در تمامی عبارات فوق اول عملگرهای محاسبه اجرا شدند و پس از آنها نوبت به اجرای عملگرهای مقایسه رسید. به بیان دیگر اولویت اجرای عملگرهای مقایسه همیشه بالاتر از عملگرهای مقایسه است و همیشه اول محاسبه اجرا میشود و بعد نوبت به مقایسه میرسد.
به نظر شما آیا این مشاهده نیز نشان از پیچیدهتر بودن عملیات حساب نسبت به عملیات مقایسه برای کامپیوتر دارد؟
عملگرهای منطقی
عملگرهای منطقی برای تلفیق ارزش گزارههای منطقی با یکدیگر کاربرد دارند. مقادیری که به عنوان مقدارهای ورودی با عملگرهای منطقی در محیط پایتون همراه میشوند معمولا از نوع True
و False
هستند و خروجی آن نیز معمولا از همین نوع است. عملگرهای منطقی کاربرد زیادی جایگاهی کلیدی در محاسبات کامپیوتری دارند. اگر دوست دارید درباره گزارههای دوتایی و اهمیت آنها در ساخت کامپیوتر بیشتر بدانید به درس «کامپیوتر چیست و چگونه کار میکند؟» مراجعه کنید.
عملگرهای منطقی که معمولا با آنها سر و کار داریم در جدول زیر آمدهاند.
نام | نماد |
و | and |
یا | or |
نفی | not |
مثلا اگر بخواهیم ببینیم نتیجه محاسبه 87 + 78
در بین 160
و 170
قرار دارد میتوانیم آن را به صورت زیر بنویسیم:
78 + 87 > 160 and 78 + 87 < 170
برای رسیدن به خروجی نهایی این عبارت، ابتدا نتیجه عبارات موجود در دو طرف عملگر منطقی محاسبه میشوند. نتیجه عبارت سمت چپ عملگر منطقی True
و نتیجه عبارت سمت راست آن True
است. وقتی هر دو مقداری که به عملگر and
داده میشود True
باشد، خروجی آن نیز True
خواهد بود. در نتیجه خروجی عبارت بالا به صورت زیر خواهد بود:
True
معنای خروجی این گزاره این است که نتیجه محاسبه 87 + 78
در بین 160
و 170
قرار دارد.
بگذارید سراغ یک مثال دیگر برویم. فرض کنید میخواهیم ببینیم عدد 23023
به هر یک از اعداد 17
و 23
بخشپذیر است یا خیر. به نظر شما چگونه میتوانیم با استفاده از عملگرهایی که تاکنون یاد گرفتهایم این محاسبه را در محیط پایتون انجام دهیم؟
برای اینکه ببینیم 23023
بر 17
بخشپذیر است کافیست ببینیم باقیمانده تقسیم آن بر 17
برابر با 0
خواهد بود یا خیر. اگر مقدار باقیمانده برابر با صفر باشد معنایش این است که 23023
بر 17
بخشپذیر است. این عبارت را میتوانیم به صورت 0 == 17 % 23023
بنویسیم. خروجی این عبارت یک مقدار True
یا False
خواهد بود. برای اینکه ببینیم 23023
دست کم بر یکی از اعداد یادشده بخشپذیر است، کافیست از عملگر منطقی or
بین عباراتی که برای بررسی باقیمانده به کار بردیم، استفاده کنیم.
23023 % 17 == 0 or 23023 % 23 == 0
True
معنای به دست آمدن مقدار True
پس از اجرای عبارت فوق این است که 23023
بر 17
یا 23
بخشپذیر است.
اولویت پایینتر عملگرهای منطقی
احتمالا تاکنون توجه شما نیز به این مطلب جلب شده است. اگر دستوری حاوی عملگر محاسبه، عملگر مقایسه و عملگر منطقی را در محیط پایتون اجرا کنیم، اول عملگرهای محاسبه مانند +
، -
، *
، /
، %
و … اجرا میشوند، بعد نوبت به عملگرهای مقایسه مانند >
، <
، ==
، =!
و … میرسد و دست آخر عملگرهای منطقی مانند and
و or
و not
اجرا میشوند. به بیان دیگر اولویت عملگرهای محاسبه بیشتر از عملگرهای مقایسه، اولویت دیگر عملگرهای مقایسه بیشتر از عملگرهای منطقی است. معنای دیگر اجرای عملگرهای منطقی بعد از دیگر عملگرها این است که عملیاتی که این عملگرها انجام میدهند ابتداییتر از عملگرهای دیگر است. این مشاهده چندان دور از انتظار نیست، چرا که مدارهایی که عملیات جمع را در سختافزار کامپیوتر انجام میدهند نیز با در کنار هم قرار گرفتن دروازههای منطقی ایجاد شدهاند. اگر دوست دارید در این مورد بیشتر بدانید به درس «کامپیوتر چیست و چگونه کار میکند؟» مراجعه کنید.
خلاصه
در این درس با عملگرهای مختلف شامل عملگرهای محاسبه، عملگرهای مقایسه و عملگرهای منطقی و روش به کار بردن آنها در محیط پایتون آشنا شدیم. در کنار آشنایی با عملگرها کمی هم درباره اولویت اجرای آنها نسبت به یکدیگر فکر کردیم تا نسبتی بین سطحِ بالا یا سطحِ پایین بودن عملیات از یک طرف و اولویت اجرایی آنها از طرف دیگر پیدا کنیم تا از این طریق به شهودی درباره تقدم و تاخر عملگرها هنگام اجرا برسیم.
عملگرهایی که کار با آنها را یاد گرفتیم تمامی عملگرهای موجود در پایتون را شامل نمیشوند اما با همین عملگرها هم کارهای هیجان انگیز زیادی میتوانیم انجام دهیم. در ادامه با عملگرهای تخصیص مثل =
و =+
و عملگرهای عضویت مانند in
و not in
نیز آشنا میشویم. اما پیش از آن لازم است به معرفی مقدارهای پایه بپردازیم. در درس بعد با مقدارهای پایه در پایتون آشنا خواهیم شد.