أساسيات Python: المتغيرات، القوائم، القواميس، الشروط، الحلقات والدوال
Python لغة برمجة تُستخدم لأتمتة المهام، تحليل البيانات وتطوير التطبيقات. تعلّم أساسيات Python يعني فهم كيفية كتابة التعليمات والتحقق من نتائجها. في هذا الدرس، ستبدأ بقيم بسيطة لتتعلّم استخدام المتغيرات، تنظيم المعلومات والتحكم في تنفيذ البرنامج.
يمكنك تنزيل Notebook باسم BasesPython.ipynb مع دليل الاستخدام بصيغة ZIP أو كتابة الخلايا أثناء متابعة الدرس. فكّ ضغط الأرشيف داخل projet-ia؛ وإذا كنت قد بدأت العمل على Notebook بالاسم نفسه، فاحفظ نسخة منه قبل فكّ الضغط. القيم مأخوذة من Student Performance Factors ومكتوبة مباشرة داخل الخلايا، لذلك لا تحتاج إلى ملف Excel لإنجاز هذه التمارين.
المحتويات
أساسيات Python: المتغيرات والأنواع
المتغير اسم تربطه بقيمة. تعني التعليمة score_examen = 67 «اربط القيمة 67 بالاسم score_examen». تنفّذ العلامة = عملية الإسناد هذه، ولا تختبر تساوي قيمتين. يتيح لك الاسم الرجوع إلى القيمة لاحقًا دون إعادة كتابتها في كل عملية حسابية.
لكل قيمة نوع يحدّد العمليات التي يمكن تطبيقها عليها. فيما يلي أربعة أنواع شائعة توضّحها وثائق أنواع البيانات في Python.
| النوع | ما الذي يمثّله؟ | مثال من الدرس |
|---|---|---|
str (سلسلة نصية — string) | نص يُكتب بين علامتَي اقتباس في الكود | "Low"، مستوى مشاركة الوالدين |
int (عدد صحيح) | عدد صحيح دون جزء عشري | 67، أول قيمة في Exam_Score |
float (عدد بفاصلة عائمة) | عدد بفاصلة عائمة، يُكتب باستخدام النقطة للفصل العشري في Python | 67.0، ناتج تحويل الدرجة 67 |
bool (قيمة منطقية — Boolean) | قيمة منطقية: صحيح أو خطأ | True وFalse، وهما ناتجا المقارنات التي سندرسها لاحقًا |
# Define the values used in this example
score_examen = 67
presence = 84
implication_parentale = "Low"
# Convert the integer score to a floating-point number
score_decimal = float(score_examen)
# Display the values and their types
print(score_examen, type(score_examen).__name__)
print(score_decimal, type(score_decimal).__name__)
print(implication_parentale, type(implication_parentale).__name__)67 int
67.0 float
Low strالقيمتان 67 و84 عددان صحيحان. يحوّل الاستدعاء float(score_examen) الدرجة إلى عدد بفاصلة عائمة: تمثّل 67.0 الكمية نفسها بنوع مختلف. تُستخدم النقطة للفصل بين الجزء الصحيح والجزء العشري في كود Python. أما علامتا الاقتباس فتجعلان "Low" قيمة نصية.
تعرض الدالة print قيمة أسفل الخلية. وتعيد الدالة type نوع القيمة، بينما تتيح الخاصية .__name__ قراءة اسم ذلك النوع هنا. الدالتان print وtype مضمّنتان في Python، وتُستدعيان بوضع القيم بين الأقواس. توضّح وثائق الدوال المضمّنة وظيفة كل منهما.
اختر أسماء توضّح ما تمثّله القيم، مثل score_examen أو presence. الأسماء حساسة لحالة الأحرف، لذا فإن presence وPresence اسمان مختلفان. ولا يمكن أن يبدأ الاسم برقم. الأسلوب الشائع هو استخدام الأحرف الصغيرة والشرطة السفلية للفصل بين الكلمات، وفقًا لـPEP 8. إسناد قيمة جديدة إلى الاسم نفسه يجعله يشير إلى القيمة الجديدة، ولا يلزم التصريح بنوعه مسبقًا.
إجراء العمليات الحسابية على الأعداد
تستخدم Python الرمز + للجمع، - للطرح، * للضرب و/ للقسمة. تُنتج القسمة باستخدام / قيمة من نوع float، حتى عندما تكون النتيجة الرياضية عددًا صحيحًا.
# Divide the score by 10
print("Score divided by 10:", score_examen / 10)
# Use floor division
print("Floor division result:", score_examen // 10)
# Calculate the remainder
print("Remainder:", score_examen % 10)
# Square the score
print("Score squared:", score_examen ** 2)Score divided by 10: 6.7
Floor division result: 6
Remainder: 7
Score squared: 4489تعطي 67 / 10 النتيجة 6.7. ويعطي الرمزان // و%، على الترتيب، خارج القسمة المقرّب إلى الأسفل وباقي القسمة: في مثال الأعداد الصحيحة الموجبة هذا، يتكوّن 67 من ست عشرات وباقٍ يساوي سبعة. يُستخدم الرمز ** لرفع عدد إلى قوة؛ ومربّع 67 يساوي 4489.
يعرض شرح العمليات العددية في دليل Python هذه القواعد. يبدأ التعليق بالرمز #، فتتجاهل Python ما يليه في السطر نفسه. يمكنك بذلك شرح العملية الحسابية دون إضافة نص إلى المخرجات.
التعامل مع السلاسل النصية
السلسلة النصية قيمة من النوع str. لإنشائها في هذه الأمثلة، اكتب النص بين علامتَي اقتباس مفردتين أو مزدوجتين. الفئات الموجودة في البيانات، مثل Low، قيم نصية حتى عندما تصف خاصية من خصائص أحد الصفوف. لذلك لا تُعامل السلسلة النصية كعدد يمكن حساب متوسطه مباشرة.
# Convert the text to lowercase
print("Lowercase:", implication_parentale.lower())
# Count the characters in the text
print("Number of characters:", len(implication_parentale))
# Convert the score to a string
score_texte = str(score_examen)
print("Converted score:", score_texte, type(score_texte).__name__)
# Join the label and the converted score
print("Score: " + score_texte)Lowercase: low
Number of characters: 3
Converted score: 67 str
Score: 67تعيد len طول السلسلة النصية، ويشمل هذا العدد الأحرف، الأرقام، المسافات وعلامات الترقيم. وتعيد lower() سلسلة جديدة بعد تحويل الأحرف الكبيرة إلى أحرف صغيرة في اللغات التي تميّز بين الحالتين. وهي دالة مرتبطة بكائن (method)؛ تستدعيها على السلسلة النصية باستخدام النقطة. السلاسل النصية غير قابلة للتعديل، لذا لا يغيّر هذا الاستدعاء السلسلة الأصلية، بل يعيد سلسلة جديدة.
عند استخدام + بين سلسلتين نصيتين، ينفّذ الدمج النصي، أي يجمعهما في سلسلة واحدة. تحوّل str(score_examen) الدرجة إلى نص لإدراجها في هذا التعبير. وفي الاتجاه المقابل، تستطيع int وfloat تحويل نص عددي مناسب إلى عدد، لكن نصًا مثل Low لا يمكن تحويله إلى عدد صحيح. تشرح وثائق عمليات السلاسل النصية هذه السلوكيات.
عرض النتائج باستخدام f-string
f-string سلسلة نصية يسبقها الحرف f. تُقيَّم التعبيرات داخل الأقواس المعقوفة وتُدرج نتائجها في النص. بهذه الطريقة، لا تحتاج إلى جمع أجزاء متعددة باستخدام + أو تحويل كل عدد إلى نص بصورة صريحة.
# Insert the values into a formatted string
print(f"First student: score {score_examen}, attendance {presence} %.")
# Display the result with one decimal place
print(f"Score divided by 10: {score_examen / 10:.1f}")First student: score 67, attendance 84 %.
Score divided by 10: 6.7في التعبير {score_examen / 10:.1f}، تبدأ النقطتان مواصفة التنسيق: تعرض .1f منزلة عشرية واحدة. والنتيجة الحسابية هنا هي 6.7. أما الرمز % الذي يلي {presence} في الرسالة الأولى فهو مجرد نص يوضّح وحدة القيمة 84، ولا ينفّذ أي تحويل. التنسيق لا يغيّر القيم المحفوظة في المتغيرات. يشرح دليل السلاسل النصية المنسّقة هذه الصياغة.
القوائم: حفظ عدة قيم بترتيب محدّد
القائمة (list) نوع من أنواع البيانات يجمع عناصر بترتيب محدّد. تُكتب القائمة بين قوسين مربّعين، وتفصل الفواصل بين عناصرها. للعمل على عدة درجات، نستخدم أول خمس قيم من العمود Exam_Score: وهي 67، 61، 74، 71 و70. سنحافظ على هذا الترتيب في الأمثلة والتمرين الأخير.
# Create a list of scores
notes_examens = [67, 61, 74, 71, 70]
print("Scores:", notes_examens)
# Read the first item at index 0
print("First:", notes_examens[0])
# Read the last item using a negative index
print("Last:", notes_examens[-1])
# Select indexes 1 and 2; index 3 is excluded
print("Slice [1:3]:", notes_examens[1:3])
# Count the items in the list
print("Number of scores:", len(notes_examens))Scores: [67, 61, 74, 71, 70]
First: 67
Last: 70
Slice [1:3]: [61, 74]
Number of scores: 5![تحتوي القائمة notes_examens على 67، 61، 74، 71 و70، بفهارس من 0 إلى 4 ومن -5 إلى -1؛ ويحتوي المقطع notes_examens[1:3] على 61 و74.](https://mlwebapp.com/wp-content/uploads/2026/10/python-basics-list-indices-ar-2026-10-12.webp)
[1:3] العنصرين في الموضعين 1 و2، ولا يشمل الموضع 3.الفهرس (index) عدد صحيح نستخدمه للوصول إلى عنصر بحسب موضعه في القائمة. يبدأ العدّ من الصفر؛ لذلك تحمل العناصر الخمسة هنا الفهارس من 0 إلى 4. تشير notes_examens[-1] إلى العنصر الأخير، لأن الفهارس السالبة تُعدّ من نهاية القائمة. وتعطي len عدد العناصر، وهو 5. أما notes_examens[1:3] فتستخرج مقطعًا من القائمة (slice) في قائمة جديدة: يشمل المقطع الفهرس 1، ويتوقف قبل الفهرس 3، فتكون النتيجة [61, 74]. راجع شرح القوائم في دليل Python.
القائمة قابلة للتعديل. تُستدعى append على القائمة لإضافة عنصر إلى نهايتها. وللحفاظ على الدرجات الخمس المستخدمة في الأمثلة التالية، نطبّقها على نسخة من القائمة. الدرجة 71 التي نضيفها أدناه مأخوذة من صف البيانات السادس في المصنف.
# Create an independent copy of the list
notes_etendues = notes_examens.copy()
sixieme_score = 71
# Append a score to the copy
notes_etendues.append(sixieme_score)
# Compare the copy with the original list
print("Six scores:", notes_etendues)
print("Original five scores:", notes_examens)
# Get a sorted list without changing the original
print("Sorted scores:", sorted(notes_examens))Six scores: [67, 61, 74, 71, 70, 71]
Original five scores: [67, 61, 74, 71, 70]
Sorted scores: [61, 67, 70, 71, 74]تنشئ copy() هنا قائمة جديدة من الأعداد. وتعيد sorted أيضًا قائمة جديدة مرتبة تصاعديًا دون تغيير notes_examens. لعكس الترتيب وجعله تنازليًا، مرّر الوسيط reverse=True إلى sorted، كما في print("Scores sorted in descending order:", sorted(notes_examens, reverse=True)).
إسناد بسيط مثل autre_liste = notes_examens يجعل الاسمين يشيران إلى القائمة نفسها، ولا ينشئ نسخة منها. لذلك، إذا أضفت عنصرًا باستخدام أحد الاسمين، فسيظهر عند الرجوع إلى القائمة بالاسم الآخر أيضًا. يصبح الفرق بين إنشاء نسخة وإنشاء مرجع إضافي إلى الكائن نفسه مهمًا عند تعديل البيانات. توضّح وثائق العمليات المتاحة على القوائم هذه الاستخدامات.
القواميس (dict): الوصول إلى القيم باستخدام المفاتيح
القاموس (dictionary)، ونوعه في Python هو dict، بنية بيانات تربط كل مفتاح (key) بـقيمة (value). تُكتب أزواج المفتاح والقيمة بين قوسين معقوفين، وتفصل النقطتان بين كل مفتاح وقيمته. بدلًا من طلب «العنصر في الموضع 0» كما نفعل مع القائمة، نطلب «القيمة المرتبطة بالمفتاح Attendance». يناسب هذا التنظيم تمثيل عدة معلومات من الصف الأول.
# Group the information in a dictionary
eleve = {
"Hours_Studied": 23,
"Attendance": presence,
"Exam_Score": score_examen,
}
print(eleve)
# Read the value associated with the Exam_Score key
print("Score:", eleve["Exam_Score"])
# Provide a fallback value for a missing key
print("Identifier:", eleve.get("Student_ID", "Not present in the file")){'Hours_Studied': 23, 'Attendance': 84, 'Exam_Score': 67}
Score: 67
Identifier: Not present in the fileيتيح المفتاح "Exam_Score" الوصول إلى القيمة 67. وتعيد get النص البديل الذي حدّدناه عندما لا تجد المفتاح "Student_ID" في القاموس. المفاتيح فريدة داخل القاموس؛ وإسناد قيمة إلى مفتاح موجود يستبدل قيمته السابقة. كما يحتفظ القاموس بترتيب إدخال المفاتيح. راجع شرح القواميس في دليل Python.
مقارنة القيم ودمج الاختبارات
تُنتج المقارنة قيمة منطقية: True إذا تحقق الاختبار، أو False إذا لم يتحقق. تختبر == التساوي، وتختبر != عدم التساوي. وتعني > و< أكبر من وأصغر من، بينما تشمل >= و<= حالة التساوي أيضًا. لا تخلط بين == وعلامة الإسناد =.
# Compare the score with the threshold of 70
atteint_seuil = score_examen >= 70
# Compare attendance with the threshold of 80
presence_elevee = presence >= 80
print("Score >= 70:", atteint_seuil)
print("Attendance >= 80:", presence_elevee)
# Check that both conditions are true
print("Both conditions:", atteint_seuil and presence_elevee)
# Check that at least one condition is true
print("At least one condition:", atteint_seuil or presence_elevee)
# Negate the score comparison
print("Score < 70:", not atteint_seuil)Score >= 70: False
Attendance >= 80: True
Both conditions: False
At least one condition: True
Score < 70: Trueالعدد 67 ليس أكبر من 70 أو مساويًا له، لذا يعطي الاختبار الأول False. أما 84 فهو أكبر من 80 أو مساوٍ له، فيعطي الاختبار الثاني True. تتيح العوامل المنطقية (logical operators) دمج نتائج هذه المقارنات: يتطلب and تحقق الشرطين، ويكفي مع or تحقق أحدهما على الأقل، بينما يعكس not القيمة المنطقية. تشرح وثائق العمليات المنطقية طريقة عملها. استخدم الأقواس عندما يصبح التعبير المركّب صعب القراءة.
اختيار التعليمات باستخدام if وelif وelse
يحدّد الشرط التعليمات التي ستُنفَّذ بناءً على نتيجة اختبار. تختبر if شرطًا أول، وتختبر elif شرطًا آخر إذا لم تتحقق الشروط السابقة، وتعالج else الحالات المتبقية. نوزّع الدرجات هنا على ثلاثة نطاقات باستخدام الحدّين 70 و60 المختارين لهذا التمرين.
# Choose the score range with if, elif and else
if score_examen >= 70:
tranche_score = "70 or higher"
elif score_examen >= 60:
tranche_score = "Between 60 and 69"
else:
tranche_score = "Below 60"
# Display the selected range
print(tranche_score)Between 60 and 69
score_examen = 67، لا يتحقق الاختبار الأول ويتحقق الثاني. لذلك لا يُنفَّذ فرع else.تفحص Python الاختبارات بالترتيب، وتنفّذ أول كتلة يتحقق شرطها. لو بدأنا بالشرط score_examen >= 60، لدخلت الدرجات التي تساوي 70 أو تزيد عليها في هذا الفرع الأول أيضًا. لذلك يُعدّ ترتيب الشروط جزءًا من القاعدة. يشرح دليل Python الخاص بتعليمات if هذا السلوك.
تأتي النقطتان (:) في نهاية سطر الشرط، وتليهما كتلة تعليمات (code block). تحدّد المسافة البادئة (indentation)، أي المسافات في بداية السطر، التعليمات التابعة للكتلة. استخدم أربع مسافات وفقًا لـPEP 8، وحافظ على المسافة البادئة نفسها داخل الكتلة. يعود سطر print الأخير إلى مستوى الشرط نفسه في الشيفرة، فيُنفَّذ بعد الانتهاء من اختيار النطاق.
تكرار التعليمات باستخدام الحلقات
المرور على القيم باستخدام for
تكرّر الحلقة التكرارية (loop) مجموعة من التعليمات. تمرّ for هنا على عناصر القائمة، وفي كل تكرار يأخذ المتغير score القيمة التالية حتى الوصول إلى آخر عنصر. يوضّح المثال كيفية جمع الدرجات الخمس دون كتابة خمس تعليمات منفصلة.
# Initialize the total before the loop
total = 0
# Loop over the scores and add them to the total
for score in notes_examens:
total += score
print("Score:", score)
print("Total:", total)
# Divide the total by the number of scores to calculate the mean
print("Mean:", total / len(notes_examens))Score: 67
Score: 61
Score: 74
Score: 71
Score: 70
Total: 343
Mean: 68.6تبدأ قيمة total من 0. وتضيف total += score الدرجة الحالية إلى المجموع المتراكم، وهي تعادل هنا total = total + score. بعد خمس دورات يصبح المجموع 343. تقسم العملية total / len(notes_examens) هذا المجموع على عدد الدرجات، فتعطي متوسطها: 68.6. توفّر Python أيضًا الدالة sum لجمع قيم القائمة مباشرة، كما سنفعل في الدالة التالية.
الحصول على الفهرس والقيمة معًا
عندما تحتاج إلى الفهرس والقيمة معًا، تعيد enumerate زوجًا منهما في كل تكرار على هيئة tuple. والـtuple تسلسل مرتب لا يسمح باستبدال عناصره بعد إنشائه. في for indice, score in enumerate(notes_examens):، يُسند الفهرس إلى indice وتُسند الدرجة إلى score. تُسمّى هذه العملية تفكيك عناصر التسلسل وإسنادها إلى متغيرات منفصلة (unpacking). يبدأ العدّ الذي تعيده enumerate من 0 افتراضيًا.
# Loop over each score and its index
for indice, score in enumerate(notes_examens):
print(f"Index {indice}: {score}")Index 0: 67
Index 1: 61
Index 2: 74
Index 3: 71
Index 4: 70تُنتج الحلقة خمسة أسطر تحمل الفهارس من 0 إلى 4. ولا تحتاج في هذه الحالة إلى تحديث عدّاد بنفسك. الدالة enumerate من الدوال المضمّنة في Python، مثل len وsum.
التكرار ما دام الشرط متحققًا
تكرّر while كتلة من التعليمات ما دام الشرط متحققًا. يمكننا أيضًا المرور على القيم الخمس باستخدام فهرس نزيد قيمته بأنفسنا.
# Start at the first index in the list
indice = 0
# Continue while the index is within the list
while indice < len(notes_examens):
print(f"Index {indice}: {notes_examens[indice]}")
# Move to the next index so the loop can finish
indice += 1Index 0: 67
Index 1: 61
Index 2: 74
Index 3: 71
Index 4: 70تزيد indice += 1 قيمة الفهرس حتى تصل إلى 5. عندها لا يعود الشرط indice < len(notes_examens) متحققًا، فتتوقف الحلقة. نسيان هذه الزيادة يؤدي هنا إلى حلقة لا نهائية (infinite loop). إذا حدث ذلك، أوقف تنفيذ الخلية باستخدام زر الإيقاف في الـNotebook. للمرور على قائمة، تكون for أكثر مباشرة، بينما تفيد while عندما يعتمد التوقف على شرط يتغيّر أثناء التنفيذ. يشرح دليل التحكم في التنفيذ الصيغتين.
الدوال: تسمية عملية حسابية قابلة لإعادة الاستخدام
الدالة (function) مجموعة تعليمات تحمل اسمًا، ويمكن استدعاؤها لإجراء مهمة محدّدة. تستقبل دالتنا قائمة عبر المعامل (parameter) المسمّى scores، وتعيد النتيجة إلى موضع الاستدعاء باستخدام return. تُستخدم def لتعريف الدالة، ولا تُنفَّذ تعليمات جسمها إلا عند استدعائها.
# Define a function that calculates the mean of a non-empty list
def calculer_moyenne(scores):
"""Return the mean of a non-empty list."""
return sum(scores) / len(scores)
# Call the function with the list of scores
moyenne = calculer_moyenne(notes_examens)
print("Mean:", moyenne)
# Check the type of the result
print("Type:", type(moyenne).__name__)Mean: 68.6
Type: float
calculer_moyenne(notes_examens) القائمة إلى المعامل scores، ثم تعيد return القيمة 68.6.المعامل (parameter) هو الاسم الذي نكتبه في تعريف الدالة لاستقبال قيمة، مثل scores. أما الوسيط (argument) فهو القيمة التي نمرّرها عند الاستدعاء، وهي هنا القائمة notes_examens. السلسلة النصية المكتوبة في أول جسم الدالة هي سلسلة التوثيق (docstring)؛ تصف وظيفة الدالة، وقد كتبناها بين علامات اقتباس ثلاثية. الاسم scores محلي داخل الدالة، فلا يستبدل الاسم notes_examens خارجها. لمزيد من التفاصيل، راجع وثائق الدوال.
تفترض الدالة أن قائمة الأعداد غير فارغة؛ فإذا كانت فارغة أصبحت len(scores) مساوية للصفر وفشلت القسمة. يجب توضيح هذا الشرط عند استخدام الدالة. تعيد return قيمة يمكن إعادة استخدامها، بينما تعرض print رسالة. هنا نحفظ النتيجة في moyenne قبل عرضها.
فهم الأعداد ذات الفاصلة العائمة والتقريب
تستخدم الأعداد ذات الفاصلة العائمة (floating-point numbers) من النوع float تمثيلًا ثنائيًا. بعض القيم العشرية لا يمكن تمثيلها بهذه الصيغة بدقة تامة، فتُخزَّن أقرب قيمة قابلة للتمثيل. لملاحظة أثر ذلك في المتوسط الذي حسبناه، نطلب عرض منازل عشرية أكثر من المعتاد.
# Display the mean with 17 decimal places
print(f"Mean to 17 decimal places: {moyenne:.17f}")
# Format the display to two decimal places
print(f"Mean to 2 decimal places: {moyenne:.2f}")
# Round the value to one decimal place
print("Rounded to one decimal place:", round(moyenne, 1))Mean to 17 decimal places: 68.59999999999999432
Mean to 2 decimal places: 68.60
Rounded to one decimal place: 68.6النتيجة الرياضية هي 68.6، لكن التمثيل الداخلي التقريبي يظهر عند عرض عدد كبير من المنازل العشرية. تمنح .2f عرضًا واضحًا هو 68.60، لكنها لا تجعل التمثيل الداخلي دقيقًا تمامًا. تشرح وثائق الأعداد ذات الفاصلة العائمة سبب هذا السلوك الطبيعي.
تعيد round قيمة مقرّبة. عندما يقع العدد تمامًا في منتصف المسافة بين نتيجتين ممكنتين، تختار Python النتيجة التي يكون آخر رقم مُحتفَظ به فيها زوجيًا. يجب التمييز بين هذه القاعدة وبين تقريب العدد الأصلي عند تخزينه. في بقية المسار، تذكّر أن تقريب العرض يساعد على القراءة، وأن الدقة المطلوبة تعتمد على العملية الحسابية؛ فلن نقرّب نتيجة كل خطوة وسيطة. راجع تعريف الدالة round.
تمرين مع الحل: تلخيص خمس درجات باستخدام Python
في خلية جديدة من BasesPython.ipynb، استخدم notes_examens وcalculer_moyenne من أجل:
- عرض عدد الدرجات، متوسطها بمنزلة عشرية واحدة وأكبر قيمة فيها؛
- إنشاء قائمة بالدرجات التي تساوي 70 أو تزيد عليها باستخدام
forوif؛ - عرض هذه القائمة وعدد القيم التي تحتوي عليها.
تعيد max أكبر قيمة في هذه القائمة غير الفارغة. اعمل على القيم الخمس الموجودة في notes_examens دون إضافة القيمة السادسة المستخدمة لشرح append. حاول إيجاد الحل بنفسك أولًا. يتوفّر الحل أيضًا في الخلية الأخيرة من الـNotebook القابل للتنزيل.
عرض الحل ونتيجته
# Prepare a list for the selected scores
scores_retenus = []
# Keep only scores greater than or equal to 70
for score in notes_examens:
if score >= 70:
scores_retenus.append(score)
# Display the statistics and selected scores
print("Number of scores:", len(notes_examens))
print(f"Mean: {calculer_moyenne(notes_examens):.1f}")
print("Maximum:", max(notes_examens))
print("Scores >= 70:", scores_retenus)
print("Number of scores >= 70:", len(scores_retenus))Number of scores: 5
Mean: 68.6
Maximum: 74
Scores >= 70: [74, 71, 70]
Number of scores >= 70: 3تفحص الحلقة كل درجة وتحتفظ بالدرجات التي تحقق الحدّ المطلوب. مجموع القيم الخمس هو 343، وتعطي 343 / 5 النتيجة 68.6. أكبر درجة هي 74، وتوجد ثلاث درجات تساوي 70 أو تزيد عليها. تصف هذه النتائج القيم الخمس في القائمة فقط؛ وليست إحصاءات لمجموعة البيانات كاملة أو تقييمًا لنموذج.
التعرّف على الأخطاء الشائعة وتصحيحها
يظهر الخطأ أسفل الخلية التي تسببت فيه. اقرأ سطره الأخير أولًا، فهو يحدّد نوع الخطأ ويعرض رسالة توضيحية. ثم ارجع إلى سطر الكود المشار إليه. صحّح السبب وأعد تشغيل الخلية قبل المتابعة باستخدام متغيرات قد لا تكون قد أُنشئت أصلًا.
NameError: متغير غير معرّف في النواة
إذا لم يكن notes_examens أو calculer_moyenne معرّفًا، فتحقق من كتابة الاسم وشغّل أولًا الخلية التي تنشئه. بعد إعادة تشغيل النواة، قد تبقى المخرجات القديمة ظاهرة رغم أن المتغيرات لم تعد موجودة في الذاكرة. أعد تشغيل الخلايا من الأعلى إلى الأسفل.
TypeError: خلط النصوص بالأعداد
يحاول التعبير "Mean: " + moyenne دمج سلسلة نصية وعدد دون تحويل. استخدم f-string مثل print(f"Mean: {moyenne:.1f}")، أو حوّل العدد باستخدام str. لا يصبح النص عددًا لمجرد أن شكله يشبه الأعداد؛ تحقّق من نوعه ومحتواه قبل إجراء الحساب.
IndexError وKeyError: فهرس خارج النطاق أو مفتاح غير موجود
في قائمة من خمسة عناصر، تمتد الفهارس التي تبدأ من الصفر من 0 إلى 4، لذلك تسبّب notes_examens[5] خطأ IndexError. تتيح الفهارس السالبة العدّ من النهاية؛ استخدم notes_examens[-1] للوصول إلى العنصر الأخير. وفي القاموس، تُنتج eleve["attendance"] خطأ KeyError إذا كان المفتاح هو "Attendance"، لأن حالة الأحرف مهمّة. عندما يُحتمل غياب مفتاح، تتيح get تحديد قيمة بديلة.
IndentationError: مسافة بادئة غير صحيحة في الكتلة
بعد if، for، while أو def، أزح تعليمات الكتلة أربع مسافات إلى اليمين. تحقّق من النقطتين وتجنّب خلط المسافات بعلامات الجدولة. التعليمة التي تعود إلى الحافة اليسرى للكود لا تبقى ضمن تلك الكتلة.
ما ينبغي تذكّره والخطوة التالية في المشروع
بدأت بتسمية قيمة وفهم نوعها، ثم تعلّمت إجراء العمليات الحسابية وعرض نتائجها. تحفظ القوائم ترتيب العناصر، وتربط القواميس المفاتيح بالمعلومات. تُنتج المقارنات قيمًا منطقية، وتختار الشروط التعليمات، وتكرّرها الحلقات، وتجمع الدوال عملية حسابية قابلة لإعادة الاستخدام. يجمع التمرين الأخير هذه المفاهيم لتلخيص قائمة من الدرجات وتصفيتها.
احفظ BasesPython.ipynb بعد إعادة تشغيل النواة وتنفيذ جميع الخلايا. ينبغي أن تحصل مجددًا على الدرجات الخمس والمتوسط 68.6. حُسبت المخرجات المعروضة في نواة جديدة باستخدام Python 3.14.8. يعتمد هذا الدرس على الدوال والأنواع المضمّنة في Python فقط، ولا يحتاج إلى مكتبة إضافية أو قراءة ملف.
مصادر لمواصلة التعلّم
- لمراجعة تعليمة، راجع دليل Python الرسمي، ولا سيما أقسام الأعداد، هياكل البيانات والدوال.
- لمعرفة مصدر القيم المستخدمة في الأمثلة: Student Performance Factors — Lai Ng. على Kaggle.