2.3. العمليات الحسابية

يعمل Python كآلة حاسبة منذ البداية. تتناول هذه الصفحة العوامل التي ستستخدمها في الأغلب الأعم: الحساب على الأعداد، والمقارنات التي تنتج قيمًا منطقية، والعوامل المنطقية التي تجمع الشروط، والعوامل على مستوى البتات للعمل على مستوى العتاد.

2.3.1. الحساب

العوامل الحسابية القياسية على قيم int وfloat:

  • + -- الجمع

  • - -- الطرح (أو النفي، كبادئة: -x)

  • * -- الضرب

  • / -- القسمة. تُرجع دائمًا قيمة float، حتى عندما يكون كلا المعاملين عددين صحيحين.

  • // -- القسمة الأرضية. تُرجع خارج القسمة الصحيح مقرَّبًا نحو سالب ما لا نهاية.

  • % -- باقي القسمة (الباقي).

  • ** -- الأُس (2 ** 10 يساوي 1024).

>>> 7 / 2
3.5
>>> 7 // 2
3
>>> -7 // 2
-4
>>> 7 % 2
1
>>> 2 ** 16
65536

يرفّع الحساب مختلط الأنواع الأعداد الصحيحة إلى أعداد عائمة تلقائيًا:

>>> 3 + 0.5
3.5

يجمع الإسناد المُعزَّز بين العامل و= لإجراء تحديث مدمج في المكان:

counter = 0
counter += 1                # equivalent to counter = counter + 1
counter *= 2                # works for *= /= //= %= **= too

تتبع أسبقية العوامل الترتيب التقليدي: ** أولًا، ثم النفي الأحادي -، ثم * و/ و// و%، ثم + و-. استخدم الأقواس عندما تكون غير متأكد -- فهي لا تكلّف شيئًا أثناء التشغيل.

2.3.2. المقارنة

تُرجع عوامل المقارنة قيمة bool (True أو False):

  • == و!= -- يساوي / لا يساوي.

  • < و<= و> و>= -- الترتيب.

>>> 3 == 3
True
>>> 3 == 3.0
True
>>> 3 < 5 <= 5
True

المثال الأخير هو مقارنة متسلسلة وهو مكافئ تمامًا لـ 3 < 5 and 5 <= 5.

تحذير

تُسنِد =؛ بينما تُقارن ==. التعبير if x = 5: هو خطأ في بناء الجملة تحديدًا لأن Python يرفض أن يخلط بينهما بصمت.

2.3.3. المنطق البولياني

تجمع ثلاثة عوامل بين القيم المنطقية:

  • and -- True فقط عندما يكون كلا الطرفين صحيحًا.

  • or -- True عندما يكون أيٌّ من الطرفين صحيحًا.

  • not -- يعكس قيمة منطقية واحدة.

تستخدم and وor التقييم المختصر: فهما تتوقفان عن التقييم بمجرد أن تُعرَف النتيجة. فلا تستدعي False and slow_check() الدالة slow_check أبدًا.

تُرجع and وor أيضًا أحد معامليهما بدلًا من قيمة True أو False حرفية، مما يتيح لك كتابة القيم الافتراضية بإيجاز:

name = user_name or "anonymous"   # "" / 0 / None are falsy

2.3.4. العوامل على مستوى البتات

للعمل على العتاد -- حزم حقول السجلات، وإخفاء البتات، وتحليل ترويسات البروتوكولات -- ستلجأ إلى العوامل على مستوى البتات. وهي تعمل على التمثيل الثنائي لـ int:

  • & -- AND على مستوى البتات

  • | -- OR على مستوى البتات

  • ^ -- XOR على مستوى البتات

  • ~ -- NOT على مستوى البتات (المتمم الأحادي)

  • << -- الإزاحة إلى اليسار

  • >> -- الإزاحة إلى اليمين

تكون الصيغ الحرفية الست عشرية والثنائية مريحة عند قراءة هذه القيم وكتابتها:

>>> 0b1100 & 0b1010
8                              # 0b1000
>>> 0b1100 | 0b1010
14                             # 0b1110
>>> 0xFF ^ 0x0F
240                            # 0xF0
>>> 1 << 8
256
>>> (0xABCD >> 8) & 0xFF
171                            # extract the high byte

توجد صيغ مُعزَّزة لكلٍّ منها: |= و&= و^= و<<= و>>=.

ملاحظة

تعمل and / or على القيم المنطقية (أو على الصحة المنطقية)؛ بينما تعمل & / | على البتات. لا تخلط بينها. يُقيَّم 0b1100 and 0b1010 إلى 0b1010 لأن كلا المعاملين صادق -- وهذا ليس عادةً ما تريده عند التعامل مع البتات.

2.3.5. دوال الأعداد المدمجة المفيدة

تغطي حفنة من الدوال المدمجة العمليات العددية الشائعة التي لا توفرها العوامل وحدها:

  • round() -- أقرب عدد صحيح، أو أقرب ndigits من المنازل العشرية عند إعطاء وسيط ثانٍ. تُرجع int لـ round(x)، وfloat لـ round(x, n). تُقرَّب الحالات المتعادلة (0.5 و1.5 و...) إلى أقرب عدد زوجي، وليس دائمًا إلى الأعلى.

  • divmod() -- تُرجع (quotient, remainder) في استدعاء واحد. وهي مفيدة لتقسيم كمية واحدة إلى وحدات (الثواني إلى دقائق وثوانٍ، والبايتات إلى صفحات وإزاحات).

  • pow() -- مماثلة لـ ** في صيغة الوسيطين. أما صيغة الوسائط الثلاثة pow(base, exp, mod) فتحسب (base ** exp) % mod دون تكوين القيمة الوسيطة الضخمة أصلًا، وهي الطريقة العملية الوحيدة لإجراء الأُس النمطي للأسس الكبيرة.

>>> round(3.7)
4
>>> round(3.14159, 2)
3.14
>>> round(0.5)               # ties go to even, not always up
0
>>> round(1.5)
2

>>> divmod(125, 60)          # 125 seconds = 2 min, 5 sec
(2, 5)
>>> minutes, seconds = divmod(125, 60)

>>> pow(3, 4)                # same as 3 ** 4
81
>>> pow(3, 100, 7)           # (3 ** 100) mod 7, efficient
4

تتناول صفحة String methods and formatting تحويلات العدد الصحيح إلى سلسلة نصية بحسب الأساس (bin وoct وhex).

2.3.6. وحدة math

توجد الدوال الرياضية الشائعة في وحدة math. استوردها مرة واحدة واستدعِ دوالها عبر اسم منقَّط:

import math

print(math.sqrt(2))              # 1.4142135
print(math.sin(math.pi / 2))     # 1.0
print(math.floor(3.7))           # 3
print(math.log(100, 10))         # 2.0

تغطي وحدة math في MicroPython الدوال المعتادة (sqrt وexp وlog وsin وcos وtan وatan2 وfloor وceil وpi وe و...). للأعداد العشوائية، راجع وحدة random؛ ولتعديل بتات الفاصلة الثابتة، تكفي العوامل المذكورة أعلاه عادةً.

2.3.7. الأعداد المركبة

للعمل العددي الذي يحتاج إلى مكونات تخيلية، يوفّر Python نوع complex بصيغ حرفية تنتهي باللاحقة j (1 + 2j). وتعكس وحدة cmath وحدة math للمدخلات المركبة. وكلاهما موجود في معظم نسخ MicroPython لكنهما نادرًا ما يلزمان لعمل الكاميرا؛ ونذكرهما أساسًا حتى لا يكونا مفاجأة إذا نقلت كودًا يستخدمهما.