برنامه‌نویسی پایتون فهرست مطالب
فصل ۲

عملگرها

در فصل قبل داده را ذخیره کردیم. حالا وقت آن است که با آن کار کنیم. این فصل درباره حساب کردن است، و درباره دو عملگری که تازه‌کارها دست‌کم می‌گیرند ولی در تمام دوره به وظیفه آنان می‌آید.

در این فصل می‌خوانید
  1. هفت عملگر ریاضی
  2. سه نوع تقسیم
  3. باقیمانده به چه دردی می‌خورد
  4. اولویت عملگرها
  5. به‌روزرسانی یک متغیر با خودش
  6. انتساب ترکیبی
  7. چند برنامه کوچک
  8. ثانیه به ساعت و دقیقه

۱. هفت عملگر ریاضی

عملگر علامتی است که روی یک یا دو مقدار کاری انجام می‌دهد. پایتون هفت عملگر ریاضی دارد. چهار مورد نخست همان‌هایی هستند که در مدرسه دیده‌اید و سه مورد بعدی کمی تازه‌اند.

# 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 + 630
-تفریق24 - 618
*ضرب24 * 6144
/تقسیم24 / 64.0
//تقسیم صحیح24 // 64
%باقیمانده24 % 60
**توان2 ** 101024
چرا نتیجه تقسیم ۴.۰ است و نه ۴

عملگر / در پایتون همیشه نتیجه اعشاری می‌دهد، حتی وقتی تقسیم دقیق است. این تصمیم عمدی است: تقسیم در ریاضی معمولاً عدد اعشاری تولید می‌کند، پس پایتون رفتار یکسانی دارد و غافلگیرتان نمی‌کند.

۲. سه نوع تقسیم

سه عملگر / و // و % سه سؤال متفاوت را جواب می‌دهند. اگر ۱۰ شکلات داشته باشید و بخواهید بین ۳ نفر تقسیم کنید:

# '/' 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

شرح مثال

۳. باقیمانده به چه دردی می‌خورد

عملگر % در نگاه اول بی‌مصرف به نظر می‌رسد، ولی یکی از پرکاربردترین عملگرهای برنامه‌نویسی است. سه کاربرد اصلی‌اش:

۴. اولویت عملگرها

وقتی چند عملگر در یک عبارت باشند، پایتون همان ترتیبی را رعایت می‌کند که در ریاضی یاد گرفته‌اید: اول توان، بعد ضرب و تقسیم، آخر جمع و تفریق. عملگرهای هم‌رتبه از چپ به راست حساب می‌شوند.

# 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

شرح مثال

قانون طلایی

ضرورتی ندارد جدول اولویت را حفظ کنید. برنامه‌نویس‌های حرفه‌ای هم حفظ نیستند. هر جا شک کردید، پرانتز بگذارید. پرانتز اضافه هیچ هزینه‌ای ندارد و کد را برای کسی که بعداً می‌خواندش روشن‌تر می‌کند.

۵. به‌روزرسانی یک متغیر با خودش

این خط در نگاه اول ممکن است عجیب به نظر برسد: 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

شرح مثال

۷. چند برنامه کوچک

حالا عملگرها را با ورودی کاربر ترکیب کنیم. اولی فقط دو واحد به عدد کاربر اضافه می‌کند:

# 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 بر سه تقسیم می‌شود و جواب کاملاً غلط در می‌آید. بدتر اینکه برنامه هیچ خطایی نمی‌دهد و شما تا وقتی جواب را با ماشین‌حساب چک نکنید، متوجه نمی‌شوید. این موارد را خطای منطقی می‌گویند و سخت‌ترین نوع خطا هستند.

چرا در فایل نمونه نوشته‌اند total و ننوشته‌اند sum

در فایل 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

شرح مثال

عدد ۳۷۲۵ را دنبال کنیم:

الگویی که اینجا دیدید در همه تبدیل واحدها تکرار می‌شود: با // واحد بزرگ‌تر را بردار، با % باقیمانده را نگه دار، و روی باقیمانده همین کار را با واحد کوچک‌تر تکرار کن.

فایل‌های تمرینی این فصل

پوشه S02-operators شامل نمونه‌های 01_arithmetic_operators.py تا 10_seconds_to_time.py.

خلاصه فصل

ابزاروظیفه آن
+ - * /چهار عمل اصلی. نتیجه / همیشه اعشاری است
//تقسیم صحیح: فقط بخش کامل، اعشار بریده می‌شود
%باقیمانده. برای زوج و فرد، بخش‌پذیری و جدا کردن ارقام
**توان. از راست به چپ حساب می‌شود
اولویتاول **، بعد * / // %، آخر + -
پرانتزهمیشه برنده است. هر جا شک دارید بگذاریدش
x += 1شکل کوتاه x = x + 1. برای - و * و سایر موارد نیز هست

تمرین‌های فصل دو

  1. دو عدد بگیرید و نتیجه هر هفت عملگر ریاضی را روی آنها چاپ کنید.
  2. تعدادی دقیقه بگیرید و بگویید چند ساعت و چند دقیقه است.
  3. قیمت یک کالا را بگیرید و قیمت با احتساب ۹ درصد مالیات را چاپ کنید.
  4. یک عدد سه رقمی بگیرید و رقم صدگان، دهگان و یکانش را جدا چاپ کنید. راهنمایی: با // و %.
  5. شعاع دایره را بگیرید و مساحت و محیطش را چاپ کنید. مقدار PI = 3.14159 را خودتان بسازید.
  6. نمره چهار درس را بگیرید و میانگین را چاپ کنید. مراقب پرانتز باشید.
  7. توضیح دهید چرا 10 / 5 نتیجه 2.0 می‌دهد ولی 10 // 5 نتیجه 2.
  8. یک عدد بگیرید و بگویید باقیمانده‌اش بر ۲ چند است. بعد از فصل چهارم می‌توانید همین را به «زوج است یا فرد» تبدیل کنید.
فصل قبل: اولین قدم‌ها فصل بعد: رشته‌ها