x = 5
y = 10
print(x + y) # الجمع
print(x - y) # الطرح
print(x * y) # الضرب
print(x / y) # القسمة
print(x % y) # باقي القسمة
print(x ** y) # الأس
15
-5
50
0.5
5
9765625
x = 5
y = 10
print(x + y) # الجمع
print(x - y) # الطرح
print(x * y) # الضرب
print(x / y) # القسمة
print(x % y) # باقي القسمة
print(x ** y) # الأس
15
-5
50
0.5
5
9765625
المقارنة بين الأعداد:
ترتيب العمليات هو نفسه كما في الرياضيات:
()
**
*
و /
+
و -
للتفصيل الشامل انظر: ترتيب التقييم
إليك ثلاثة أمثلة لترى أثر وضع الأقواس من عدمه. ولاحظ أننا نستعمل جملة التوكيد (assert
) التي تسكُت إن كان الشيء الذي أمامها جملة منطقية صحيحة؛ وإلا فهي تظهر رسالة خطأ. وسترى أننا نستعملها بكثرة لتقرير لوازم ما نبينه في الدرس:
يراجع: التعيين النسبي.
لأن التعيين النسبي يستعمل بكثرة، فوجب علينا التعرف عليه، وأحيانًا نحتاج لاستعماله. فجمل التعيين التالية متكافئة:
i = i + 1
تعادل i += 1
i = i - 1
تعادل i -= 1
i = i * 2
تعادل i *= 2
i = i / 2
تعادل i /= 2
جرب الكود أدناه لترى النتيجة:
وإن أتيت من لغات أخرى مثل سي أو جافا فإنك تعلم أن تعبير i++
يعني زيادة المتغير i
بواحد. لكن في بايثون لا يوجد هذا التعبير. فالكود التالي سيؤدي إلى خطأ:
كل هذه الطرق الثلاث يتم فيها حساب الأس:
pow
فعل مبنيmath.pow
فعل من وحدة الرياضياتx ** 2
عن طريق المعامل **
\[ x^2 = x \times x \]
وكذلك الجذر التربيعي:
\[ \sqrt{x} = x^{1/2} \]
math.sqrt
فعل من وحدة الرياضياتx ** 0.5
عن طريق المعامل **
تقريب لأقرب عدد صحيح أصغر:
\[ \text{floor}(x) = \lfloor x \rfloor \]
تقريب لأقرب عدد صحيح أكبر:
\[ \text{ceil}(x) = \lceil x \rceil \]
حذف ما بعد الفاصلة:
تقريب إلى رقمين بعد الفاصلة:
ملاحظة: الفعل الأخير round
ليس مستوردًا من math
وإنما هو مُضمَّن في النطاق العام؛ لذا لا تحتاج لاستيراد شيء. قد تتساءل عن وجود سبب منطقي. لكنني أقول لك: هو سبب واقعي بسبب ظروف تطوير اللغة؛ لا أكثر ولا أقل.
أما التعامل مع المجموعات (كمجموعة الأعداد) فسيأتي في باب المجموعات المرتبة. لكننا نعرض لمثال بسيط للتعامل مع المجموعات العددية:
توفر بايثون الدوال التالية للمجموعة العددية:
len
(من كلمة length)sum
max
min
print('length:', len(xs))
print('total:', sum(xs))
print('average:', sum(xs) / len(xs))
print('maximum:', max(xs))
print('minimum:', min(xs))
length: 5
total: 150
average: 30.0
maximum: 50
minimum: 10
ونستعرض مجموعة من الدوال في مكتبة الإحصاء الأساسية في بايثون، منها:
statistics.mean
statistics.median
statistics.mode
statistics.stdev
import statistics
xs = [
20, 21, 22, 23, 20, 22, 20,
18, 24, 18, 21, 23, 19, 20,
20, 21, 22, 23, 20, 22, 20,
18, 24, 18, 21, 23, 19, 20
]
print('mean:', statistics.mean(xs))
print('median:', statistics.median(xs))
print('mode:', statistics.mode(xs))
print('standard deviation:', statistics.stdev(xs))
mean: 20.785714285714285
median: 20.5
mode: 20
standard deviation: 1.8126539343499315
صفة العددية تجوِّز العمليات بينها من جمع وطرح وقسمة ومقارنة. فالفعل فيه تفصيل تتكفل به بايثون عنك إذْ تمثيلها الداخلي في الحقيقة مختلف.
فالتمثيل الداخلي للأعداد له أثر:
لكننا في هذه المرحلة لن نخوض في هذه التفاصيل. وإنما أردنا بيان وجه الاختلاف بينها وسبب تعدد أنواع العدد في بايثون ولغات البرمجة عمومًا.
الوظيفة: الفهرسة والعد والترتيب والزيادة والنقصان والفرق ونحو ذلك
يؤتى بالفعل type
لمعرفة نوع المتغير:
المجال: يختلف مجال العدد الصحيح باختلاف البتات التي يتم استعمالها في تمثيله؛ لكن بايثون تستعمل العدد المناسب للبتات من غير علم المستخدم بذلك؛ لكن سنسردها هنا للعلم:
لاحظ أن سبب محدودية ذاكرة الأجهزة القديمة لـ4GB بايت يعود لكون معمارية الجهاز محددة بـ32-بت. ثم لما طورت المعمارية إلى 64-بت أصح حد الذاكرة: 17,179,869,184 GB (16 exabytes)
وهي كناية عن مجموعة مشتملة هي العددان: \(\{0, 1\}\) الذيان يمثل لهما بالكلمتين: True
و False
وذلك لتبيين وظيفتهما المنطقية.
الوظيفة: تستعمل في الجمل الشرطية وحلقات التكرار، والمقارنة بين الأشياء.
نلجئ الكلام عنها إلى باب الشرط والتكرار.
الوظيفة: تمثيل الكميات مثل المال، المسافة، والوقت
نفحص أنواعها:
المجال: يختلف مجال العدد العشري باختلاف البتات التي يتم استعمالها في تمثيله؛ لكن بايثون تستعمل العدد المناسب للبتات من غير علم المستخدم بذلك؛ لكن سنسردها هنا للعلم:
إذا اختلف النوع تُقدَّرُ الترقيةُ للأشمل، وذلك بحسب ناتج العملية:
int + float = float
int / int = float
int // int = int
المثال الأول: جمع عدد صحيح وعدد عشري:
المثال الثاني: قسمة عدد صحيح على عدد عشري:
المثال الثالث: استعمال القسمة الصحيحة //
:
س: لماذا النتيجة 4
؟
ج: لأن قسمة 9
على 2
تُنتِج 4.5
ولكن بايثون تقربها لأقرب عدد صحيح أصغر وهو 4
؛ وذلك لأننا اخترنا القسمة الصحيحة بالعلامة //
وليس القسمة العشرية بالعلامة /
.
تأمل المتغيرين
int
)str
)نستعمل جمل التوكيد لبيان ذلك:
ومقتضى ذلك: امتناع عملية الجمع: a + b
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[62], line 1 ----> 1 '5' + 5 TypeError: can only concatenate str (not "int") to str
بل يجب التحويل أولاً باستعمال الفعل int
الذي يفسر الأحرف كعدد صحيح:
الحروفيَّة هي رموز للقيم لبعض الأنواع المدمجة. مثال: 42
هو حرفيُّ عدد صحيح و 3.14
هو حرفيُّ عدد عشري.
وتخصيص الحرفيّ True
للعدد 1
و False
للعدد 0
ليس من قبيل الضرورة في اللغة وإنما من قبيل التسهيل (وفوق ذلك فإن بايثون تجعل له نوعًا خاصًّا وعمليات مصاحبة).
كذلك خصصت بايثون e
أو E
للترميز العلمي (وجاء الحرف e
من كلمة: Exponent) المخصص للأعداد العشرية الكبيرة والصغيرة.
ويجوز استعمال الشرطة السفلية _
لفاصلة الألوف:
وأما إن كنت تهتم بالتمثيل الثنائي أو الثماني أو الست عشري فذلك أيضًا له تعبيرات مخصصة:
0b
أو 0B
للأرقام الثنائية0o
أو 0O
للأرقام الثمانية0x
أو 0X
للأرقام الست عشريةوإليك تطبيق ذلك:
وأخيرًا يمكن استعمال j
أو J
للأعداد المركبة:
عرفنا الرقم والعمليات الممكنة عليه. لكننا سنتعرف على استعماله أكثر في الدروس القادمة، ويتعذر حصر جميع ما يستفاد منه فيه في درس واحد، لأنه من أكثر الأمور شيوعًا في البرمجة.
ننتقل الآن لباب الشرط والتكرار حيث الجمل الشرطية والتعيين المشروط.