مبانی زبان

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

۵ دقیقه مطالعه · به‌روزرسانی ۲۲ مهر ۱۴۰۵

عبارت (expression) از ترکیب اشیا و عملگرها ساخته می‌شود و ساده‌ترین شکلش این است:

شیء  عملگر  شیء

مثل 3 + 2. هر عبارت یک مقدار دارد و آن مقدار یک نوع.

عملگرهای حسابی

عملگر معنا مثال نتیجه
+ جمع 7 + 2 9
- تفریق 7 - 2 5
* ضرب 7 * 2 14
/ تقسیم 7 / 2 3.5
// تقسیم صحیح 7 // 2 3
% باقی‌مانده 7 % 2 1
** توان 7 ** 2 49

قانون نوع نتیجه:

  • در +، - و *: اگر هر دو طرف int باشند، نتیجه int است؛ اگر حداقل یکی float باشد، نتیجه float است.
  • نتیجهٔ / همیشه float است؛ حتی 6 / 2 می‌شود 3.0.
  • // قسمت صحیح تقسیم را می‌دهد (اگر هر دو طرف int باشند، نتیجه int است).
print(6 / 2)
print(7 // 2, 7 % 2)
print(2 ** 10)
print(2 ** 0.5)     # توان کسری = ریشه
print(10 + 2.0)

کاربردهای پرتکرار ٪ و //

باقی‌مانده و تقسیم صحیح در مسئله‌های برنامه‌نویسی بسیار پرکاربردند:

n = 1357
print(n % 2 == 0)   # زوج است؟
print(n % 10)       # رقم یکان: 7
print(n // 10)      # حذف رقم آخر: 135
print(n % 100)      # دو رقم آخر: 57

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

بدون پرانتز، پایتون این ترتیب را رعایت می‌کند (از بالا به پایین):

  1. ** (توان)
  2. *، /، //، %
  3. + و -

عملگرهای هم‌سطح از چپ به راست اجرا می‌شوند (به جز ** که از راست به چپ است).

print(1 + 5 * 3)     # 16
print((1 + 5) * 3)   # 18
print(2 ** 3 ** 2)   # 2 ** 9 = 512، نه 8 ** 2
print(-2 ** 2)       # -4 ! چون توان از منفی اولویت بیشتری دارد

💡 قانون طلایی: هر وقت شک دارید، پرانتز بگذارید. پرانتز اضافه هیچ ضرری ندارد و کد را خواناتر می‌کند. خطای «فراموش کردن اولویت» یک خطای منطقی است و پایتون هیچ هشداری برایش نمی‌دهد.

عملگرهای ترکیبی (Augmented Assignment)

خیلی وقت‌ها می‌خواهیم مقدار یک متغیر را بر اساس مقدار قبلی‌اش تغییر دهیم:

a = 2
a = a + 3
print(a)

پایتون (مثل بیشتر زبان‌ها) برای این کار شکل کوتاه‌تری دارد:

a = 2
a += 3      # یعنی a = a + 3
b = 10
b *= 12     # یعنی b = b * 12
c = 100
c -= 1      # یعنی c = c - 1
d = 17
d //= 5     # یعنی d = d // 5
print(a, b, c, d)

+=، -=، *=، /=، //=، %= و **= همه وجود دارند. این‌ها در حلقه‌ها برای شمردن و جمع زدن مدام استفاده می‌شوند.

⚠️ پایتون عملگر ++ ندارد. i++ خطای نحوی است؛ بنویسید i += 1.

عملگرهای مقایسه

نتیجهٔ مقایسه همیشه True یا False است:

عملگر معنا
i > j، i >= j بزرگ‌تر، بزرگ‌تر یا مساوی
i < j، i <= j کوچک‌تر، کوچک‌تر یا مساوی
i == j برابری: اگر i برابر j باشد True
i != j نابرابری: اگر i برابر j نباشد True

⚠️ دام بزرگ: = (یک مساوی) یعنی انتساب («این مقدار را در متغیر بگذار»)، اما == (دو مساوی) یعنی مقایسه («آیا این دو برابرند؟»). نوشتن if x = 5: خطای نحوی است.

پایتون اجازهٔ مقایسهٔ زنجیره‌ای هم می‌دهد که خیلی شبیه ریاضی است:

x = 7
print(1 < x < 10)      # معادل 1 < x and x < 10
print(0 <= x <= 5)

عملگرهای منطقی

برای ترکیب شرط‌ها:

عبارت چه وقت True است؟
not a وقتی a برابر False باشد (برعکس می‌کند)
a and b فقط وقتی هر دو True باشند
a or b وقتی حداقل یکی True باشد
age = 25
has_card = False
print(age >= 18 and has_card)
print(age >= 18 or has_card)
print(not has_card)

اولویت: not بالاتر از and و and بالاتر از or است. باز هم: شک دارید؟ پرانتز!

💡 نکتهٔ پیشرفته (اتصال کوتاه): در a and b اگر a نادرست باشد، پایتون اصلاً b را بررسی نمی‌کند؛ چون جواب به‌هرحال False است. در a or b هم اگر a درست باشد، b بررسی نمی‌شود. از این ویژگی برای جلوگیری از خطا استفاده می‌شود: if y != 0 and x / y > 2: هیچ‌وقت خطای تقسیم بر صفر نمی‌دهد.

دام رایج در ترکیب شرط‌ها

می‌خواهیم بررسی کنیم که یک حرف صدادار است یا نه:

ch = "z"
print(ch == "a" or "e")            # اشتباه! همیشه Truthy است
print(ch == "a" or ch == "e")      # درست
print(ch in "aeiou")               # بهتر و کوتاه‌تر

در خط اول، پایتون آن را به شکل (ch == "a") or ("e") می‌خواند و چون رشتهٔ "e" خالی نیست، نتیجه همیشه Truthy است. هر شرط را کامل بنویسید یا از in استفاده کنید که در درس رشته‌ها می‌بینیم.

تمرین

خروجی هر خط را اول روی کاغذ حساب کنید، بعد اجرا کنید:

print(17 // 5, 17 % 5, -17 // 5)
print(2 + 3 * 4 ** 2 / 8)
print(10 / 5 == 2)
print(not 0 and 5 > 3)
جواب
  • 3 2 -4: دقت کنید // به سمت منفی بی‌نهایت گرد می‌کند، نه به سمت صفر. پس -17 // 5 می‌شود -4 (چون -3.4 به پایین گرد می‌شود).
  • 8.0: اول 4 ** 2 = 16، بعد 3 * 16 = 48، بعد 48 / 8 = 6.0، و در آخر 2 + 6.0.
  • True: 10 / 5 برابر 2.0 است و 2.0 == 2 درست است.
  • True: not 0 می‌شود True و 5 > 3 هم True است.