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

حذف منتج من القائمة: صحّح الأخطاء قبل طباعة التقرير

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

المستوى: مبتدئ جدًا النتيجة: حذف منتج من products مدة التطبيق: 40 - 45 دقيقة
طريقة CIT للتعلم الهادئ: لا تنظر إلى الحذف كأمر واحد فقط. افهم المسار كاملًا: عرض المنتجات، اختيار رقم، التحقق من الرقم، ثم حذف المنتج الصحيح.
مهم قبل البداية: سنغيّر القائمة قليلًا. كان الخيار 3 للخروج، وسيصبح الخيار 3 لحذف منتج، والخيار 4 للخروج.

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

في نهاية الدرس ستكون قائمة البرنامج بهذا الشكل:

----- قائمة البرنامج -----
1. إضافة منتج
2. عرض التقرير
3. حذف منتج
4. خروج

وعند اختيار حذف منتج، يعرض البرنامج المنتجات بأرقام:

1. Keyboard: 100.00 ريال
2. Mouse: 50.00 ريال
رقم المستخدم يبدأ من 1 لأنه أسهل للمستخدم.
index يبدأ من 0 داخل قائمة Python.
pop يحذف عنصرًا من القائمة ويرجعه.
خريطة درس حذف منتج من القائمة في Python
مفهوم حذف منتج من قائمة المنتجات في Python
1

لماذا نحتاج حذف منتج؟

المستخدم قد يضيف منتجًا بالخطأ، أو يكتب منتجًا مكررًا، أو يقرر حذف منتج قبل عرض التقرير.

في هذه الحالة لا نريد منه إغلاق البرنامج وإعادة العمل من البداية. الأفضل أن نعطيه أمرًا واضحًا لحذف المنتج.

الفكرة ببساطة: كلما زادت قدرة المستخدم على تصحيح أخطائه داخل البرنامج، صار البرنامج أقرب للاستخدام الحقيقي.
تحقق قبل الانتقال ✅ هل فهمت أن حذف المنتج ليس رفاهية، بل جزء من تجربة المستخدم؟
2

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

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

python_course

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

lesson_28.py

افتح الملف داخل Editor.

توقف لحظة ✅ هل ظهر ملف lesson_28.py داخل Explorer؟ إذا نعم، انتقل للخطوة التالية.
3

حدّث قائمة الأوامر

عدّل دالة print_menu لتصبح:

def print_menu():
    print()
    print("----- قائمة البرنامج -----")
    print("1. إضافة منتج")
    print("2. عرض التقرير")
    print("3. حذف منتج")
    print("4. خروج")

الآن صار عند المستخدم أمر جديد للحذف.

سؤال سريع 🧠 لماذا نقلنا الخروج إلى رقم 4؟ لأن رقم 3 أصبح مخصصًا لحذف منتج.
4

اكتب دالة عرض المنتجات بأرقام

قبل حذف منتج، يجب أن نعرض المنتجات بأرقام واضحة:

def print_products(products):
    if len(products) == 0:
        print("لا توجد منتجات حتى الآن")
        return False

ثم نطبع المنتجات:

    print("----- المنتجات الحالية -----")

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

        print(f"{index + 1}. {name}: {price:.2f} ريال")

    return True
لماذا ترجع True أو False؟ حتى تعرف دالة الحذف هل توجد منتجات يمكن حذفها أم لا.
تحقق قبل الانتقال ✅ هل فهمت لماذا نعرض index + 1 للمستخدم بدل index نفسه؟
5

افهم pop قبل استخدامه

في Python نستطيع حذف عنصر من قائمة باستخدام:

deleted_product = products.pop(index)

هذا السطر يفعل شيئين:

يحذف يحذف العنصر من القائمة.
يرجع يعيد العنصر المحذوف في متغير.
نستفيد منه نعرف اسم المنتج وسعره بعد الحذف.
شرح تحويل رقم المستخدم إلى index واستخدام pop في Python
سؤال سريع 🧠 إذا اختار المستخدم رقم 2، ما هو index داخل Python؟ الجواب: 1.
6

اكتب دالة حذف المنتج

أولًا: ابدأ الدالة وتأكد أن هناك منتجات:

def delete_product(products):
    if print_products(products) == False:
        return 0

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

    delete_text = input("اكتب رقم المنتج المراد حذفه: ").strip()

ثالثًا: حاول تحويل الرقم إلى int:

    try:
        delete_number = int(delete_text)
    except ValueError:
        print("رقم المنتج غير صحيح")
        return 0

رابعًا: حوّل رقم المستخدم إلى index:

    index = delete_number - 1

خامسًا: تأكد أن الرقم داخل حدود القائمة:

    if index < 0 or index >= len(products):
        print("رقم المنتج غير موجود")
        return 0

سادسًا: احذف المنتج وأرجع سعره:

    deleted_product = products.pop(index)

    print(f"تم حذف المنتج: {deleted_product['name']}")

    return deleted_product["price"]
تدفق حذف منتج من برنامج المشتريات في Python
لماذا نرجع سعر المنتج المحذوف؟ لأن main ستطرح هذا السعر من total بعد الحذف.
تحقق قبل الانتقال ✅ هل فهمت لماذا نستخدم return 0 إذا فشل الحذف؟
7

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

الجزء الأول: الإعدادات ودوال الحساب:

TAX_RATE = 0.15

def calculate_tax(total):
    return total * TAX_RATE

def calculate_final_total(total, tax):
    return total + tax

الجزء الثاني: إنشاء المنتج وعرض القائمة:

def create_product(product_name, price):
    product = {
        "name": product_name,
        "price": price
    }

    return product

def print_menu():
    print()
    print("----- قائمة البرنامج -----")
    print("1. إضافة منتج")
    print("2. عرض التقرير")
    print("3. حذف منتج")
    print("4. خروج")

الجزء الثالث: دالة إضافة منتج:

def add_product(products):
    name_prompt = "اسم المنتج: "
    price_prompt = "سعر المنتج: "

    product_name = input(name_prompt).strip()
    price_text = input(price_prompt).strip()

أكمل دالة الإضافة بفحص السعر:

    try:
        price = float(price_text)
    except ValueError:
        print("السعر غير صحيح، اكتب رقمًا فقط")
        return 0

    if price < 0:
        print("السعر لا يمكن أن يكون سالبًا")
        return 0

ثم أنشئ المنتج وأرجع السعر:

    product = create_product(
        product_name,
        price
    )

    products.append(product)

    print("تمت إضافة المنتج بنجاح")
    return price

الجزء الرابع: دالة عرض المنتجات:

def print_products(products):
    if len(products) == 0:
        print("لا توجد منتجات حتى الآن")
        return False

    print("----- المنتجات الحالية -----")

أكمل عرض المنتجات:

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

        print(f"{index + 1}. {name}: {price:.2f} ريال")

    return True

الجزء الخامس: دالة حذف المنتج:

def delete_product(products):
    if print_products(products) == False:
        return 0

    delete_text = input("اكتب رقم المنتج المراد حذفه: ").strip()

حوّل رقم الحذف وتحقق منه:

    try:
        delete_number = int(delete_text)
    except ValueError:
        print("رقم المنتج غير صحيح")
        return 0

    index = delete_number - 1

احذف المنتج إذا كان الرقم صحيحًا:

    if index < 0 or index >= len(products):
        print("رقم المنتج غير موجود")
        return 0

    deleted_product = products.pop(index)

    print(f"تم حذف المنتج: {deleted_product['name']}")

    return deleted_product["price"]

الجزء السادس: دالة التقرير:

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

    print("----- تقرير المنتجات -----")

أكمل طباعة التقرير:

    for product in products:
        name = product["name"]
        price = product["price"]

        print(f"{name}: {price:.2f} ريال")

    print(f"عدد المنتجات: {len(products)}")
    print(f"الإجمالي قبل الضريبة: {total:.2f} ريال")
    print(f"الضريبة: {tax:.2f} ريال")
    print(f"الإجمالي النهائي: {final_total:.2f} ريال")

الجزء السابع: بداية main:

def main():
    products = []
    total = 0
    menu_prompt = "اختر رقم الأمر: "

الجزء الثامن: أوامر الإضافة والحذف داخل main:

    while True:
        print_menu()
        choice = input(menu_prompt).strip()

        if choice == "1":
            added_price = add_product(products)
            total = total + added_price

        elif choice == "3":
            deleted_price = delete_product(products)
            total = total - deleted_price

الجزء التاسع: عرض التقرير والخروج:

        elif choice == "2":
            tax = calculate_tax(total)
            final_total = calculate_final_total(
                total,
                tax
            )

            print_report(
                products,
                total,
                tax,
                final_total
            )

        elif choice == "4":
            print("تم إنهاء البرنامج")
            break
        else:
            print("اختيار غير صحيح، حاول مرة أخرى")

الجزء العاشر والأخير: تشغيل البرنامج:

main()
مهم جدًا: الأجزاء السابقة تُكتب في نفس ملف lesson_28.py بالترتيب. وانتبه للمسافات داخل الدوال وداخل main.
تحقق قبل الانتقال ✅ هل فهمت أن الحذف يرجع سعر المنتج المحذوف حتى نطرحه من total؟
8

شغّل البرنامج

احفظ الملف:

Ctrl + S

ثم شغله:

python lesson_28.py

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

py lesson_28.py
تحقق قبل الانتقال ✅ هل ظهرت قائمة البرنامج وفيها 4 أوامر؟
9

اختبر حذف منتج

أولًا: أضف منتجين:

اختر رقم الأمر: 1
اسم المنتج: Keyboard
سعر المنتج: 100
تمت إضافة المنتج بنجاح

اختر رقم الأمر: 1
اسم المنتج: Mouse
سعر المنتج: 50
تمت إضافة المنتج بنجاح

ثانيًا: اختر حذف منتج:

اختر رقم الأمر: 3
----- المنتجات الحالية -----
1. Keyboard: 100.00 ريال
2. Mouse: 50.00 ريال
اكتب رقم المنتج المراد حذفه: 2
تم حذف المنتج: Mouse

ثالثًا: اعرض التقرير:

اختر رقم الأمر: 2
----- تقرير المنتجات -----
Keyboard: 100.00 ريال
عدد المنتجات: 1
الإجمالي قبل الضريبة: 100.00 ريال
الضريبة: 15.00 ريال
الإجمالي النهائي: 115.00 ريال
ماذا تعلمت؟ حذف المنتج لم يزيله من القائمة فقط، بل خصم سعره من total أيضًا.
توقف لحظة ✅ هل اختبرت حذف منتج ثم عرض التقرير؟ لا تعتمد الدرس قبل تجربة الحالتين.
10

اختبر رقمًا غير صحيح

جرّب حذف رقم غير موجود:

اختر رقم الأمر: 3
اكتب رقم المنتج المراد حذفه: 9
رقم المنتج غير موجود

وجرّب إدخال نص بدل رقم:

اختر رقم الأمر: 3
اكتب رقم المنتج المراد حذفه: abc
رقم المنتج غير صحيح
لماذا هذه الاختبارات مهمة؟ لأن المستخدم الحقيقي قد يكتب رقمًا غير موجود أو نصًا غير رقمي. البرنامج الجيد يتعامل مع هذه الحالات بهدوء.
تحدي التفكير 🧠 لماذا لا نستخدم pop قبل التأكد من صحة الرقم؟ لأن pop برقم خاطئ قد يسبب خطأ في البرنامج.

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

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

✅ فهمت لماذا نحتاج حذف منتج.
✅ عدّلت قائمة الأوامر إلى 4 خيارات.
✅ كتبت دالة print_products.
✅ فهمت الفرق بين رقم المستخدم و index.
✅ استخدمت pop لحذف منتج من القائمة.
✅ أرجعت سعر المنتج المحذوف.
✅ طرحت السعر المحذوف من total.
✅ اختبرت الحذف الصحيح والخاطئ.
إذا فهمت هذه النقاط: فأنت الآن تجعل برنامجك يسمح للمستخدم بتصحيح أخطائه بدل أن يبدأ من جديد.

خلاصة الدرس

تعلمنا كيف نضيف أمر حذف منتج إلى برنامج المشتريات. عرضنا المنتجات بأرقام، وحولنا رقم المستخدم إلى index، ثم استخدمنا pop لحذف المنتج من القائمة.

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

اعرض المنتجات
اقرأ رقم المنتج
حوّل الرقم إلى index
تحقق من صحة index
احذف باستخدام pop

في الدرس القادم سنتعلم تعديل منتج أو سعره بدل حذفه وإضافته من جديد.