عوامل Python: الحساب و// و%، والمقارنة وand/or/not، ودالة python round
العامل / في Python يعطي دائماً float، و// يعطي الجزء الصحيح مع التقريب للأسفل، و% يعطي الباقي، و** هو الأس. الدالة round(x, n) تقرّب إلى n منزلة بالطريقة المصرفية: round(2.5) تعطي 2 وround(3.5) تعطي 4، وللتقريب للأعلى والأسفل إلى عدد صحيح تُستخدم math.ceil وmath.floor، والقيمة المطلقة تعطيها abs.
عوامل Python رموز تحوّل القيم إلى قيم جديدة: + تجمع، و// تقسم قسمة صحيحة، وand تربط الشروط. فيما يلي قائمة كاملة بالعوامل مع أمثلة، والفرق بين / و//، ومنطق and وor وnot، وكذلك دوال التقريب: دالة python round، وmath.ceil، وmath.floor، وabs. يمكنك لصق كل الأمثلة في الوحدة التفاعلية REPL وتجربتها.
قائمة عوامل Python
تنقسم العوامل حسب وظيفتها. لا حاجة إلى حفظ الجدول كله: في الكود الواقعي تتكرر العمليات الحسابية والمقارنة والروابط المنطقية أكثر من غيرها.
| المجموعة | العوامل | مثال |
|---|---|---|
| الحسابية | + - * / // % ** | 7 // 2 ← 3 |
| المقارنة | == != < > <= >= | 3 < 5 ← True |
| المنطقية | and or not | not True ← False |
| الهوية | is، is not | x is None |
| الانتماء | in، not in | "ق" in "قهوة" ← True |
| التعيين | = += -= *= /= //= %= **= | total += 250 |
| المعامل الحيتاني | := | if (n := len(s)) > 10: |
| البتية (Bitwise) | & | ^ ~ << >> | 5 & 3 ← 1 |
العوامل الحسابية
الجمع والطرح والضرب تعمل كما في المدرسة. وإذا دخل في التعبير عدد float واحد على الأقل فالنتيجة أيضاً float: فـ 2 + 1.0 تعطي 3.0. والأعداد الصحيحة في Python لا تفيض عن حدها: فالعدد 2 ** 100 يُحسب بدقة مهما بلغت عدد خاناته.
>>> 250 + 120
370
>>> 12.5 * 3
37.5
>>> 2 ** 10
1024
>>> 2 ** 0.5
1.4142135623730951
الأس في Python: العامل **
رفع الأس يتم بنجمتين وليس بالرمز ^، لأن الرمز ^ في Python يعني «XOR» البتي، فـ 2 ^ 3 تعطي 1 لا 8. والأس الكسري يعطي جذراً: فـ 9 ** 0.5 تساوي 3.0. وتوجد الدالة pow(x, y) وهي المكافئ نفسه، مع وسيط ثالث للباقي: pow(2, 10, 1000) تعطي 24.
انتبه إلى الأولوية: العامل ** يُنفَّذ قبل السالب الأحادي، لذلك -2 ** 2 تساوي -4. وإذا أردت مربع عدد سالب فاكتب الأقواس: (-2) ** 2.
القسمة في Python: /، و// و%
في Python نوعان من القسمة، وهذا أكبر مصدر للمفاجآت عند المبتدئين. القسمة العادية / تعطي دائماً float، حتى لو كانت القسمة تامة. أما القسمة الصحيحة // فتُسقط الجزء الكسري، والعامل % يعطي الباقي.
>>> 7 / 2
3.5
>>> 8 / 2
4.0
>>> 7 // 2
3
>>> 7 % 2
1
القسمة الصحيحة // والباقي %: من التطبيق
الزوج // و% يحل مسائل مثل «كم عدداً صحيحاً وكم بقي». في الدورة يحفظ متتبع المصروفات المبالغ بالفلس (أصغر وحدة) حتى لا تضيع الدقة، ويفصل المبلغ إلى دنانير وفلوس:
fils = 125050 # نخزّن المبالغ بالفلس
dinars = fils // 100 # 1250 — الدنانير الكاملة
rest = fils % 100 # 50 — الباقي
print(dinars, rest) # 1250 50
print(40 // 7, "أسابيع و", 40 % 7, "أيام") # 5 أسابيع و 5 أيام
تعيد الدالة المدمجة divmod العمليتين معاً: divmod(125050, 100) تعطي الصف (1250, 50). والباقي مفيد أيضاً لمعرفة الزوجية: العبارة n % 2 == 0 صحيحة للأعداد الزوجية.
الأعداد السالبة: // يقرّب للأسفل
العامل // لا يكتفي بإسقاط الكسر، بل يقرّب للأسفل، أي نحو سالب ما لا نهاية. مع الأعداد الموجبة لا فرق، أما مع السالبة فهناك فرق. وإشارة الباقي % في Python تطابق إشارة المقسوم عليه، لذلك يتحقق دائماً أن a == (a // b) * b + a % b.
>>> -7 // 2
-4
>>> -7 % 2
1
>>> int(-7 / 2) # إسقاط الكسر لا التقريب للأسفل
-3
القسمة على صفر: أي خطأ يظهر
القسمة على صفر بأي عامل من الثلاثة تُطلق الاستثناء ZeroDivisionError، وهذا يشمل الأعداد الصحيحة والكسرية. ويمكن التقاطه بـ try/except أو فحص المقسوم عليه مسبقاً.
>>> 10 / 0
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
>>> count = 0
>>> avg = 1500 / count if count else 0
>>> avg
0
عوامل المقارنة
تُعيد المقارنات القيمة True أو False. يُفحص التساوي بالرمز المزدوج ==، أما الرمز المفرد = فهو تعيين. والنصوص تُقارن حرفاً حرفاً حسب رموز الأحرف، لذلك فـ "B" < "a" صحيحة: الأحرف الكبيرة تأتي قبل الصغيرة.
>>> 250 == 250.0
True
>>> 3 != 4
True
>>> 1 < 5 <= 10 # سلسلة: 1 < 5 and 5 <= 10
True
>>> 0.1 + 0.2 == 0.3
False
سلاسل المقارنة مثل 0 <= x < 100 ميزة مريحة في Python، فلا حاجة إلى كتابة and. والسطر الأخير يذكّر بخطأ الأعداد الكسرية: 0.1 + 0.2 تعطي 0.30000000000000004. قارن الأعداد الكسرية بـ math.isclose(a, b)، واحفظ المبالغ المالية بالفلس أو باستخدام Decimal.
العوامل المنطقية and وor وnot
تُكتب العوامل المنطقية في Python كلمات لا رموزاً مثل && و|| كما في لغات أخرى. فـ and صحيحة عندما يكون الطرفان صحيحين، وor عندما يكون أحدهما صحيحاً على الأقل، وnot تقلب القيمة.
| a | b | a and b | a or b | not a |
|---|---|---|---|---|
| True | True | True | True | False |
| True | False | False | True | False |
| False | True | False | True | True |
| False | False | False | False | True |
الأولوية: أولاً not، ثم and، ثم or. فالتعبير True or False and False يساوي True لأن and تُحسب أولاً. وفي الشروط المعقدة ضع أقواساً، فهذا أوضح لك ولزملائك.
ماذا تعيد and وor فعلاً
and وor لا تعيدان بالضرورة True أو False، بل تعيدان أحد المعاملين. فـ or تعطي أول قيمة صحيحة (أو الأخيرة إن لم توجد صحيحة)، وand تعطي أول قيمة خاطئة (أو الأخيرة). والقيم الخاطئة هي 0 و0.0 والنص الفارغ والمجموعات الفارغة وNone وFalse.
>>> name = ""
>>> name or "ضيف"
'ضيف'
>>> 5 and 0
0
>>> not ""
True
الحساب كسول: إذا تحدد الناتج من الطرف الأيسر فلا يُحسب الطرف الأيمن. لذلك لن يسقط count and total / count بخطأ القسمة على صفر عندما يكون count == 0. والعامل not وحده يعيد دائماً قيمة من نوع bool.
العاملان is وin
== تقارن القيم، أما is فتتحقق أن الاسمين يشيران إلى الكائن نفسه. سلتان فارغتان متساويتان لكنهما ليستا كائناً واحداً. والموضع الوحيد الذي تحتاج فيه إلى is باستمرار هو التحقق من None: if x is None.
>>> a = [250, 120]
>>> b = [250, 120]
>>> a == b, a is b
(True, False)
>>> c = a
>>> c is a
True
لا تقارن الأعداد والنصوص بـ is: أحياناً «يعمل» ذلك بسبب التخزين المؤقت الداخلي للكائنات، لكن النتيجة تعتمد على التطبيق، وتُظهر Python تحذير SyntaxWarning على تراكيب مثل x is 5.
العامل in يتحقق من الاحتواء: نص داخل نص، أو عنصر داخل قائمة، أو مفتاح داخل قاموس. وnot in هو العكس.
>>> "قهوة" in "قهوة مع النقل"
True
>>> "طعام" in {"طعام": 450, "تاكسي": 300}
True
>>> 5 not in [1, 2, 3]
True
عوامل التعيين والمعامل الحيتاني :=
العوامل المركبة += و-= و*= و//= وغيرها اختصار: فـ total += 250 تعني total = total + 250. ولا توجد في Python العوامل ++ و--: فـ x++ تسبب خطأ صياغياً.
المعامل الحيتاني := (سُمّي كذلك لشبهه بعيني الفظ وأنيابه) يعيّن قيمة داخل التعبير نفسه. وهو مفيد عندما تحتاج إلى القيمة للفحص ثم للاستخدام:
items = ["قهوة", "تاكسي", "غداء", "سينما"]
if (n := len(items)) > 3:
print(f"مصروفات كثيرة: {n}")
while (line := input("المبلغ: ")) != "":
print(int(line) * 2)
بدونه كان سيلزم استدعاء len مرتين أو وضع التعيين في سطر منفصل. ولا ينبغي الإفراط في استخدامه: إذا صار السطر غير مقروء فالتعيين العادي أفضل.
التقريب في Python: round وceil وfloor
للتقريب في Python دالة مدمجة هي round، ودوال في الوحدة math. وهي تحل مسائل مختلفة، والخلط بينها خطأ شائع.
| الدالة | ماذا تفعل | 2.5 | -2.5 | 2.7 |
|---|---|---|---|---|
round(x) | إلى الأقرب، والمنتصف إلى الزوجي | 2 | -2 | 3 |
math.floor(x) | للأسفل، نحو سالب ما لا نهاية | 2 | -3 | 2 |
math.ceil(x) | للأعلى، نحو موجب ما لا نهاية | 3 | -2 | 3 |
math.trunc(x)، int(x) | إسقاط الكسر، نحو الصفر | 2 | -2 | 2 |
دالة round في Python والتقريب المصرفي
الدالة round(x, n) تقرّب إلى n منزلة بعد الفاصلة، وإذا لم تُذكر n تعيد عدداً صحيحاً int. وأهم فخ هنا: python round يقرّب «بالطريقة المصرفية»، أي المنتصف إلى الزوجي. لذلك فـ round(2.5) تعطي 2، وround(3.5) تعطي 4. وبهذا لا تتراكم أخطاء التقريب في اتجاه واحد عند الحسابات الكبيرة.
>>> round(2.5), round(3.5)
(2, 4)
>>> round(3.14159, 2)
3.14
>>> round(1250, -2) # إلى أقرب مئة
1200
>>> round(2.675, 2) # ليس 2.68: في النظام الثنائي هو 2.67499...
2.67
إذا أردت التقريب المدرسي المعتاد «المنتصف إلى الأعلى»، مثلاً في الفاتورة، فاستخدم Decimal مع الوضع ROUND_HALF_UP. مرّر الرقم كنص كي لا ترث خطأ float:
>>> from decimal import Decimal, ROUND_HALF_UP
>>> Decimal("2.5").quantize(Decimal("1"), ROUND_HALF_UP)
Decimal('3')
>>> Decimal("2.675").quantize(Decimal("0.01"), ROUND_HALF_UP)
Decimal('2.68')
وقاعدة أخرى من الدورة: قرّب فقط عند العرض. للطباعة الأنيقة لا حاجة إلى round، فيكفي نص f-string: f"{amount:.2f}" يعرض منزلتين، والقيمة نفسها تبقى دقيقة.
math.ceil وmath.floor: التقريب للأعلى والأسفل
تحتاج math.ceil عندما لا يجوز أن «ينقص» شيء: كم حافلة نطلب، وكم صفحة تلزم للنتائج. أما math.floor فيُستخدم عندما تُحسب الوحدات الكاملة فقط. وكلتاهما تعيدان int.
import math
guests = 47
seats = 20
print(math.ceil(guests / seats)) # 3 حافلات
print(math.floor(9.99)) # 9
print(-(-guests // seats)) # 3 — ceil بدون math، بحيلة //
في الوحدة math دوال مفيدة أخرى: math.sqrt (الجذر)، وmath.isclose (مقارنة الكسور)، وmath.pi، وmath.gcd. وظهرت في Python 3.15 وحدة فرعية math.integer (PEP 791) للرياضيات الصحيحة، فيها comb وfactorial وgcd وisqrt وlcm وperm، بينما تستمر الدوال القديمة مثل math.gcd في العمل.
الدالة abs: القيمة المطلقة
abs(x) تعيد القيمة المطلقة، أي البعد عن الصفر دون إشارة. لا تحتاج إلى استيراد، فهي دالة مدمجة. وتعمل مع الأعداد الصحيحة والكسرية وحتى المركبة: مع 3+4j تعيد طول المتجه، أي 5.0.
>>> abs(-250)
250
>>> abs(-12.5)
12.5
>>> budget, spent = 5000, 5320
>>> abs(budget - spent) # بكم انحرفنا
320
الاستخدام النموذجي هو الفرق بغض النظر عن الاتجاه، والمقارنة مع هامش خطأ: abs(a - b) < 0.001. ومع الكسور تكون math.isclose أدق، لأنها تأخذ حجم الأعداد في الحسبان.
أولوية العوامل
حين يحتوي التعبير على عدة عوامل ينفذ Python بحسب الأولوية، من الأعلى إلى الأدنى:
**- العوامل الأحادية
-xو+xو~x * / // %+ -- إزاحات البتات والعمليات البتية
- المقارنات، و
in، وis notandor:=
فـ 2 + 3 * 4 تساوي 14، و(2 + 3) * 4 تساوي 20. وإذا شككت فضع أقواساً: الأقواس الزائدة لا تكلّف شيئاً، أما خطأ الأولوية فيستغرق وقتاً طويلاً للعثور عليه.
أخطاء شائعة مع العوامل
| الخطأ | ما الذي يحدث | الصواب |
|---|---|---|
if x = 5: | SyntaxError: هذا تعيين | if x == 5: |
2 ^ 3 بدلاً من الأس | XOR بتي، والنتيجة 1 | 2 ** 3 |
انتظار عدد صحيح من 8 / 2 | تحصل على 4.0 | 8 // 2 |
x == 1 or 2 | صحيحة دائماً: or 2 | x in (1, 2) |
انتظار 3 من round(2.5) | التقريب المصرفي يعطي 2 | Decimal مع ROUND_HALF_UP |
"5" + 5 | TypeError | int("5") + 5 |
الخلاصة
تذكّر الأساسيات: / تعطي دائماً float، و// تقرّب للأسفل، و% تعيد الباقي بإشارة المقسوم عليه، والأس هو **. العوامل المنطقية and وor وnot تُكتب كلمات وتُحسب بالكسل، وis تُستخدم للتحقق من None. دالة python round تقرّب إلى الزوجي، وللتقريب للأعلى والأسفل توجد math.ceil وmath.floor، والقيمة المطلقة تعطيها abs. وفي الدورة تُشرح هذه العوامل عملياً في متتبع المصروفات، حيث تُحفظ المبالغ بالفلس.
الأسئلة الشائعة
كيف أقرّب عدداً في Python إلى منزلتين عشريتين؟
استخدم round(x, 2)، وإذا أردت العرض فقط فاستخدم f-string مثل f"{x:.2f}" الذي لا يغيّر القيمة نفسها.
لماذا تعيد round(0.5) في Python القيمة 0؟
لأن round تقرّب المنتصف إلى أقرب عدد زوجي، والصفر زوجي؛ وكذلك round(1.5) وround(2.5) تعطيان 2.
كيف أحصل على الجزء الصحيح من القسمة في Python؟
بالعامل //: فـ 17 // 5 تعطي 3. وهو مع الأعداد السالبة يقرّب للأسفل، فـ -17 // 5 تعطي -4؛ وإذا أردت إسقاط الكسر نحو الصفر فاستخدم int(-17 / 5).
هل يوجد في Python عامل شرطي ثلاثي؟
نعم، وهو التعبير الشرطي: قيمة_إذا_صح if الشرط else قيمة_إذا_خطأ، مثل "زوجي" if n % 2 == 0 else "فردي".
ما الفرق بين & وand في Python؟
and عامل منطقي بحساب كسول، أما & فهو AND البتي للأعداد والتقاطع للمجموعات؛ وفي الشروط استخدم and.
يُشرح هذا الموضوع بالتفصيل مع التطبيق العملي في دورة «Python 3.15: от новичка до профи».
الانتقال إلى الدورة