تظهر عبارة خصم 20% أو خصم 35% في المتاجر كثيرًا، لكن كيف نحولها إلى برنامج Python صغير يحسب قيمة الخصم والسعر النهائي بدقة؟ هذا المثال مناسب جدًا للمبتدئين لأنه يجمع أكثر من مهارة أساسية في برنامج واحد: استقبال البيانات عبر input()، تحويل النصوص إلى أرقام باستخدام float()، تنفيذ عمليات حسابية، استخدام شرط if للتحقق من الإدخال، ثم عرض النتيجة بصورة منظمة.
سنبدأ بحساب بسيط لقيمة ثابتة، ثم نجعل المستخدم يدخل السعر ونسبة الخصم بنفسه، وبعد ذلك نضيف التحقق من أن البيانات منطقية. وفي نهاية المقال ستبني دالة قابلة لإعادة الاستخدام لحساب الخصم في أي مشروع صغير.
{alertInfo} الفكرة ببساطة: لحساب قيمة الخصم نضرب السعر في نسبة الخصم ثم نقسم على100. ولحساب السعر النهائي نطرح قيمة الخصم من السعر الأصلي. إذا كان السعر200والخصم25%، فقيمة الخصم50والسعر النهائي150.
{getToc} $title={محتوى المقال}
ماذا سنبني في هذا المثال؟
سنكتب برنامجًا يطلب من المستخدم إدخال:
- السعر الأصلي للمنتج.
- نسبة الخصم المئوية.
ثم يعرض:
- قيمة الخصم.
- السعر بعد الخصم.
- رسالة توضح إن كانت البيانات غير صحيحة، مثل خصم أكبر من
100%.
معادلة حساب الخصم والسعر النهائي
قبل كتابة الكود، من المهم فهم العملية الحسابية نفسها:
| المطلوب | المعادلة | مثال: السعر 200 والخصم 25% |
|---|---|---|
| قيمة الخصم | price * discount / 100 |
200 * 25 / 100 = 50 |
| السعر النهائي | price - discount_value |
200 - 50 = 150 |
إذن ترتيب العمل سيكون كالتالي:
- نحفظ السعر الأصلي في متغير.
- نحفظ نسبة الخصم في متغير.
- نحسب قيمة الخصم.
- نطرحها من السعر الأصلي.
- نطبع النتيجة.
الكود الأول: حساب الخصم بقيم ثابتة
لنبدأ بأسهل نسخة. سنضع السعر والخصم داخل الكود مباشرة:
price = 200
discount = 25
discount_value = price * discount / 100
final_price = price - discount_value
print("السعر الأصلي:", price)
print("قيمة الخصم:", discount_value)
print("السعر بعد الخصم:", final_price)
الناتج:
السعر الأصلي: 200
قيمة الخصم: 50.0
السعر بعد الخصم: 150.0
في هذا المثال:
priceيمثل السعر قبل الخصم.discountيمثل النسبة المئوية للخصم، وليس قيمته المالية.discount_valueهو المبلغ الذي سيُخصم.final_priceهو المبلغ الذي سيدفعه العميل بعد الخصم.
لماذا نقسم على 100؟
النسبة المئوية تعني جزءًا من مئة. لذلك 25% تعني 25 / 100 أي 0.25. عندما نكتب:
price * discount / 100
نحن نحسب الجزء الذي تمثله نسبة الخصم من السعر. يمكنك كتابة المعادلة بطريقة مكافئة:
discount_value = price * (discount / 100)
لكن الصيغة الأولى أبسط للقراءة في هذا المثال.
نسخة تفاعلية: اجعل المستخدم يدخل السعر والخصم
الآن سنجعل البرنامج أكثر فائدة. الدالة input() تستقبل ما يكتبه المستخدم، لكنها تعيد النص على شكل str. لذلك نستخدم float() لتحويل السعر ونسبة الخصم إلى أرقام عشرية يمكن إجراء الحسابات عليها.
price = float(input("أدخل السعر الأصلي: "))
discount = float(input("أدخل نسبة الخصم: "))
discount_value = price * discount / 100
final_price = price - discount_value
print(f"قيمة الخصم: {discount_value}")
print(f"السعر النهائي: {final_price}")
مثال تشغيل:
أدخل السعر الأصلي: 149.99
أدخل نسبة الخصم: 15
قيمة الخصم: 22.4985
السعر النهائي: 127.4915
النتيجة الحسابية صحيحة، لكن عرض عدد كبير من المنازل العشرية غير مناسب عادة للأسعار. لذلك سننسق النتيجة في الخطوة التالية.
عرض السعر بمنزلتين عشريتين
داخل f-string تستطيع استخدام :.2f لعرض الرقم بمنزلتين عشريتين:
print(f"قيمة الخصم: {discount_value:.2f}")
print(f"السعر النهائي: {final_price:.2f}")
سيصبح الناتج أوضح:
قيمة الخصم: 22.50
السعر النهائي: 127.49
استخدمنا f-string لأنها طريقة واضحة لدمج القيم داخل النص. راجع توثيق Python الرسمي حول Input and Output لفهم تنسيق المخرجات بصورة أوسع.
أضف التحقق من صحة السعر ونسبة الخصم
النسخة السابقة تفترض أن المستخدم يكتب أرقامًا منطقية، لكن ماذا لو أدخل سعرًا سالبًا؟ أو خصمًا بقيمة 150؟ هذه القيم لا تصلح في نموذج خصم عادي.
نستخدم if للتحقق من الآتي:
- السعر أكبر من صفر.
- نسبة الخصم بين
0و100.
price = float(input("أدخل السعر الأصلي: "))
discount = float(input("أدخل نسبة الخصم: "))
if price <= 0:
print("السعر يجب أن يكون أكبر من صفر.")
elif discount < 0 or discount > 100:
print("نسبة الخصم يجب أن تكون بين 0 و100.")
else:
discount_value = price * discount / 100
final_price = price - discount_value
print(f"قيمة الخصم: {discount_value:.2f}")
print(f"السعر النهائي: {final_price:.2f}")
تدعم Python استخدام if وelif وelse لبناء مسارات قرار متعددة في البرنامج.
نسخة أفضل: معالجة إدخال النص بدل الرقم
إذا كتب المستخدم كلمة مثل عشرون بدل 20، فإن float() سترفع ValueError. يمكننا التعامل مع ذلك باستخدام try وexcept:
try:
price = float(input("أدخل السعر الأصلي: "))
discount = float(input("أدخل نسبة الخصم: "))
if price <= 0:
print("السعر يجب أن يكون أكبر من صفر.")
elif not 0 <= discount <= 100:
print("نسبة الخصم يجب أن تكون بين 0 و100.")
else:
discount_value = price * discount / 100
final_price = price - discount_value
print(f"قيمة الخصم: {discount_value:.2f}")
print(f"السعر النهائي: {final_price:.2f}")
except ValueError:
print("الرجاء إدخال أرقام صحيحة أو عشرية فقط.")
الشرط المختصر:
0 <= discount <= 100
يعني أن الخصم لا يقل عن صفر ولا يزيد على مئة في الوقت نفسه.
ضع الحساب داخل دالة قابلة لإعادة الاستخدام
عندما يتكرر منطق الحساب في أكثر من مكان، من الأفضل وضعه في دالة. هكذا يصبح الكود منظمًا، ويمكنك استخدامه لاحقًا في برنامج متجر أو فاتورة أو واجهة ويب.
def calculate_discount(price, discount):
discount_value = price * discount / 100
final_price = price - discount_value
return discount_value, final_price
discount_value, final_price = calculate_discount(350, 30)
print(f"قيمة الخصم: {discount_value:.2f}")
print(f"السعر بعد الخصم: {final_price:.2f}")
الناتج:
قيمة الخصم: 105.00
السعر بعد الخصم: 245.00
لاحظ أن الدالة تعيد قيمتين. Python تسمح بإعادة عدة قيم، ثم يمكن حفظها في متغيرين بهذا الشكل:
discount_value, final_price = calculate_discount(350, 30)
برنامج كامل: حاسبة خصم للمبتدئين
هذه نسخة عملية تجمع ما تعلمناه: إدخال المستخدم، التحقق، الحساب، والتنسيق.
def calculate_discount(price, discount):
discount_value = price * discount / 100
final_price = price - discount_value
return discount_value, final_price
try:
price = float(input("أدخل السعر الأصلي: "))
discount = float(input("أدخل نسبة الخصم: "))
if price <= 0:
print("السعر يجب أن يكون أكبر من صفر.")
elif not 0 <= discount <= 100:
print("نسبة الخصم يجب أن تكون بين 0 و100.")
else:
discount_value, final_price = calculate_discount(price, discount)
print("\n--- ملخص العملية ---")
print(f"السعر الأصلي: {price:.2f}")
print(f"نسبة الخصم: {discount:.2f}%")
print(f"قيمة الخصم: {discount_value:.2f}")
print(f"السعر النهائي: {final_price:.2f}")
except ValueError:
print("خطأ: الرجاء إدخال قيمة رقمية صحيحة.")
تطبيق إضافي: خصم حسب قيمة الشراء
يمكنك تطوير البرنامج بحيث يحدد نسبة الخصم تلقائيًا بحسب قيمة الطلب. هذا يدرّبك على استخدام if وelif وelse بصورة عملية:
price = float(input("أدخل إجمالي المشتريات: "))
if price >= 500:
discount = 25
elif price >= 250:
discount = 15
elif price >= 100:
discount = 10
else:
discount = 0
discount_value = price * discount / 100
final_price = price - discount_value
print(f"الخصم المطبق: {discount}%")
print(f"السعر النهائي: {final_price:.2f}")
إذا أدخل المستخدم 300 مثلًا، سيطبق البرنامج خصمًا بنسبة 15%.
هل نستخدم float أم Decimal للأسعار؟
في أمثلة التعلم البسيطة نستخدم float لأنه مباشر وسهل الفهم. لكن في التطبيقات المالية الحقيقية التي تحتاج دقة محاسبية صارمة، قد تفضّل استخدام Decimal من مكتبة decimal؛ لأن بعض الأرقام العشرية لا تمثل بدقة تامة في نظام float الثنائي.
لا تحتاج إلى استعمال Decimal في هذا الدرس، لكن من المفيد أن تعرف هذه النقطة عندما تبدأ ببناء برامج فواتير أو محاسبة. توضح وثائق Python أن Decimal صمم لتمثيل الأرقام العشرية بطريقة أدق في الحالات المناسبة للحسابات البشرية والمالية.
أخطاء شائعة عند حساب الخصم
1. نسيان القسمة على 100
# خطأ
discount_value = price * discount
إذا كان السعر 200 والخصم 25، سيصبح الناتج 5000 بدل 50.
الحل:
discount_value = price * discount / 100
2. طرح نسبة الخصم مباشرة من السعر
# خطأ
final_price = price - discount
هذه العملية تطرح الرقم discount نفسه من السعر، لا نسبة منه. يجب أولًا حساب discount_value.
3. قبول خصم أكبر من 100%
أي خصم أكبر من 100 سيجعل السعر النهائي سالبًا، وهذا غير مناسب في هذا المثال. لذلك تحقق من المدى قبل الحساب.
4. استخدام int بدل float مع أسعار عشرية
إذا كان السعر 99.99 واستخدمت int()، ستظهر مشكلة لأن int("99.99") لا يقبل هذا النص. استخدم float() عندما تتوقع أسعارًا تحتوي منازل عشرية.
5. عدم معالجة إدخال غير رقمي
عند تحويل إدخال المستخدم إلى رقم، استخدم try/except ValueError إذا أردت منع توقف البرنامج عند كتابة نص غير صالح.
تمرين عملي
اكتب برنامجًا يطلب من المستخدم سعر المنتج ونسبة خصم، ثم:
- يرفض السعر إذا كان أقل من أو يساوي صفرًا.
- يرفض نسبة الخصم إذا لم تكن بين
0و100. - يعرض السعر الأصلي وقيمة الخصم والسعر النهائي بمنزلتين عشريتين.
- يعرض رسالة إضافية إذا كان الخصم يساوي
0.
حل مقترح
try:
price = float(input("أدخل السعر: "))
discount = float(input("أدخل نسبة الخصم: "))
if price <= 0:
print("السعر غير صالح.")
elif not 0 <= discount <= 100:
print("نسبة الخصم غير صالحة.")
elif discount == 0:
print(f"لا يوجد خصم. السعر النهائي: {price:.2f}")
else:
discount_value = price * discount / 100
final_price = price - discount_value
print(f"قيمة الخصم: {discount_value:.2f}")
print(f"السعر النهائي: {final_price:.2f}")
except ValueError:
print("أدخل أرقامًا صحيحة فقط.")
روابط داخلية مفيدة من بايثون العرب
- سلسلة بايثون بالمثال
- بايثون بالمثال 2: معرفة هل العدد زوجي أم فردي
- بايثون بالمثال 14: عدّ تكرار العناصر في List
- محرر بايثون أونلاين لتجربة الكود
- كورس أساسيات بايثون للمبتدئين
الخلاصة
- قيمة الخصم تساوي
price * discount / 100. - السعر النهائي يساوي
price - discount_value. - استخدم
float()لقراءة الأسعار والنسب العشرية من المستخدم. - استخدم
ifللتحقق من أن السعر أكبر من صفر والخصم بين0و100. - استخدم
:.2fلعرض السعر وقيمة الخصم بمنزلتين عشريتين. - ضع منطق الحساب داخل دالة عندما تريد إعادة استخدامه في أكثر من مكان.
- في التطبيقات المالية الدقيقة، تعرّف لاحقًا على
Decimalبدل الاعتماد الكامل علىfloat.
{alertSuccess}
قاعدة ذهبية: لا تطرح نسبة الخصم مباشرة من السعر. احسب أولًا قيمة الخصم بقسمة النسبة على 100، ثم اطرح هذه القيمة من السعر الأصلي.
مصادر خارجية رسمية للتوسع
- Built-in Functions: input وfloat في Python
- if Statements — Python Documentation
- Input and Output Formatting — Python Documentation
- decimal — Decimal fixed-point arithmetic
أسئلة شائعة
كيف أحسب 20% خصم في Python؟
استخدم المعادلة discount_value = price * 20 / 100، ثم احسب السعر النهائي عبر final_price = price - discount_value.
كيف أحسب السعر بعد الخصم في Python؟
بعد حساب قيمة الخصم، اطرحها من السعر الأصلي. مثال: final_price = price - (price * discount / 100).
هل يمكن أن تكون نسبة الخصم رقمًا عشريًا؟
نعم. استخدم float() مثل discount = 12.5، وسيحسب البرنامج الخصم بصورة طبيعية.
لماذا نستخدم float بدل int عند حساب الأسعار؟
لأن السعر أو نسبة الخصم قد يحتويان على قيمة عشرية مثل 99.99 أو 12.5. الدالة float() تقبل هذه القيم.
هل float مناسب لحسابات المتجر الحقيقية؟
هو مناسب للتعلم والأمثلة البسيطة. للحسابات المالية التي تتطلب دقة محاسبية صارمة، استخدم لاحقًا Decimal من مكتبة decimal.



