الدرس 31 من دورة Python للمبتدئين

تحسين التقرير النهائي: اجعل مخرجات برنامج المشتريات أوضح

في الدرس السابق حفظنا المنتجات في ملف JSON. الآن سنحسن طريقة عرض التقرير النهائي ليصبح أوضح، مرتبًا، وأسهل قراءة للمستخدم.

المستوى: مبتدئ جدًا النتيجة: تقرير نهائي مرتب مدة التطبيق: 40 - 45 دقيقة
طريقة CIT للتعلم الهادئ: التقرير الجيد لا يغيّر الحسابات. هو يغيّر طريقة عرض النتائج حتى يفهمها المستخدم بسرعة.
مهم قبل البداية: سنضيف from datetime import datetime في أعلى الملف حتى نعرض تاريخ ووقت التقرير.

ما النتيجة التي يجب أن تخرج بها؟

بدل تقرير بسيط، نريد تقريرًا مثل:

========================================
تقرير المشتريات
تاريخ التقرير: 2026-07-19 08:30
========================================

المنتجات:
1. Keyboard
   السعر: 100.00 ريال

2. Mouse
   السعر: 50.00 ريال

----------------------------------------
عدد المنتجات: 2
متوسط السعر: 75.00 ريال
الإجمالي قبل الضريبة: 150.00 ريال
الضريبة: 22.50 ريال
الإجمالي النهائي: 172.50 ريال
========================================
format_money تنسيق السعر بطريقة واحدة.
datetime إضافة وقت التقرير.
average حساب متوسط سعر المنتجات.
خريطة درس تحسين التقرير النهائي في Python
الفرق بين التقرير البسيط والتقرير المحسن في Python
1

لماذا نحسن التقرير؟

البرنامج قد يكون صحيحًا من ناحية الحسابات، لكن المستخدم يحتاج رؤية النتيجة بشكل مرتب.

التقرير المحسن يساعد المستخدم على معرفة:

ما المنتجات؟
كم عددها؟
كم إجمالي السعر؟
كم الضريبة؟
كم المبلغ النهائي؟
الفكرة ببساطة: الحساب الصحيح مهم، لكن عرض النتيجة بوضوح مهم أيضًا.
تحقق قبل الانتقال ✅ هل فهمت أن هذا الدرس يحسن المخرجات وليس طريقة حفظ البيانات؟
2

أنشئ ملف الدرس الحادي والثلاثين

افتح مجلد الدورة داخل VS Code:

python_course

ثم أنشئ ملفًا جديدًا باسم:

lesson_31.py

انسخ إليه كود الدرس السابق، ثم طبق تعديلات هذا الدرس.

توقف لحظة ✅ هل أصبح لديك ملف lesson_31.py قبل التعديل؟
3

أضف datetime و CURRENCY في أعلى الملف

في أعلى الملف، اجعل البداية هكذا:

import json
from datetime import datetime

DATA_FILE = "products.json"
TAX_RATE = 0.15
CURRENCY = "ريال"

استخدمنا CURRENCY حتى لا نكرر كلمة ريال في أكثر من مكان.

لماذا datetime؟ لأننا نريد طباعة تاريخ ووقت إنشاء التقرير داخل المخرجات.
سؤال سريع 🧠 أين نضع from datetime import datetime؟ في أعلى الملف مع import json.
4

اكتب دالة تنسيق المبلغ

بدل أن نكتب تنسيق السعر في كل مكان، نضعه في دالة واحدة:

def format_money(value):
    return f"{value:.2f} {CURRENCY}"

الآن أي مبلغ نريد عرضه نمرره لهذه الدالة.

فائدة هذه الدالة: إذا أردت تغيير العملة لاحقًا، تعدل CURRENCY فقط بدل تعديل كل أسطر الطباعة.
تحقق قبل الانتقال ✅ هل فهمت أن format_money ترجع نصًا جاهزًا للطباعة؟
5

اكتب دالة طباعة خط فاصل

التقرير يحتاج فواصل حتى يكون مقروءًا:

def print_line():
    print("=" * 40)

ويمكننا استخدام خط أخف داخل التقرير:

def print_small_line():
    print("-" * 40)
لماذا دوال للفواصل؟ لأننا سنستخدمها أكثر من مرة، والدالة تجعل الكود أوضح.
سؤال سريع 🧠 ماذا يفعل "*" هنا؟ يكرر النص. مثل "=" * 40 يعني كرر علامة = أربعين مرة.
6

اكتب دالة وقت التقرير

نريد عرض وقت إنشاء التقرير:

def get_report_time():
    now = datetime.now()
    return now.strftime("%Y-%m-%d %H:%M")

هذه الدالة ترجع التاريخ والوقت كنص مرتب.

ملاحظة للمبتدئ: لا تحتاج حفظ صيغة strftime الآن. افهم أنها تحوّل الوقت إلى نص بالشكل الذي نريده.
تحقق قبل الانتقال ✅ هل فهمت أن get_report_time لا تحسب أسعارًا؟ هي فقط ترجع وقت التقرير.
7

اكتب دالة متوسط السعر

سنضيف معلومة مفيدة في الملخص: متوسط سعر المنتج.

def calculate_average_price(products, total):
    if len(products) == 0:
        return 0

    return total / len(products)

إذا لم توجد منتجات نرجع 0 حتى لا يحدث خطأ قسمة على صفر.

قاعدة مهمة: قبل أي قسمة، اسأل نفسك: هل يمكن أن يكون المقسوم عليه صفرًا؟
سؤال سريع 🧠 لماذا لم نكتب total / len(products) مباشرة؟ لأن القائمة قد تكون فارغة.
8

افهم أجزاء التقرير النهائي

التقرير المحسن يتكون من ثلاثة أجزاء:

أجزاء التقرير النهائي في برنامج Python
رأس التقرير العنوان والتاريخ.
تفاصيل المنتجات قائمة المنتجات وأسعارها.
الملخص العدد، المتوسط، الضريبة، النهائي.
9

رتّب الكود النهائي على أجزاء

الجزء الأول: الاستيراد والإعدادات:

import json
from datetime import datetime

DATA_FILE = "products.json"
TAX_RATE = 0.15
CURRENCY = "ريال"

الجزء الثاني: دوال تنسيق التقرير:

def format_money(value):
    return f"{value:.2f} {CURRENCY}"

def print_line():
    print("=" * 40)

def print_small_line():
    print("-" * 40)

الجزء الثالث: وقت التقرير ومتوسط السعر:

def get_report_time():
    now = datetime.now()
    return now.strftime("%Y-%m-%d %H:%M")

def calculate_average_price(products, total):
    if len(products) == 0:
        return 0

    return total / len(products)

الجزء الرابع: بداية دالة التقرير المحسن:

def print_report(products, total, tax, final_total):
    if len(products) == 0:
        print("لا توجد منتجات حتى الآن")
        return

    average_price = calculate_average_price(
        products,
        total
    )

الجزء الخامس: رأس التقرير:

    print_line()
    print("تقرير المشتريات")
    print(f"تاريخ التقرير: {get_report_time()}")
    print_line()

الجزء السادس: طباعة المنتجات:

    print()
    print("المنتجات:")

    for index in range(len(products)):
        product = products[index]
        product_number = index + 1
        name = product["name"]
        price = product["price"]

أكمل طباعة كل منتج:

        print(f"{product_number}. {name}")
        print(f"   السعر: {format_money(price)}")
        print()

الجزء السابع: ملخص التقرير:

    print_small_line()
    print(f"عدد المنتجات: {len(products)}")
    print(f"متوسط السعر: {format_money(average_price)}")
    print(
        f"الإجمالي قبل الضريبة: "
        f"{format_money(total)}"
    )

أكمل الضريبة والإجمالي النهائي:

    print(f"الضريبة: {format_money(tax)}")
    print(
        f"الإجمالي النهائي: "
        f"{format_money(final_total)}"
    )
    print_line()
مهم جدًا: في ملف lesson_31.py استبدل دالة print_report القديمة بهذه الدالة الجديدة، وأضف الدوال المساعدة قبلها.
تحقق قبل الانتقال ✅ هل فهمت أن دالة التقرير الجديدة ما زالت تستخدم نفس total و tax و final_total؟
10

شغّل البرنامج واختبر التقرير

احفظ الملف:

Ctrl + S

ثم شغله:

python lesson_31.py

وإذا لم يعمل أمر python:

py lesson_31.py

أضف منتجين ثم اختر عرض التقرير:

اختر رقم الأمر: 1
اسم المنتج: Keyboard
سعر المنتج: 100

اختر رقم الأمر: 1
اسم المنتج: Mouse
سعر المنتج: 50

اختر رقم الأمر: 2
تحقق قبل الانتقال ✅ هل ظهر التقرير بتنسيق واضح وفيه تاريخ التقرير؟
11

النتيجة المتوقعة

يجب أن ترى مخرجات قريبة من هذا الشكل:

أولًا: رأس التقرير وقائمة المنتجات:

========================================
تقرير المشتريات
تاريخ التقرير: 2026-07-19 08:30
========================================

المنتجات:
1. Keyboard
   السعر: 100.00 ريال

2. Mouse
   السعر: 50.00 ريال

ثانيًا: ملخص التقرير النهائي:

----------------------------------------
عدد المنتجات: 2
متوسط السعر: 75.00 ريال
الإجمالي قبل الضريبة: 150.00 ريال
الضريبة: 22.50 ريال
الإجمالي النهائي: 172.50 ريال
========================================
ماذا تعلمت؟ نفس الحسابات السابقة أصبحت تظهر بشكل أوضح، وهذا يجعل البرنامج أقرب للاستخدام العملي.
توقف لحظة ✅ لا تعتمد الدرس قبل تجربة إضافة منتجين ثم عرض التقرير.
12

تحدي صغير: غيّر العملة من مكان واحد

جرّب تغيير:

CURRENCY = "ريال"

إلى:

CURRENCY = "SAR"

ثم شغّل التقرير مرة أخرى. ستلاحظ أن كل الأسعار تغيرت لأننا استخدمنا format_money.

هدف التحدي: تفهم فائدة وضع التنسيق في دالة واحدة بدل تكراره في كل مكان.

اختبار نهاية الدرس

قبل الانتقال للدرس القادم، تأكد أنك فهمت هذه النقاط:

✅ فهمت لماذا نحتاج تحسين التقرير.
✅ أضفت datetime لعرض وقت التقرير.
✅ كتبت format_money لتنسيق المبلغ.
✅ كتبت print_line و print_small_line.
✅ حسبت متوسط سعر المنتجات.
✅ رتبت التقرير إلى رأس وتفاصيل وملخص.
✅ اختبرت التقرير بعد إضافة أكثر من منتج.
✅ أصبحت مخرجات البرنامج أوضح وأكثر احترافية.
إذا فهمت هذه النقاط: فأنت الآن جاهز للدرس الأخير: تجميع المشروع النهائي الكامل ومراجعته كنسخة احترافية.

خلاصة الدرس

تعلمنا كيف نحسن التقرير النهائي في برنامج المشتريات. أضفنا تاريخ التقرير، تنسيق المبالغ، الفواصل، متوسط السعر، وملخصًا نهائيًا واضحًا.

تذكر القاعدة:

اجعل التقرير واضحًا
اجعل التنسيق في دوال مستقلة
اعرض التفاصيل ثم الملخص
لا تغيّر الحسابات بدون سبب

في الدرس القادم سنجمع المشروع النهائي كاملًا ونراجعه كبرنامج واحد منظم قابل للتشغيل.