عملگرها
در فصل قبل داده را ذخیره کردیم. حالا وقت آن است که با آن کار کنیم. این فصل درباره حساب کردن است، و درباره دو عملگری که تازهکارها دستکم میگیرند ولی در تمام دوره به وظیفه آنان میآید.
۱. هفت عملگر ریاضی
عملگر علامتی است که روی یک یا دو مقدار کاری انجام میدهد. پایتون هفت عملگر ریاضی دارد. چهار مورد نخست همانهایی هستند که در مدرسه دیدهاید و سه مورد بعدی کمی تازهاند.
# All the arithmetic operators of Python, applied to the same two numbers.
num1 = 24
num2 = 6
print('+ :', num1 + num2) # addition -> 30
print('- :', num1 - num2) # subtraction -> 18
print('* :', num1 * num2) # multiplication -> 144
print('/ :', num1 / num2) # true division -> 4.0 (always a float!)
print('// :', num1 // num2) # floor division -> 4 (whole part only)
print('% :', num1 % num2) # remainder -> 0
print('** :', num1 ** num2) # power -> 24^6
همه عملگرهای ریاضی: نمونه 01_arithmetic_operators.py
+ : 30 - : 18 * : 144 / : 4.0 // : 4 % : 0 ** : 191102976
| عملگر | نام | مثال | نتیجه |
|---|---|---|---|
+ | جمع | 24 + 6 | 30 |
- | تفریق | 24 - 6 | 18 |
* | ضرب | 24 * 6 | 144 |
/ | تقسیم | 24 / 6 | 4.0 |
// | تقسیم صحیح | 24 // 6 | 4 |
% | باقیمانده | 24 % 6 | 0 |
** | توان | 2 ** 10 | 1024 |
عملگر / در پایتون همیشه نتیجه اعشاری
میدهد، حتی وقتی تقسیم دقیق است. این تصمیم عمدی است: تقسیم در ریاضی
معمولاً عدد اعشاری تولید میکند، پس پایتون رفتار یکسانی دارد و
غافلگیرتان نمیکند.
۲. سه نوع تقسیم
سه عملگر / و // و % سه سؤال متفاوت
را جواب میدهند. اگر ۱۰ شکلات داشته باشید و بخواهید بین ۳ نفر تقسیم کنید:
10 / 3میگوید سهم هر نفر چند شکلات است اگر بشود شکلات را بُرید: ۳٫۳۳10 // 3میگوید هر نفر چند شکلات کامل میگیرد: ۳10 % 3میگوید چند شکلات در جعبه باقی میماند میماند: ۱
# '/' always gives a float, even when the division is exact.
print(10 / 2) # 5.0
print(10 / 3) # 3.3333333333333335
# '//' throws away the decimal part and gives the whole number of times
# the second value fits into the first.
print(10 // 3) # 3
# '%' gives what is left over. It is the tool we use to test even/odd numbers
# and to know whether one number divides another.
print(10 % 3) # 1
print(10 % 2) # 0 -> 10 is even
print(7 % 2) # 1 -> 7 is odd
سه نوع تقسیم: نمونه 02_division_and_remainder.py
5.0 3.3333333333333335 3 1 0 1
شرح مثال
- خروجی
10 / 3عدد عجیب3.3333333333333335است، با یک ۵ در انتها. این اشتباه پایتون نیست: کامپیوتر اعداد اعشاری را به شکل دودویی و با دقت محدود نگه میدارد، پس بعضی کسرها دقیق ذخیره نمیشوند. برای کارهای عادی مشکلی ندارد و در فصل شانزدهم باroundمرتبش میکنیم. //بخش اعشاری نتیجه را حذف میکند و آن را به نزدیکترین عدد گرد نمیکند. برای مثال،7 // 2برابر ۳ است، نه ۴.- وقتی هر دو طرف
//عدد صحیح باشند، نتیجه صحیح است. اگر یک طرف اعشاری باشد، نتیجه اعشاری میشود:7.0 // 2برابر3.0است.
۳. باقیمانده به چه دردی میخورد
عملگر % در نگاه اول بیمصرف به نظر میرسد، ولی یکی از
پرکاربردترین عملگرهای برنامهنویسی است. سه کاربرد اصلیاش:
-
زوج یا فرد بودن. اگر
n % 2برابر صفر باشد عدد زوج است، وگرنه فرد. در فصل چهارم دقیقاً همین را مینویسیم. -
بخشپذیری. اگر
n % 5صفر باشد یعنیnبر ۵ بخشپذیر است. در فصل هشتم با همین ایده عدد اول پیدا میکنیم. -
جدا کردن ارقام.
n % 10رقم یکان یک عدد را میدهد وn // 10بقیه عدد را. با تکرار این دو، هر عدد را میشود رقم به رقم باز کرد.
۴. اولویت عملگرها
وقتی چند عملگر در یک عبارت باشند، پایتون همان ترتیبی را رعایت میکند که در ریاضی یاد گرفتهاید: اول توان، بعد ضرب و تقسیم، آخر جمع و تفریق. عملگرهای همرتبه از چپ به راست حساب میشوند.
# Python follows the usual mathematical order of operations:
# 1) ** 2) * / // % 3) + -
# Operators on the same level are evaluated from left to right.
print(2 + 3 * 4) # 14, not 20: multiplication happens first
print((2 + 3) * 4) # 20: parentheses change the order
print(2 ** 3 ** 2) # 512: ** is evaluated from RIGHT to left -> 2 ** 9
print(-3 ** 2) # -9: the power is applied before the minus sign
print((-3) ** 2) # 9
# When in doubt, add parentheses: they cost nothing and make the code readable.
ترتیب محاسبه: نمونه 03_precedence.py
14 20 512 -9 9
شرح مثال
2 + 3 * 4برابر ۱۴ است، نه ۲۰. ضرب زودتر انجام میشود.- پرانتز همیشه برنده است.
(2 + 3) * 4برابر ۲۰ است. - عملگر توان یک استثناست: از راست به چپ حساب میشود. پس
2 ** 3 ** 2یعنی2 ** 9که ۵۱۲ است، نه8 ** 2که ۶۴ میشد. -3 ** 2برابر منفی ۹ است، چون اول ۳ به توان ۲ میرسد و بعد منفی میشود. اگر منفی سه را به توان دو میخواهید، باید پرانتز بگذارید.
ضرورتی ندارد جدول اولویت را حفظ کنید. برنامهنویسهای حرفهای هم حفظ نیستند. هر جا شک کردید، پرانتز بگذارید. پرانتز اضافه هیچ هزینهای ندارد و کد را برای کسی که بعداً میخواندش روشنتر میکند.
۵. بهروزرسانی یک متغیر با خودش
این خط در نگاه اول ممکن است عجیب به نظر برسد: num1 = num1 + num2. اگر آن را مانند یک معادله ریاضی بخوانید، بیمعنا به نظر میرسد؛ اما اینجا علامت مساوی، عملگر انتساب است. پایتون ابتدا عبارت سمت راست را محاسبه میکند و سپس نتیجه را در متغیر سمت چپ قرار میدهد.
# A variable can be updated using its own current value.
# The right-hand side is calculated first, then stored back into the name.
num1 = 24
num2 = 6
num1 = num1 + num2 # 24 + 6 = 30
print(num1)
num1 = num1 - num2 # 30 - 6 = 24
print(num1)
number = 3
result = number + 1
print(result) # 4
بهروزرسانی متغیر: نمونه 04_reassignment.py
30 24 4
این الگو در فصل ششم یکی از مفاهیم اصلی است: متغیری میسازیم و در هر دور حلقه مقداری به آن اضافه میکنیم. چنین متغیری را انباره یا accumulator مینامند.
۶. انتساب ترکیبی
چون نوشتن num1 = num1 + num2 آنقدر رایج است، پایتون شکل
کوتاهتری برایش دارد.
# 'num1 = num1 + num2' is so common that Python offers a shorter form: '+='.
num1 = 24
num2 = 6
num1 += num2 # same as num1 = num1 + num2
print(num1) # 30
num1 -= num2 # same as num1 = num1 - num2
print(num1) # 24
num1 *= num2 # same as num1 = num1 * num2
print(num1) # 144
num1 /= num2 # same as num1 = num1 / num2 -> the result becomes a float
print(num1) # 24.0
# The same short form exists for // , % and **
num1 //= 5
print(num1) # 4.0
انتساب ترکیبی: نمونه 05_augmented_assignment.py
30 24 144 24.0 4.0
شرح مثال
- هر هفت عملگر ریاضی شکل ترکیبی دارند:
+=و-=و*=و/=و//=و%=و**=. - به خط چهارم دقت کنید: بعد از
/=مقدار24.0شده است، با اعشار. چون عملگر تقسیم همیشه اعشاری برمیگرداند، نوع متغیر از این به بعدfloatاست. به همین دلیل خط آخر هم4.0چاپ میکند و نه4. - ترتیب دو علامت مهم است:
+=درست است،=+غلط است.x =+ 5خطا نمیدهد ولی معنایش «x را مساوی مثبت ۵ قرار بده» است و یک اشتباه بیسروصداست.
۷. چند برنامه کوچک
حالا عملگرها را با ورودی کاربر ترکیب کنیم. اولی فقط دو واحد به عدد کاربر اضافه میکند:
# Read a number from the user and increase it by 2.
user_input = input('Enter a number: ')
number = int(user_input) # input() gives text, so we must convert it
number += 2
print('Your number plus 2 is:', number)
افزایش عدد کاربر: نمونه 06_increase_user_number.py
محیط و مساحت مستطیل:
# Area and perimeter of a rectangle.
length_input = input('Length of the rectangle: ')
width_input = input('Width of the rectangle: ')
length = float(length_input)
width = float(width_input)
area = length * width
perimeter = (length + width) * 2
print('Area: ', area)
print('Perimeter:', perimeter)
مستطیل: نمونه 08_rectangle.py
Length of the rectangle: 5 Width of the rectangle: 3 Area: 15.0 Perimeter: 16.0
و میانگین سه عدد، که یک نکته مهم دارد:
# Average of three numbers. Note the parentheses: without them only the last
# number would be divided by 3.
a = float(input('Enter the first number: '))
b = float(input('Enter the second number: '))
c = float(input('Enter the third number: '))
average = (a + b + c) / 3
print('Average:', average)
میانگین سه عدد: نمونه 09_average_of_three.py
اگر بنویسید a + b + c / 3، به خاطر اولویت عملگرها فقط c بر سه تقسیم میشود و جواب کاملاً غلط در میآید. بدتر اینکه برنامه هیچ خطایی نمیدهد و شما تا وقتی جواب را با ماشینحساب چک نکنید، متوجه نمیشوید. این موارد را خطای منطقی میگویند و سختترین نوع خطا هستند.
در فایل 07_sum_two_numbers.py یک توضیح هست که میگوید
متغیر را sum صدا نزنید. دلیلش این است که
sum نام یک تابع آماده پایتون است و اگر نام متغیرتان را
آن بگذارید، آن تابع را از دست میدهید. در فصل دهم یک مثال کامل از
این دام میبینید.
۸. ثانیه به ساعت و دقیقه
این مثال کلاسیکترین کاربرد // و % در کنار هم
است و ارزش دارد که خط به خط دنبالش کنید.
# A classic use of // and % together:
# convert a number of seconds into hours, minutes and seconds.
user_input = input('Enter a number of seconds: ')
total_seconds = int(user_input)
hours = total_seconds // 3600 # how many whole hours
remaining = total_seconds % 3600 # what is left after removing the hours
minutes = remaining // 60 # how many whole minutes
seconds = remaining % 60 # what is left after removing the minutes
print(hours, 'h', minutes, 'm', seconds, 's')
تبدیل ثانیه به زمان: نمونه 10_seconds_to_time.py
Enter a number of seconds: 3725 1 h 2 m 5 s
شرح مثال
عدد ۳۷۲۵ را دنبال کنیم:
- هر ساعت ۳۶۰۰ ثانیه است.
3725 // 3600برابر ۱ است، پس یک ساعت کامل داریم. 3725 % 3600برابر ۱۲۵ است. یعنی بعد از برداشتن آن یک ساعت، ۱۲۵ ثانیه باقی مانده.125 // 60برابر ۲ است، پس دو دقیقه کامل داریم.125 % 60برابر ۵ است، یعنی ۵ ثانیه تهمانده.
الگویی که اینجا دیدید در همه تبدیل واحدها تکرار میشود: با
// واحد بزرگتر را بردار، با % باقیمانده را
نگه دار، و روی باقیمانده همین کار را با واحد کوچکتر تکرار کن.
پوشه S02-operators شامل نمونههای
01_arithmetic_operators.py تا 10_seconds_to_time.py.
خلاصه فصل
| ابزار | وظیفه آن |
|---|---|
+ - * / | چهار عمل اصلی. نتیجه / همیشه اعشاری است |
// | تقسیم صحیح: فقط بخش کامل، اعشار بریده میشود |
% | باقیمانده. برای زوج و فرد، بخشپذیری و جدا کردن ارقام |
** | توان. از راست به چپ حساب میشود |
| اولویت | اول **، بعد * / // %، آخر + - |
| پرانتز | همیشه برنده است. هر جا شک دارید بگذاریدش |
x += 1 | شکل کوتاه x = x + 1. برای - و * و سایر موارد نیز هست |
تمرینهای فصل دو
- دو عدد بگیرید و نتیجه هر هفت عملگر ریاضی را روی آنها چاپ کنید.
- تعدادی دقیقه بگیرید و بگویید چند ساعت و چند دقیقه است.
- قیمت یک کالا را بگیرید و قیمت با احتساب ۹ درصد مالیات را چاپ کنید.
- یک عدد سه رقمی بگیرید و رقم صدگان، دهگان و یکانش را جدا چاپ کنید. راهنمایی: با
//و%. - شعاع دایره را بگیرید و مساحت و محیطش را چاپ کنید. مقدار
PI = 3.14159را خودتان بسازید. - نمره چهار درس را بگیرید و میانگین را چاپ کنید. مراقب پرانتز باشید.
- توضیح دهید چرا
10 / 5نتیجه2.0میدهد ولی10 // 5نتیجه2. - یک عدد بگیرید و بگویید باقیماندهاش بر ۲ چند است. بعد از فصل چهارم میتوانید همین را به «زوج است یا فرد» تبدیل کنید.