الفصل 07

استقبال المدخلات من مستخدم البرنامج

قراءة ما يكتبه المستخدم عبر input()، ولماذا تكون المدخلات دائماً نصوصاً str، والأخطاء التي تظهر عند التحويل عبر int() و float().

30 دقيقةPython 3.12
  1. 1المشكلة
  2. 2الفهم
  3. 3أمثلة محلولة
  4. 4التوقع
  5. 5التطبيق
  6. 6التحدي

المشكلة التي نقوم بحلها

كل برنامج كتبناه حتى الآن كانت أرقامه وبياناته مدونة مسبقاً داخل الكود. ولتشغيله بأرقام مختلفة، كان عليك فتح الملف وتعديل الكود يدوياً.

في البرمجيات الحقيقية، لا تسير الأمور هكذا. البرنامج يسأل والمستخدم يجيب.

في بايثون، وظيفة السؤال مخصصة لدالة input(). تعلمها لا يستغرق أكثر من دقيقة، لكنها تأتي مع قاعدة ذهبية يقع فيها كل مبرمج مبتدئ: أي قيمة تُرجعها input() هي دائماً نص (str) — حتى لو قام المستخدم بكتابة رقم صحيح. عدم معرفة هذه القاعدة كفيل بتعطيل أول برنامج حسابي تبنيه.

بنهاية هذه المهمة ستكون قادراً على

  • قراءة مدخلات المستخدم عبر دالة input() مع عرض سؤال واضح
  • فهم سبب كون المدخلات نصوصاً (str) دائماً
  • تحويل النصوص إلى أرقام عبر int() و float()
  • التمييز بين خطأ TypeError وخطأ ValueError
  • تنظيف المدخلات حتى لا تفسد المسافات الزائدة عمل برنامجك

المتطلبات المسبقة: التعامل مع النصوص — الفهرسة، التقطيع، ونصوص التنسيق.


كيف تعمل دالة input()

python
name = input("What is your name? ")
print(f"Hello, {name}!")

شغّل الكود:

text
What is your name? Rafi
Hello, Rafi!

حدثت ثلاثة أمور بالتسلسل: عرضت دالة input() السؤال المكتوب بين القوسين، ثم توقفت تماماً وانتظرت حتى يكتب المستخدم الإجابة ويضغط على زر Enter، ثم أرجعت ما كُتب وحفظناه في المتغير name.

هذه البرامج يجب تشغيلها داخل الطرفية. تتطلب دالة input() تدخلاً من المستخدم في سطر الأوامر، لذا شغل الملفات دائماً عبر python ask.py في طرفيتك المحلية.

مثال تطبيقي متكامل

bill.py:

python
# Ask for one order and print a small bill
print("--- Order entry ---")

customer = input("Customer name : ").strip().title()
item = input("Item          : ").strip()
quantity = int(input("Quantity      : "))
unit_price = float(input("Unit price    : "))

subtotal = quantity * unit_price
tax = subtotal * 0.05
total = subtotal + tax

print()
print("--- Bill ---")
print(f"Customer : {customer}")
print(f"Item     : {item} x {quantity}")
print(f"Subtotal : {subtotal:.2f}")
print(f"Tax (5%) : {tax:.2f}")
print(f"Total    : {total:.2f}")
text
--- Order entry ---
Customer name :   rafi ahmed
Item          : notebook
Quantity      : 4
Unit price    : 85.50

--- Bill ---
Customer : Rafi Ahmed
Item     : notebook x 4
Subtotal : 342.00
Tax (5%) : 17.10
Total    : 359.10

أربعة مدخلات بأربع معالجات مختلفة: تم تنظيف الاسم وتنسيق بدايات كلماته بحروف كبيرة، وتم تنظيف اسم السلعة فقط، بينما حُوّلت الكمية إلى عدد صحيح، والسعر إلى عدد عشري.


الأخطاء الشائعة وحلولها

خطأ TypeError: can only concatenate str (not "int") to str نسيت تحويل المدخلات إلى رقم. استخدم int(input(...)) أو float(input(...)).

بدلاً من الضرب تم تكرار النص ناتج "3" * 2 هو "33". القيمة لم يتم تحويلها إلى رقم صحيح int().

خطأ ValueError: invalid literal for int() with base 10 المستخدم أدخل قيمة ليست عدداً صحيحاً (مثل نص عادي أو رقم بكسر عشري). إذا كانت الكسور ممكنة، استخدم float().