في هذا الدرس السابع من سلسلة بايثون بالمثال سنتعلم كيف نحسب متوسط الأرقام داخل List في بايثون بطريقة بسيطة ومناسبة للمبتدئين.
الفكرة الأساسية هي جمع القيم ثم قسمة المجموع على عدد العناصر. في بايثون نستطيع تنفيذ ذلك باستخدام sum() وlen()، وسنرى أيضًا كيف نتعامل مع القائمة الفارغة والأرقام المكتوبة كنصوص.
سنطبّق المثال على درجات وأرقام حقيقية، ثم نحول الحل إلى دالة قابلة لإعادة الاستخدام، مع توضيح طريقة جاهزة من مكتبة statistics.
وسنوضح أيضًا السبب وراء ظهور خطأ عند محاولة حساب متوسط قائمة فارغة، وكيف تتعامل مع القيم القادمة من المستخدم عندما تكون نصوصًا بدل أرقام، حتى يكون المثال قابلًا للاستخدام في برامج حقيقية صغيرة.
{getToc} $title={محتوى المقال}
{alertInfo} هذا الدرس يشرح المتوسط الحسابي، وليس مجرد مجموع العناصر. إذا أردت شرح الجمع نفسه فراجع بايثون بالمثال 4: حساب مجموع عناصر List في بايثون.
ما هو متوسط الأرقام في List؟
لنفترض أن لدينا القائمة التالية:
numbers = [10, 20, 30, 40, 50]
لحساب المتوسط الحسابي نجمع القيم أولًا، ثم نقسم الناتج على عددها. مجموع الأرقام السابقة هو 150، وعددها 5، لذلك المتوسط يساوي 30.
حساب متوسط List باستخدام sum و len
هذه هي الطريقة الأساسية التي سنستخدمها في هذا الدرس:
numbers = [10, 20, 30, 40, 50]
average = sum(numbers) / len(numbers)
print(average)
الناتج:
30.0
الدالة sum(numbers) ترجع مجموع القيم، بينما len(numbers) ترجع عدد العناصر. بعد ذلك تستخدم علامة القسمة / للحصول على المتوسط.
{alertSuccess}
القاعدة العملية للمبتدئ: average = sum(numbers) / len(numbers)، بشرط ألا تكون القائمة فارغة.
شرح العملية خطوة بخطوة
إذا كانت القائمة [10, 20, 30, 40, 50]، فإن بايثون تنفذ الفكرة على ثلاث مراحل بسيطة:
sum(numbers)تعطي150.len(numbers)تعطي5.- القسمة
150 / 5تعطي30.0.
لهذا السبب يجب ألا نخلط بين المجموع والمتوسط. المجموع هو الخطوة الأولى فقط، أما المتوسط فيحتاج أيضًا إلى معرفة عدد القيم ثم إجراء القسمة.
لماذا ظهر الناتج 30.0 بدل 30؟
في بايثون، عامل القسمة / يعيد نتيجة من نوع float في هذا المثال، لذلك يظهر 30.0. هذا طبيعي ولا يعني وجود خطأ في الحساب.
مثال عملي: حساب متوسط درجات طالب
grades = [80, 90, 75, 85]
average = sum(grades) / len(grades)
print("متوسط الدرجات:", average)
الناتج:
متوسط الدرجات: 82.5
حساب متوسط أرقام عشرية
تعمل الطريقة نفسها مع القيم العشرية، مثل الأسعار أو القياسات:
prices = [10.5, 12.75, 9.25]
average = sum(prices) / len(prices)
print(average)
الناتج هو 10.833333333333334 تقريبًا، ولهذا قد تحتاج إلى round() عند عرض النتيجة للمستخدم.
تقريب المتوسط باستخدام round
إذا كان المتوسط يحتوي على منازل عشرية كثيرة، يمكنك استخدام round() للتحكم في عدد المنازل المعروضة:
numbers = [10, 20, 25]
average = sum(numbers) / len(numbers)
print(round(average, 2))
الناتج:
18.33
ماذا يحدث إذا كانت القائمة فارغة؟
الدالة sum([]) تعيد 0، وlen([]) تعيد 0. المشكلة تحدث عندما نحاول قسمة صفر على صفر:
numbers = []
average = sum(numbers) / len(numbers)
سيظهر خطأ:
ZeroDivisionError: division by zero
الحل هو التأكد من وجود عناصر قبل تنفيذ القسمة:
numbers = []
if numbers:
average = sum(numbers) / len(numbers)
print(average)
else:
print("القائمة فارغة، لا يمكن حساب المتوسط")
{alertWarning} المشكلة ليست فيsum()مع القائمة الفارغة؛ المشكلة في القسمة علىlen(numbers)عندما تكون قيمتها صفرًا.
حساب المتوسط داخل دالة
إذا كنت ستكرر العملية أكثر من مرة، ضعها داخل دالة:
def calculate_average(numbers):
if not numbers:
return None
return sum(numbers) / len(numbers)
result = calculate_average([10, 20, 30])
print(result)
الناتج:
20.0
إذا أردت مراجعة فكرة إرجاع القيم من الدوال، اقرأ أساسيات بايثون 14: شرح return في Functions.
طريقة جاهزة باستخدام statistics.fmean
تحتوي مكتبة بايثون القياسية على دالة مخصصة لحساب المتوسط الحسابي اسمها fmean(). وهي مفيدة عندما تريد التعبير مباشرة عن أن العملية المطلوبة هي حساب المتوسط:
from statistics import fmean
numbers = [10, 20, 30, 40]
print(fmean(numbers))
الناتج:
25.0
للمبتدئ، تبقى طريقة sum()/len() ممتازة لأنها تشرح قانون المتوسط نفسه. أما fmean() فهي خيار جاهز عندما تعرف الفكرة وتريد دالة مخصصة للمهمة.
ماذا لو كانت الأرقام مكتوبة كنصوص؟
إذا كانت القائمة مثل ["10", "20", "30"] فهي تحتوي على نصوص، وليس أرقامًا. يجب تحويل القيم قبل الحساب:
values = ["10", "20", "30"]
numbers = [int(value) for value in values]
average = sum(numbers) / len(numbers)
print(average)
الناتج:
20.0
إذا أردت فهم الصيغة المختصرة المستخدمة في التحويل، راجع شرح List Comprehension في بايثون.
حساب المتوسط من إدخال المستخدم
يمكنك جعل المستخدم يكتب مجموعة أرقام مفصولة بمسافات، ثم تحويلها إلى أرقام وحساب المتوسط. نستخدم float() هنا حتى نقبل الأعداد الصحيحة والعشرية معًا:
text = input("أدخل الأرقام مفصولة بمسافات: ")
numbers = [float(value) for value in text.split()]
if numbers:
average = sum(numbers) / len(numbers)
print("المتوسط:", average)
else:
print("لم تدخل أرقامًا")
إذا كتب المستخدم قيمة لا يمكن تحويلها إلى رقم، مثل كلمة، فسيظهر ValueError. لذلك في البرامج الأكبر قد تحتاج إلى التحقق من الإدخال أو استخدام معالجة الأخطاء.
مقارنة سريعة بين الطرق
| الطريقة | متى تستخدمها؟ | ملاحظة |
|---|---|---|
sum(numbers) / len(numbers) |
للتعلم وللحساب المباشر | يجب فحص القائمة الفارغة |
calculate_average(numbers) |
عندما ستكرر الحساب | تسمح لك بتحديد سلوك القائمة الفارغة |
statistics.fmean(numbers) |
عندما تريد دالة جاهزة مخصصة للمتوسط | ترجع float وتحتاج إلى استيرادها |
جدول الدوال المستخدمة في المثال
| الدالة | وظيفتها هنا | مثال |
|---|---|---|
sum() |
جمع القيم الرقمية | sum(numbers) |
len() |
حساب عدد العناصر | len(numbers) |
round() |
تقريب الناتج عند العرض | round(average, 2) |
float() |
تحويل النص إلى رقم عشري | float("12.5") |
fmean() |
حساب المتوسط بدالة جاهزة | fmean(numbers) |
أخطاء شائعة عند حساب المتوسط
نسيان القسمة على عدد العناصر
إذا استخدمت sum(numbers) فقط فأنت تحسب المجموع، وليس المتوسط.
حساب المتوسط لقائمة فارغة
القسمة على len([]) تعني القسمة على صفر، ولذلك يجب فحص القائمة أولًا.
وجود نصوص بدل أرقام
القيم القادمة من input() أو بعض الملفات قد تكون نصوصًا. حوّلها إلى int أو float قبل الحساب.
أسئلة شائعة عن متوسط List في بايثون
كيف أحسب متوسط قائمة أرقام في بايثون؟
استخدم sum(numbers) / len(numbers) بعد التأكد من أن القائمة ليست فارغة.
ما الفرق بين المجموع والمتوسط؟
المجموع هو ناتج إضافة جميع القيم، أما المتوسط الحسابي فهو المجموع مقسومًا على عدد القيم. لذلك يبقى مقال جمع عناصر List مخصصًا لعملية الجمع، بينما يركز هذا الدرس على المتوسط.
هل توجد دالة mean جاهزة في بايثون؟
نعم. مكتبة statistics توفر mean() وfmean(). في هذا الدرس استخدمنا fmean() كخيار إضافي، بينما شرحنا sum()/len() لأنها توضح قانون المتوسط للمبتدئ.
لماذا تظهر ZeroDivisionError؟
لأن القائمة فارغة وlen(numbers) تساوي صفرًا، والقسمة على صفر غير مسموحة.
روابط مفيدة
- أساسيات بايثون 16: شرح Lists في بايثون للمبتدئين
- بايثون بالمثال 4: حساب مجموع عناصر List في بايثون
- شرح List Comprehension في بايثون
- محرر بايثون العرب لتجربة الأكواد أونلاين
- توثيق بايثون الرسمي لمكتبة statistics
- توثيق بايثون الرسمي للدالة sum
خلاصة بايثون بالمثال 7
تعلمنا في هذا الدرس حساب المتوسط الحسابي لقائمة أرقام باستخدام sum() وlen()، والتعامل مع القائمة الفارغة، وتقريب النتيجة، وتحويل القيم النصية، ووضع الحساب داخل دالة قابلة لإعادة الاستخدام.
{alertSuccess}
الخلاصة: اجمع القيم، اقسمها على عدد العناصر، وافحص القائمة قبل القسمة. وللحساب الجاهز يمكنك استخدام statistics.fmean().
تمرين بسيط
احسب متوسط القائمة التالية، ثم اطبع الناتج مقربًا إلى منزلتين عشريتين:
scores = [72, 85, 91, 68]
بعد أن تنتهي، انتقل إلى بايثون بالمثال 8: إيجاد أكبر وأصغر رقم في قائمة باستخدام بايثون.