الإدخال والإخراج في بايثون: اجعل برنامجك يتكلّم ويسمع

تعلّم قراءة ما يكتبه المستخدم بـ input()، وتحويله إلى رقم بـ int() و float()، وطباعة النتائج بشكل مرتّب باستخدام print() و sep و end.

كل البرامج التي كتبتها حتى الآن تعرف كل شيء مسبقًا: الاسم مكتوب في الكود، والنقاط مكتوبة في الكود. لكن الألعاب الحقيقية تسألك عن اسمك، والآلة الحاسبة تنتظر منك الأرقام. في هذا الدرس ستتعلّم كيف يسمع برنامجك ما تكتبه، وكيف يردّ عليك بشكل مرتّب.

🎯 ماذا ستتعلم؟

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

  • قراءة ما يكتبه المستخدم باستخدام input().
  • تحويل النص الذي يكتبه المستخدم إلى رقم بـ int() و float().
  • قراءة عدة أرقام مكتوبة في سطر واحد.
  • التحكم في شكل الطباعة باستخدام sep و end.
  • طباعة الأرقام والنصوص في جملة واحدة مرتّبة.

🧰 ماذا تحتاج قبل أن تبدأ؟

يجب أن تعرف المتغيّرات والفرق بين النص والرقم، وقد شرحناهما في المتغيّرات وأنواع البيانات. ويفيدك أن تكون قرأت درس تنسيق النصوص. كل الأمثلة تعمل في مترجم بايثون في المتصفح، وهو يدعم input() بدون أي تثبيت.

الفكرة ببساطة

تخيّل أنك تطلب طعامًا من مطعم. النادل يسألك: “ماذا تريد؟” وينتظر. أنت تجيب، والنادل يكتب طلبك في ورقة، ثم يعود إليك بالطعام في طبق مرتّب.

برنامجك يعمل بالطريقة نفسها. الإدخال (input) هو اللحظة التي يسأل فيها البرنامج وينتظر إجابتك. الإخراج (output) هو ما يعرضه لك البرنامج على الشاشة. ودالة print() التي تعرفها هي طريقتنا في الإخراج.

الشيء المهم هنا: النادل يكتب كل شيء في ورقته ككلمات، حتى الأرقام. وبرنامجك يفعل الشيء نفسه، وستعرف بعد قليل لماذا هذا مهم.

الخطوة 1: اسأل المستخدم بـ input()

الدالة input() توقف البرنامج وتنتظر أن تكتب شيئًا ثم تضغط Enter. ما تكتبه يُحفظ في متغيّر. ويمكنك أن تضع سؤالًا بين القوسين ليظهر للمستخدم قبل أن يكتب.

هذا المثال تفاعلي، فجرّبه في مترجم بايثون في المتصفح:

# 👉 جرّب هذا في مترجم بايثون في المتصفح، فهو يدعم input()
name = input("ما اسمك؟ ")
print("أهلًا بك يا", name)

ما اسمك؟ سالم
أهلًا بك يا سالم

السطر الأول يعرض السؤال وينتظر. كتب المستخدم “سالم” وضغط Enter، فحُفظ الاسم في name. ثم طبعنا الترحيب.

لاحظ المسافة في نهاية السؤال "ما اسمك؟ ". بدونها ستلتصق إجابة المستخدم بعلامة الاستفهام.

الخطوة 2: كل ما يكتبه المستخدم نصّ

هنا المفاجأة التي تربك المبتدئين. حتى لو كتب المستخدم الرقم 15، فإن input() تعيده نصًّا (string) وليس رقمًا. أي أنك تحصل على "15" بين علامتي تنصيص.

لنرَ ما يحدث عندما نتعامل مع النص كأنه رقم. سنحفظ القيمة في متغيّر ثابت لتجربة الفكرة:

❌ هذا الكود يتوقف بخطأ
age = "15"
print(age + 1)

TypeError: can only concatenate str (not "int") to str

بايثون تقول: لا أستطيع أن أجمع نصًّا مع رقم. الحل هو التحويل (conversion): نحوّل النص إلى رقم صحيح بـ int()، أو إلى رقم عشري بـ float().

# ✅ نحوّل النص إلى رقم قبل الجمع
age = "15"
age = int(age)
print(age + 1)
16

الآن age صار رقمًا حقيقيًا، والجمع يعمل. الطريقة نفسها تعمل مع input()، ويمكنك التحويل في السطر نفسه:

# 👉 جرّب هذا في مترجم بايثون في المتصفح، فهو يدعم input()
age = int(input("كم عمرك؟ "))
print("بعد سنة سيكون عمرك", age + 1)

كم عمرك؟ 15
بعد سنة سيكون عمرك 16

وإذا كان الرقم عشريًا، مثل درجة حرارة، استخدم float():

temp = "36.6"
temp = float(temp)
print(temp + 0.4)
37.0

🚀 للمتقدمين: إذا كتب المستخدم كلمة بدل رقم، فإن int() تتوقف بخطأ ValueError. جرّب في المترجم: int("خمسة"). في درس التعامل مع الأخطاء ستتعلّم كيف تحمي برنامجك بـ try و except.

الخطوة 3: عدة أرقام في سطر واحد

ماذا لو أردت من المستخدم أن يكتب ثلاث درجات في سطر واحد، مثل 90 85 77؟ input() تعطيك نصًّا واحدًا طويلًا. الحل هو الدالة split() التي تقصّ النص عند كل مسافة وتعطيك قائمة.

line = "90 85 77"
parts = line.split()
print(parts)
['90', '85', '77']

لاحظ أن العناصر ما زالت نصوصًا. نحوّل كل عنصر بحلقة for ونجمعها:

line = "90 85 77"
parts = line.split()
total = 0
for part in parts:
    total = total + int(part)
print("مجموع الدرجات:", total)
مجموع الدرجات: 252

🚀 للمتقدمين: يمكنك تحويل كل العناصر في سطر واحد بـ map(): اكتب a, b, c = map(int, "90 85 77".split()). هذا يحوّل كل نص إلى رقم ويضعه في متغيّر مستقل.

الخطوة 4: تحكّم في شكل الطباعة بـ sep و end

عندما تعطي print() عدة أشياء مفصولة بفاصلة، تضع بينها مسافة. يمكنك تغيير هذا الفاصل بالخيار sep، وهو اختصار لكلمة separator أي “الفاصل”.

day = 24
month = 9
year = 2026
print(day, month, year)
print(day, month, year, sep="/")
print(day, month, year, sep=" - ")
24 9 2026
24/9/2026
24 - 9 - 2026

كما لاحظت، print() تنزل إلى سطر جديد بعد كل طباعة. الخيار end يغيّر ما يُكتب في النهاية. هنا نطبع العدّ التنازلي في سطر واحد:

print("3", end=" ")
print("2", end=" ")
print("1", end=" ")
print("انطلق!")
3 2 1 انطلق!

لولا end=" " لظهر كل رقم في سطر مستقل. والطباعة الأخيرة بدون end، فتنزل إلى سطر جديد كالمعتاد.

الخطوة 5: اطبع جملة مرتّبة فيها أرقام

كثيرًا ما تريد أن تدمج اسمًا ورقمًا في جملة واحدة. أسهل طريقة هي النص المنسّق (f-string): تضع الحرف f قبل علامة التنصيص، وتكتب المتغيّر بين قوسين معقوفين { }.

player = "نورة"
score = 1250
level = 7
print(f"اللاعبة {player} في المستوى {level} ومعها {score} نقطة")
اللاعبة نورة في المستوى 7 ومعها 1250 نقطة

ويمكنك التحكم في عدد الأرقام بعد الفاصلة العشرية. اكتب :.2f بعد اسم المتغيّر لتظهر خانتان فقط:

price = 7.5
count = 3
total = price * count / 7
print(f"سعر القطعة الواحدة: {total:.2f} ريال")
سعر القطعة الواحدة: 3.21 ريال

بدون :.2f كانت ستظهر النتيجة بأرقام كثيرة بعد الفاصلة. هذا مفيد جدًا مع الأسعار والمعدّلات.

⚠️ أخطاء شائعة

هذه الأخطاء يقع فيها الجميع في البداية، وفهمها جزء من التعلّم:

1. نسيان التحويل قبل الحساب

❌
score = input("كم نقطة جمعت؟ ")
print(score * 2)

كم نقطة جمعت؟ 10
1010

لا يوجد خطأ ظاهر، لكن النتيجة غريبة. بايثون كرّرت النص “10” مرتين بدل أن تضاعف الرقم. حوّل النص إلى رقم أولًا:

# ✅
score = "10"
score = int(score)
print(score * 2)
20

2. تحويل نص فيه فاصلة عشرية بـ int()

❌
height = int("1.75")

ValueError: invalid literal for int() with base 10: '1.75'

الدالة int() تقبل الأعداد الصحيحة فقط. إذا كان في النص فاصلة عشرية، استخدم float():

# ✅
height = float("1.75")
print(height)
1.75

3. الخلط بين sep و end

❌
print("أحمد", "سارة", end=", ")
print("خالد")

أحمد سارة, خالد

الكود يعمل لكن الفاصلة ظهرت في المكان الخطأ. تذكّر: sep يفصل بين العناصر داخل الطباعة الواحدة، و end يُكتب بعد انتهائها:

# ✅
print("أحمد", "سارة", "خالد", sep=", ")
أحمد, سارة, خالد

🧪 جرّب بنفسك

في التحديات التالية وضعنا القيمة في متغيّر ثابت ليعمل الكود مباشرة. بعد أن تنجح، افتح مترجم بايثون في المتصفح واستبدل السطر الأول بـ input() ليصبح البرنامج تفاعليًا.

التحدي 1: بطاقة ترحيب

عندك اسم المستخدم ومدينته. اطبع جملة ترحيب واحدة تجمع الاثنين باستخدام f-string.

name = "ريم"
city = "جدة"
# اطبع: أهلًا يا ريم من مدينة جدة
print(name)
ريم
💡 اضغط لرؤية الحل
name = "ريم"
city = "جدة"
print(f"أهلًا يا {name} من مدينة {city}")
أهلًا يا ريم من مدينة جدة

التحدي 2: كم سنة تبقّت؟

المستخدم كتب عمره كنصّ. حوّله إلى رقم، ثم احسب كم سنة تبقّت حتى يبلغ 18، واطبع النتيجة في جملة.

age_text = "13"
# حوّل النص إلى رقم واحسب السنوات المتبقية حتى 18
print(age_text)
13
💡 اضغط لرؤية الحل
age_text = "13"
age = int(age_text)
remaining = 18 - age
print(f"تبقّت لك {remaining} سنوات حتى تبلغ 18")
تبقّت لك 5 سنوات حتى تبلغ 18

التحدي 3: معدّل الدرجات

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

line = "88 92 79 95"
# قصّ النص، اجمع الدرجات، ثم اطبع المعدّل بخانتين عشريتين
print(line)
88 92 79 95
💡 اضغط لرؤية الحل
line = "88 92 79 95"
parts = line.split()
total = 0
for part in parts:
    total = total + int(part)
average = total / len(parts)
print(f"المعدّل: {average:.2f}")
المعدّل: 88.50

✅ اختبر نفسك

  1. المستخدم كتب 25 عندما سأله input(). ما نوع القيمة التي حصل عليها البرنامج؟

    • أ) رقم صحيح int
    • ب) نصّ str
    • ج) رقم عشري float
  2. ماذا يطبع print("أ", "ب", "ج", sep="-")؟

    • أ) أ ب ج
    • ب) أ-ب-ج
    • ج) أ, ب, ج
  3. صح أم خطأ: int("3.5") يعطي الرقم 3.

💡 اضغط لرؤية الإجابات
  1. ب) نصّ str. الدالة input() تعيد نصًّا دائمًا، حتى لو كتب المستخدم أرقامًا.
  2. ب) أ-ب-ج، لأن sep يحدد الفاصل بين العناصر.
  3. خطأ. int() لا تقبل نصًّا فيه فاصلة عشرية، وسيتوقف البرنامج بخطأ ValueError. استخدم float().

📝 الخلاصة

  • input() توقف البرنامج وتنتظر ما يكتبه المستخدم، وتعيده نصًّا دائمًا.
  • حوّل النص إلى رقم بـ int() للأعداد الصحيحة أو float() للأعداد العشرية.
  • split() تقصّ سطرًا فيه عدة قيم إلى قائمة، ثم تحوّل كل عنصر بحلقة.
  • sep يغيّر الفاصل بين عناصر print()، و end يغيّر ما يُكتب بعدها.
  • النص المنسّق f-string يدمج المتغيّرات في جملة، و :.2f يضبط الخانات العشرية.

⏭️ الخطوة التالية

صار برنامجك الآن يسمع ويتكلّم، وهذه هي اللبنة الأخيرة لبناء برامج حقيقية. افتح مترجم بايثون في المتصفح وابنِ مشروعًا صغيرًا يجمع كل ما تعلّمته: آلة حاسبة تسأل عن رقمين وعملية، أو لعبة أسئلة تحسب نقاطك، أو برنامج يحسب معدّل درجاتك ويخبرك بالتقدير. ابدأ بسيطًا، ثم أضف ميزة جديدة كل يوم.