Python: الرياضيات والإحصاء
الحساب العددي هو مهارة برمجة أساسية. توفر المكتبة القياسية لبايثون مجموعة كاملة من الأدوات — من دوال الرياضيات الأساسية إلى التحليل الإحصائي، من الحساب العشري الدقيق إلى عمليات الكسور. هذا الدرس يعلمك استخدام الوحدة المناسبة للسيناريو المناسب.
1. math — الدوال الرياضية
import math
# الثوابت الشائعة
print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
# التقريب
print(math.ceil(3.14)) # 4 (تقريب لأعلى)
print(math.floor(3.14)) # 3 (تقريب لأسفل)
# الأسس واللوغاريتمات
print(math.pow(2, 10)) # 1024.0 (2 أس 10)
print(math.sqrt(16)) # 4.0 (جذر تربيعي)
print(math.log(100, 10)) # 2.0 (لوغاريتم للأساس 10)
# علم المثلثات
print(math.sin(math.pi / 2)) # 1.0
print(math.cos(0)) # 1.0
print(math.radians(180)) # 3.14159... (درجات إلى راديان)
▶ مثال: حساب المسافة (الصعوبة ⭐)
import math
def distance(x1, y1, x2, y2):
"""احسب المسافة بين نقطتين"""
return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
def circle_area(radius):
"""احسب مساحة الدائرة"""
return math.pi * radius ** 2
print(f"Distance: {distance(0, 0, 3, 4):.2f}") # 5.00
print(f"Circle area: {circle_area(5):.2f}") # 78.54
الناتج:
# Function defined successfully
2. statistics — التحليل الإحصائي
import statistics
data = [12, 15, 18, 20, 22, 25, 30, 35, 40]
# النزعة المركزية
print(statistics.mean(data)) # 24.11 (المتوسط)
print(statistics.median(data)) # 22 (الوسيط)
# print(statistics.mode(data)) # المنوال (يُخطئ إذا لم يكن فريداً)
# التشتت
print(statistics.stdev(data)) # 9.32 (الانحراف المعياري للعينة)
print(statistics.variance(data)) # 86.86 (تباين العينة)
▶ مثال: تحليل الدرجات (الصعوبة ⭐⭐)
import statistics
scores = [85, 92, 78, 90, 88, 76, 95, 82, 89, 73]
print("=== Score Analysis ===")
print(f"Mean: {statistics.mean(scores):.1f}")
print(f"Median: {statistics.median(scores)}")
print(f"Max: {max(scores)}")
print(f"Min: {min(scores)}")
print(f"Std Dev: {statistics.stdev(scores):.2f}")
mean = statistics.mean(scores)
std = statistics.stdev(scores)
print("\n=== Grade Distribution ===")
for score in sorted(scores, reverse=True):
if score > mean + std:
level = "Excellent ⭐"
elif score > mean:
level = "Good 👍"
elif score > mean - std:
level = "Average"
else:
level = "Needs Work 💪"
print(f" {score:3d} — {level}")
الناتج:
=== Score Analysis ===
\n=== Grade Distribution ===
▶ مثال: إحصائيات حرارة المدن (الصعوبة ⭐⭐)
import statistics
temps_beijing = [2, 5, 12, 20, 26, 31, 32, 30, 25, 16, 8, 3]
temps_shanghai = [5, 6, 10, 16, 22, 26, 30, 30, 26, 20, 13, 7]
print("=== City Temperature Statistics ===")
for city, temps in [("Beijing", temps_beijing), ("Shanghai", temps_shanghai)]:
mean_val = statistics.mean(temps)
median_val = statistics.median(temps)
stdev_val = statistics.stdev(temps)
print(f"\n{city}:")
print(f" Annual mean: {mean_val:.1f}C")
print(f" Median: {median_val:.1f}C")
print(f" Std deviation: {stdev_val:.1f}C")
print(f" Range: {mean_val - stdev_val:.1f}C ~ {mean_val + stdev_val:.1f}C")
المخرجات:
=== City Temperature Statistics ===
Beijing:
Annual mean: 17.5C
Median: 18.0C
Std deviation: 11.3C
Range: 6.2C ~ 28.8C
Shanghai:
Annual mean: 17.6C
Median: 18.0C
Std deviation: 9.3C
Range: 8.2C ~ 26.9C
3. decimal — الحساب العشري الدقيق
from decimal import Decimal, getcontext
# مشكلة دقة float
print(0.1 + 0.2) # 0.30000000000000004 ❌
# حساب عشري دقيق باستخدام Decimal
print(Decimal("0.1") + Decimal("0.2")) # 0.3 ✅
# ضبط الدقة
getcontext().prec = 4 # دقة عالمية 4 أرقام
print(Decimal(1) / Decimal(3)) # 0.3333 (4 أرقام)
# الحسابات المالية يجب أن تستخدم Decimal
price = Decimal("19.99")
quantity = Decimal("3")
tax_rate = Decimal("0.08")
total = price * quantity
tax = total * tax_rate
print(f"Total: {total:.2f}") # 59.97
print(f"Tax: {tax:.2f}") # 4.80
print(f"Payable: {total + tax:.2f}") # 64.77
Decimal للحسابات المالية، ولا تستخدم float أبداً. مشكلة دقة 0.1 + 0.2 قاتلة في المالية. Decimal يضحي ببعض الأداء للحصول على حساب عشري دقيق.
4. fractions — حساب الكسور
from fractions import Fraction
# إنشاء كسور
f1 = Fraction(1, 3) # 1/3
f2 = Fraction(2, 6) # يُختزل تلقائياً إلى 1/3
print(f1) # 1/3
print(f2) # 1/3
print(f1 == f2) # True
# عمليات الكسور
a = Fraction(1, 2)
b = Fraction(1, 3)
print(a + b) # 5/6
print(a * b) # 1/6
print(a / b) # 3/2
# التحويل بين الكسور والأعداد العشرية
print(float(Fraction(1, 3))) # 0.3333333333
print(Fraction(0.25).limit_denominator()) # 1/4
5. حالات الاستخدام الشائعة
- math: الهندسة (مساحة/حجم)، علم المثلثات، العمليات اللوغاريتمية.
- statistics: تحليل درجات الامتحان، تقارير البيانات، بيانات التجارب العلمية.
- decimal: حساب أسعار التجارة الإلكترونية، البيانات المالية، حساب الضرائب.
- fractions: نسب الوصفات، النسب الهندسية، التطبيقات التعليمية.
❓ أسئلة شائعة
math والدوال المدمجة abs() و round() و sum()؟math يوفر دوالاً أكثر تخصصاً (علم المثلثات، اللوغاريتمات، المضروب). استخدم الدوال المدمجة عندما تكون كافية.statistics.mean() أفضل من حساب المتوسط يدوياً؟mean() محسّن داخلياً (تمريرة واحدة لكل من المجموع والعدد)، أداء أفضل لمجموعات البيانات الكبيرة، ويتعامل مع الحالات الحدودية مثل القوائم الفارغة.Fraction مقابل Decimal؟Fraction عندما تحتاج حساباً نسبياً دقيقاً (مثل تمارين الكسور في البرامج التعليمية). استخدم Decimal للحسابات العشرية بدقة مضبوطة (مثل المالية). للحالات البسيطة، float جيد — 99% من البرمجة اليومية لن تحتاج أياً منهما.📖 ملخص
math:ceil()/floor()تقريب،sqrt()جذر تربيعي،pi/eثوابت، دوال مثلثيةstatistics:mean()متوسط،median()وسيط،stdev()انحراف معياريDecimal: حساب عشري دقيق، مناسب للمالية؛ أنشئ من سلاسل نصية (Decimal("0.1"))Fraction: حساب كسور دقيق، اختزال تلقائي
📝 تمارين
-
أساسي (الصعوبة ⭐): استخدم وحدة
mathلحساب مساحة ومحيط دائرة نصف قطرها 7. -
متوسط (الصعوبة ⭐⭐): بالنظر إلى
data = [23, 45, 67, 12, 34, 56, 78, 90, 11, 43]، استخدمstatisticsلحساب المتوسط والوسيط والانحراف المعياري. ثم استخدمmathلتحديد القيم التي تقع ضمن "المتوسط ± الانحراف المعياري." -
تحدي (الصعوبة ⭐⭐⭐): اكتب برنامج "الخروج من عربة التسوق." المنتجات لها أسماء وأسعار وحدة (
Decimal) وكميات. بعد إضافة العناصر، احسب المجموع والضريبة (8%) والخصم (اطرح 10 لكل 100)، ثم أخرج المبلغ النهائي. متطلب: جميع الحسابات النقدية يجب أن تستخدمDecimal.