PyDA Course
📖 درس 5 مبتدئ ⏱ 12 دقيقة ⚡ +10 XP ColabKagglenbviewerBinderDeepnoteGitHub arithmetic · division · modulo · exponent · precedence

عوامل الحساب

اجمع واطرح واضرب واقسم وقسم بأرضية واحسب الباقي والأس ، جميع عوامل الحساب الثمانية.

🎯 ماذا ستتعلم:
  • استخدام عوامل الحساب الثمانية جميعها: +, -, *, /, //, %, **
  • فهم القسمة الصحيحة (الأرضية) مقابل القسمة الحقيقية
  • تطبيق أولوية العمليات (PEMDAS)
  • استخدام الأقواس لتجاوز الأولوية

عواملَ تستعيرها الآلة من الرياضيات

كتبت دوالّ مساعدة في دروس سابقة: خزّن قيمةً، اطبعها، بدّل نوعها. لا يفيد شيءٌ من ذلك حتى يستطيع برنامجٌ أن يفعل شيئًا بالأعداد. لذا توقف قليلًا وتأمل: وُجد الحاسوب لتقييم التعبيرات، وكل تعبيرٍ يُبنى من عوامل تصل القيم. أنت تعرف حسابيةَ الورق ، لكن الآلة تقصّ اثنين منها إلى نصفين.

العوامل ومعانيها

توفّر بايثون ثمانية. الأربعة الأولى هي بالضبط ما تتوقعه:

python
7 + 2    # 9   — الجمع
7 - 2    # 5   — الطرح
7 * 2    # 14  — الضرب
7 / 2    # 3.5 — القسمة الحقيقية (ترجع float دائمًا)

ثم ثلاثة تجيب عن أسئلة لم تطرحها إلا في الواجبات:

python
7 // 2   # 3   — قسمة الأرضية (تقريب نحو −∞)
7 % 2    # 1   — المقياس (الباقي)
7 ** 2   # 49  — الأُس (7²)

** هو كتابة بايثون للقوة: 72=497^2 = 49. أما الوافدان الجديدان فهما // و%، وليسا تباينين ، بل نصفا سؤالٍ واحدٍ مشروع.

نصفان لقسمةٍ واحدة

اطرح سؤالًا حقيقيًّا: كم مجموعةً كاملةً من أربعة تَسع العددَ 15، وما الذي يتبقى؟

15=43+3.15 = 4 \cdot 3 + 3.

للجواب جزآن ، خارج القسمة 33 والباقي 33. يجيب // في بايثون عن الجزء الأول ويجيب % عن الثاني:

a=(a//b)b+(a%b)a = (a \mathbin{//} b) \cdot b + (a \mathbin{\%} b)
python
15 // 4   # 3   — كم مجموعة من 4
15 % 4    # 3   — كم يتبقى
4 * 3 + 3 # 15  ✓ تتحقق الهوية

تلك الهوية ليست زخرفة ، إنها تعريف العاملَين، ولا يمكن أن تفشل ما دامت الآلة نفسها تحسب الجزأين.

ثمة التواءة. ما خارج القسمة الذي تخبرك به بايثون لمسألة 7÷2-7 \div 2؟ اكتبها سؤالَ تجميع:

7=2?+?.-7 = 2 \cdot ? + ? .

الخياران هما 2(3)+(1)2 \cdot (-3) + (-1) أو 2(4)+12 \cdot (-4) + 1. تأخذ بايثون الأرضية، مثل الدالة الرياضية x\lfloor x \rfloor:

python
-7 // 2   # -4 — أرضية (-3.5) = -4 لا -3
-7 % 2    # 1  — ملتزمة بالأرضية: -7 = 2·(-4) + 1

يظلّ العاملان صادقَين أحدهما للآخر: الهوية a=(a//b)b+(a%b)a = (a//b)\cdot b + (a\%b) تقوم بلا استثناء، وهذا أثمن من “الجواب البديهي”.

ترتيب العمليات، محسومٌ

التعبير الذي فيه عوامل متعددة يحتاج تسلسلًا ثابتًا، وإلا لحسب كل قارئ قيمةً مختلفةً لـ 2+342 + 3 \cdot 4. تعتمد بايثون الترتيب الذي تعلمته باسم PEMDAS:

  • ** أولًا (الأُس)
  • ثم *, /, //, % (من اليسار إلى اليمين)
  • ثم +, - (من اليسار إلى اليمين)
python
2 + 3 * 4      # 14، لا 20
(2 + 3) * 4    # 20 — الأقواس تتجاوز
2 ** 3 ** 2    # 512، لا 64

ذاك الأخير مفاجأة حقيقية. ** ترابطيٌّ يميني، فيُقرأ 2 ** 3 ** 2 هكذا 2(32)=29=5122^{(3^2)} = 2^9 = 512، مطابقًا للتدوين المكدّس حيث تصعد القوى في اتجاهٍ واحد. وعند الشك فصّل الأقواس ، قارئٌ لا يرى الأقواس لن يخمّن قصدك.

مثالٌ محلول: باقي خطةِ القراءة

يديرُ الزوجُ حاصلُ القسمةِ/الباقي خطةَ قراءةٍ:

python
pages = 301
per_day = 30
days = pages // per_day      # 10 — أيامُ قراءةٍ كاملة
leftover = pages % per_day   # 1  — باقي اليوم الحادي عشر

print(f"{days} full days, {leftover} leftover")
days * per_day + leftover    # 301 — تتحقق الهوية

تصيرُ هويةُ القسمةِ a=(a//b)b+(a%b)a = (a \mathbin{//} b) \cdot b + (a \mathbin{\%} b) دفترَ حسابٍ: days وleftover عموداهُ، والهويةُ إيصالٌ يثبتُ أنَّ شيئًا لم يضِع.

أخطاء شائعة

  • / مقابل //. 7 / 2 يساوي 3.5 (float)؛ 7 // 2 يساوي 3 (int). لا تلجأ إلى // إلا حين يكون الخارج الصحيح هو ما تطلبه المسألة.
  • قسمة الأرضية مع السوالب. -7 // 2 يساوي -4 لا -3. الأرضية تسير نحو -\infty لا نحو الصفر.
  • % يعمل مع الكسور أيضًا. 7.5 % 2 يساوي 1.5 ، الهوية أعلاه تصلح للأعداد الحقيقية كما للأعداد الصحيحة.
  • يرتبط ** أقوى من *. 2 * 3 ** 2 يساوي 18 لا 36 ، تُحسب القوةُ أولًا. ضعِ الأقواسَ متى أردت (2 * 3) ** 2 = 36.

🧩 تحديات

🧩 تحدٍّ ، فكّر أولًا ثم أظهر

دون تشغيله، احسب 15 // 4 و15 % 4 بيدك ثم تحقق أن 4(15//4)+(15%4)4 \cdot (15 // 4) + (15 \% 4) تعيد إنتاج 1515.

💡 الجواب: 15 // 4 يساوي 3 (أرضية $3.75$)، و15 % 4 يساوي 3، لأن $15 = 4\cdot 3 + 3$. ومعًا: 4 * 3 + 3 = 15 ، هوية القسمة، تحقّقنا منها.

🧩 تحدٍّ ، فكّر أولًا ثم أظهر

كيف تستخرج رقم المئات من أي عدد؟ من n = 4567، أخرج 5 باستخدام الحساب فقط دون سلاسل.

💡 الجواب: (n // 100) % 10 ، قسّم أولًا على 100 لتزيح الرقم يمينًا (4567 ← 45)، ثم خذ المقياس 10 لتُبقي آخر رقم فقط (45 ← 5).

🧩 تحدٍّ ، فكّر أولًا ثم أظهر

لماذا تستخدم بايثون ** للأس بدلًا من ^؟ وماذا يفعل ^ فعلًا في بايثون؟

💡 الجواب: `^` هو عامل XOR على البتات في بايثون، لا الأُس. تستخدم بايثون `**` تجنبًا للاصطدام مع اصطلاح لغاتٍ يكون فيها `^` بمعنى XOR.

🤔 أسئلة سقراطية

  • لماذا تقرّب قسمة الأرضية نحو سالب اللانهاية لا نحو الصفر؟ وما الفائدة العملية التي تسقط من هذا الاختيار (تلميح: فكّر في divmod() وهو يرجِع زوجًا متسقًا)؟
  • 2 ** 3 ** 2 يساوي 512 لا 64. لماذا يكون ** ترابطيًّا يمينيًّا بينما + و* ترابطيّان يساريًّا؟
  • أين تكسب الحسابات المقياسية (modulo) قوتها في الحياة؟ فكّر في الساعات وأيام التقويم وفهارس المصفوفات.

✅ فحص سريع

١. ما ناتج -7 // 2؟

٢. ما ناتج 2 ** 3 ** 2؟

٣. ما ناتج 7 % 3؟

arithmeticdivisionmoduloexponentprecedence