مقدمه

دیدیم که در پایتون سه نوع int، float و complex برای کار با مقادیر عددی در نظر گرفته‌ شده‌اند؛ نوع int برای اعداد صحیح، نوع float برای اعداد اعشاری و نوع complex برای اعداد مختلط که البته این آخری کاربرد کمتری دارد. در این درس، قصد داریم به جزئیات مربوط به این نوع‌های عددی بپردازیم. قبل از هر چیز، عملگرهای حسابی و مقایسه‌ای را معرفی می‌کنیم و سپس، با مهمترین اعمال قابل انجام روی مقادیر عددی آشنا می‌شویم.

عملگرهای حسابی در پایتون

عملگرهای حسابی (arithmetic operators) برای انجام اعمال محاسباتی روی اعداد کاربرد دارند. این عملگرها در واقع، همان چهار عمل اصلی هستند که اعمال جمع، تفریق، ضرب و تقسیم را پیاده سازی می‌کنند. نماد + برای جمع، نماد - برای تفریق، نماد * برای ضرب و نماد / برای تقسیم اعداد به کار می‌روند. به علاوه، نماد ** برای عمل توان و نماد % برای باقیمانده‌ی تقسیم، قابل استفاده هستند.
مقادیری که یک عملگر روی آنها عمل می‌کند، عملوند (operand) نامیده می‌شود. در مثال زیر، از عملگرهای حسابی روی عملوندهای صحیح استفاده شده است.

>>> 2 + 3
5
>>> 3 - 2
1
>>> 2 * 3
6
>>> 4 / 2
2.0
>>> 2 ** 4
16
>>> 25 % 4
1
            

نکته‌ای که از مثال بالا قابل استخراج است این است که عملگر تقسیم، حتی اگر عملوندهایش صحیح باشند و باقیمانده هم نداشته باشد، خروجی‌اش از نوع float خواهد بود.

اعمال ضرب و تقسیم از اولویت بالاتری نسبت به اعمال جمع و تفریق برخوردارند و پایتون نیز از این اصل پشتیبانی می‌کند. بنابراین، اگر در یک عبارت بیش از یک عمل محاسباتی موجود باشد، این اصل لحاظ خواهد شد. البته با استفاده از پرانتزها می‌توانیم این ترتییب اولویت‌ها را تغییر دهیم. مثال زیر را ببینید.

>>> 2 + 3 * 4
14
>>> (2 + 3) * 4
20
            

حالا اجازه دهید عملگرهای حسابی را روی عملوندهای اعشاری آزمایش کنیم.

>>> 0.1 + 0.1
0.2
>>> 0.4 - 0.2
0.2
>>> 2.0 * 0.1
0.020000000000000004
>>> 2.0 / 0.2
10.0
27 ** (1 / 3)
3.0
>>> 25.0 % 4
1.0
          

همانطور که از مثال بالا هم مشخص است، اگر در یک عمل محاسباتی، یک عملوند از نوع int و یک عملوند از نوع float داشته باشیم، خروجی از نوع float خواهد بود. به علاوه، نتیجه‌ی عبارت سوم ما را به یاد خطای تقریب اعداد اعشاری می‌اندازد که قبلاً در موردش صحبت کردیم و بنابراین، از دیدن این نتیجه تعجب نمی‌کنیم. اما کمی جلوتر، خواهیم دید چطور می‌توانیم این مسئله را حل کنیم.

عملگرهای مقایسه‌ای در پایتون

عملگرهای مقایسه‌ای (comparisional operators) برای انجام مقایسه بین مقادیر عددی (و رشته‌ای) کاربرد دارند. نتیجه‌ی یک عمل مقایسه‌ای همواره یک مقدار بولین است. در مثال زیر، از عملگرهای مقایسه‌ای روی مقادیر صحیح و اعشاری استفاده شده است.

>>> 2 * 3 == 6.0
True
>>> 2 ** 3 >= 8
True
>>> True <= 2
True
>>> 5 * 3 != 15
False
          

همانطور که می‌بینید، عملگر == برای تست برابری، عملگر != برای تست نابرابری و سایر عملگرها برای تست‌های کوچکتر یا بزرگ‌تر بودن کاربرد دارند. مقادیر True و False در اعمال مقایسه‌ای هم مثل اعمال محاسباتی، حکم اعداد 1 و صفر را دارند. در ضمن، همانطور که می‌بینید، عملگر برابری == کاری به نوع‌های اعداد ندارد و مثلاً 2 و 2.0 را برابر می‌داند.

مقایسه رشته‌ها

امکان استفاده از عملگرهای مقایسه‌ای روی عملوندهای رشته‌ای هم وجود دارد. در این صورت، مقایسه‌ی رشته‌ها به صورت کاراکتر به کاراکتر و بر اساس کد یونیکد کاراکترها (که codepoint نامیده می‌شود) انجام می‌شود. مثال زیر را ببینید.

>>> 'B' > 'A'
True
>>> 'Hello' > 'Hi'
False
>>> 'Hello' > 'hello' 
False
          

کنترل خطای تقریب

گفتیم و دیدیم که خطای تقریب در مورد اعداد اعشاری باعث می‌شود که با نتایج غیر قابل انتظاری مثل برابر نبودن 0.1 + 0.2 با 0.3 مواجه شویم. در اینجا این مسئله را با استفاده از تابعی به نام round() حل می‌کنیم. این تابع، همانطور که نامش نشان می‌دهد، برای رُند یا گِرد کردن اعداد کاربرد دارد و دارای فرم کلی زیر است.

round(number, ndigits)

در اینجا number عددی است که قصد داریم آن را گِرد کنیم و ndigits مشخص می‌کند که این عدد باید تا چند رقم اعشار گرد شود. البته پارامتر ndigits اختیاری است و در غیاب این پارامتر، number به نزدیکترین عدد صحیح گرد می‌شود.

>>> round(2.49)
2
>>> round(2.51)
3
>>> round(2.123, 2)
2.12
>>> round(2.486, 2)
2.49
>>> round(0.2 + 0.1, 1)
0.3
>>> round(2.5)
2
>>> round(3.5)
4
          

نتیجه‌ی دو عبارت آخر کمی عجیب به نظر می‌رسد؛ چون عدد 2.5 رو به پایین و عدد 3.5 رو به بالا گرد شده است. در این موارد، قاعده به این صورت است که عدد مورد نظر به نزدیکترین عدد زوج گرد می‌شود.