مبانی زبان
عملگرهای ریاضی، مقایسهای و منطقی در پایتون
عبارت (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
اولویت عملگرها
بدون پرانتز، پایتون این ترتیب را رعایت میکند (از بالا به پایین):
**(توان)*،/،//،%+و-
عملگرهای همسطح از چپ به راست اجرا میشوند (به جز ** که از راست به چپ است).
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است.