تحويل input إلى int وfloat بأمان في Python والتحقق من الإدخال | مشكلة وحل 18

تحويل input إلى int وfloat بأمان في Python والتحقق من الإدخال

عندما تستخدم input() في Python فإن القيمة التي تحصل عليها تكون نصًا. إذا كنت تنتظر عمرًا أو سعرًا أو درجة، فالمشكلة ليست فقط كيف تستخدم int() أو float()، بل كيف تمنع البرنامج من التوقف عندما يكتب المستخدم قيمة فارغة أو نصًا غير صالح.

في هذا الدرس من سلسلة مشكلة وحل على بايثون العرب سنركز على تحويل input إلى int وfloat بأمان والتحقق من الإدخال: الفرق بين النوعين، التعامل مع السالب والعشري، إعادة السؤال حتى تصبح القيمة صحيحة، ثم تحويل هذا المنطق إلى دوال قابلة لإعادة الاستخدام.

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

{getToc} $title={محتوى المقال}

{alertInfo} الطريقة العملية للتحقق من إدخال رقمي هي محاولة التحويل داخل try والتعامل مع ValueError. وإذا كان البرنامج يجب أن يستمر حتى يدخل المستخدم قيمة صحيحة، ضع ذلك داخل while True.

لماذا لا نستخدم int(input()) بدون تحقق؟

هذا السطر صحيح عندما يكتب المستخدم رقمًا صحيحًا:

age = int(input("أدخل عمرك: "))
print(age)

لكن أي إدخال غير قابل للتحويل إلى عدد صحيح سيوقف البرنامج. لذلك في البرامج التي تعتمد على المستخدم، من الأفضل فصل قراءة الإدخال عن التحقق منه أو تنفيذ التحويل داخل try/except.

التحقق من إدخال المستخدم قبل تحويله إلى int في Python

متى تستخدم int ومتى تستخدم float؟

استخدم int() عندما تريد عددًا صحيحًا فقط، واستخدم float() عندما تريد السماح بقيمة عشرية.

إدخال المستخدمint()float()الاختيار المناسب
"25"2525.0حسب المطلوب
"-25"-25-25.0كلاهما يقبل السالب
"12.5"غير صالح مباشرة12.5float()
""غير صالحغير صالحاطلب الإدخال من جديد
"abc"غير صالحغير صالحاطلب الإدخال من جديد
الفرق بين int وfloat عند تحويل input إلى رقم في Python

تحويل input إلى int بأمان باستخدام try except

إذا كنت تريد محاولة واحدة فقط، استخدم try وexcept ValueError:

try:
    age = int(input("أدخل عمرك: "))
    print("العمر:", age)
except ValueError:
    print("أدخل عددًا صحيحًا صالحًا")

بهذا الشكل لا ينهار البرنامج إذا كتب المستخدم نصًا أو ترك قيمة غير قابلة للتحويل.

تحويل input إلى float بأمان

الأسلوب نفسه يعمل مع الأرقام العشرية:

try:
    price = float(input("أدخل السعر: "))
    print("السعر:", price)
except ValueError:
    print("أدخل رقمًا صالحًا مثل 12 أو 12.5")

float() تقبل القيم الصحيحة والعشرية والسالبة، لذلك هي مناسبة عندما يكون الإدخال سعرًا أو وزنًا أو نسبة أو قياسًا.

ماذا عن المسافات وstrip()؟

لا تحتاج عادةً إلى strip() لمجرد وجود مسافات قبل الرقم أو بعده؛ int() وfloat() تتعاملان مع المسافات المحيطة بالنص. لكن strip() مفيدة عندما تريد اكتشاف أن المستخدم لم يكتب شيئًا سوى المسافات:

text = input("أدخل رقمًا: ").strip()

if not text:
    print("الإدخال فارغ")
else:
    try:
        number = float(text)
        print("الرقم:", number)
    except ValueError:
        print("الإدخال ليس رقمًا صالحًا")

هل السالب والعشري يحتاجان تحققًا خاصًا؟

لا، إذا كان النص نفسه مكتوبًا بصيغة رقمية صحيحة. مثلًا:

print(int("-25"))
print(float("-12.5"))
print(float("3.75"))
-25
-12.5
3.75

لذلك لا تحاول إزالة علامة السالب قبل التحويل. حدد فقط هل برنامجك يحتاج int أم float.

لماذا isdigit() ليست الحل العام؟

قد تبدو isdigit() طريقة سهلة للتحقق من أن النص رقمي، لكنها ليست مناسبة كحل عام لإدخال الأرقام:

القيمةisdigit()هل يمكن تحويلها إلى رقم؟
"25"Trueنعم
"-25"Falseنعم باستخدام int()
"12.5"Falseنعم باستخدام float()
"abc"Falseلا

إذا كان السؤال الحقيقي هو: «هل تستطيع Python تحويل هذه القيمة إلى رقم؟» فالأوضح غالبًا أن تحاول التحويل نفسه وتلتقط ValueError.

استخدام try except لتحويل input إلى رقم بأمان في Python

إعادة طلب الإدخال حتى يكتب المستخدم رقمًا صحيحًا

هذا هو النمط الذي تحتاجه في أغلب البرامج التفاعلية:

while True:
    try:
        age = int(input("أدخل عمرك: "))
        break
    except ValueError:
        print("إدخال غير صحيح، حاول مرة أخرى")

print("العمر المقبول:", age)

الحلقة تستمر فقط عندما يفشل التحويل. بمجرد نجاح int() يتم تنفيذ break.

الأفضل: دالة reusable لإدخال عدد صحيح

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

def read_int(prompt):
    while True:
        try:
            return int(input(prompt))
        except ValueError:
            print("أدخل عددًا صحيحًا صالحًا")


age = read_int("أدخل عمرك: ")
students = read_int("عدد الطلاب: ")

print(age, students)

ميزة هذه الطريقة أن أي جزء من البرنامج يستطيع طلب عدد صحيح آمن بسطر واحد فقط.

دالة قابلة لإعادة الاستخدام مع حد أدنى وأقصى

التحويل الصحيح لا يعني أن القيمة منطقية. العمر -500 عدد صحيح من ناحية Python، لكنه غير صالح كعمر. لذلك نفصل بين تحويل النوع والتحقق من نطاق القيمة:

def read_int(prompt, min_value=None, max_value=None):
    while True:
        try:
            value = int(input(prompt))
        except ValueError:
            print("أدخل عددًا صحيحًا صالحًا")
            continue

        if min_value is not None and value < min_value:
            print(f"يجب ألا تقل القيمة عن {min_value}")
            continue

        if max_value is not None and value > max_value:
            print(f"يجب ألا تزيد القيمة عن {max_value}")
            continue

        return value


age = read_int("أدخل عمرك: ", min_value=0, max_value=120)
print("العمر المقبول:", age)

دالة آمنة للأرقام العشرية

def read_float(prompt, min_value=None, max_value=None):
    while True:
        try:
            value = float(input(prompt))
        except ValueError:
            print("أدخل رقمًا صالحًا")
            continue

        if min_value is not None and value < min_value:
            print(f"يجب ألا تقل القيمة عن {min_value}")
            continue

        if max_value is not None and value > max_value:
            print(f"يجب ألا تزيد القيمة عن {max_value}")
            continue

        return value


price = read_float("أدخل السعر: ", min_value=0)
print("السعر المقبول:", price)

التحقق من الإدخال الفارغ قبل التحويل

إذا كان الإدخال الفارغ له معنى خاص في برنامجك، افحصه قبل التحويل:

text = input("أدخل الخصم أو اضغط Enter للتخطي: ").strip()

if text == "":
    discount = 0.0
else:
    try:
        discount = float(text)
    except ValueError:
        discount = 0.0
        print("القيمة غير صالحة، تم استخدام 0")

print("الخصم:", discount)
{alertWarning} لا تستخدم قيمة افتراضية بصمت إذا كان الخطأ مهمًا. في كثير من الحالات الأفضل إعادة السؤال بدل تحويل الإدخال الخاطئ إلى صفر بدون أن يعرف المستخدم.

هل نحذف الفواصل من أرقام مثل 1,000؟

لا تفعل ذلك تلقائيًا إلا إذا كانت صيغة الإدخال في برنامجك معروفة. النص "1,000" قد يعني ألفًا في تنسيق، وقد تعني الفاصلة جزءًا عشريًا في تنسيق محلي آخر. إذا قررت أن الفاصلة فاصل آلاف، يمكن تنظيفها صراحة:

text = "1,000"
number = int(text.replace(",", ""))
print(number)
1000

المهم أن يكون هذا قرارًا في تصميم الإدخال، وليس تنظيفًا عشوائيًا لكل نص.

جدول سريع: ما الطريقة المناسبة لكل حالة؟

الحالةالطريقة المناسبة
عدد صحيح مثل العمر أو الكميةint() داخل try/except
رقم عشري مثل السعر أو الوزنfloat() داخل try/except
يجب استمرار السؤال حتى النجاحwhile True + try/except
القيمة يجب أن تقع داخل نطاقتحويل أولًا ثم شرط min/max
تريد إعادة استخدام المنطقدالة مثل read_int() أو read_float()
أرقام سالبة أو عشريةلا تعتمد على isdigit() وحدها
حالات الإدخال الرقمي الصحيح والخاطئ في Python وطرق التحقق منها

مثال عملي كامل: إدخال درجة من 0 إلى 100

هذا المثال يجمع التحويل، إعادة السؤال، قبول الأعداد العشرية، والتحقق من النطاق:

def read_grade():
    while True:
        try:
            grade = float(input("أدخل الدرجة من 0 إلى 100: "))
        except ValueError:
            print("أدخل رقمًا صحيحًا أو عشريًا")
            continue

        if 0 <= grade <= 100:
            return grade

        print("الدرجة يجب أن تكون بين 0 و100")


grade = read_grade()
print("درجتك:", grade)

أخطاء شائعة عند التحقق من input

  • استخدام int(input()) مباشرة عندما يكون إدخال المستخدم غير مضمون.
  • استخدام isdigit() ثم اكتشاف أنها ترفض القيم السالبة والعشرية.
  • استخدام float() عندما يجب منع الكسور أصلًا.
  • التحقق من النوع فقط دون التحقق من النطاق، مثل قبول عمر سالب.
  • التقاط Exception عامة بدل ValueError المتوقع من التحويل.
  • تكرار نفس حلقة التحقق في عدة أماكن بدل إنشاء دالة صغيرة قابلة لإعادة الاستخدام.

ولشرح أوسع لتدفق الاستثناءات، راجع else وfinally وraise في Python وإدارة الاستثناءات.

أسئلة شائعة

كيف أتأكد أن input رقم في Python؟

حاول تحويل القيمة باستخدام int() أو float() داخل try. إذا حدث ValueError فالقيمة لا تطابق النوع الرقمي المطلوب.

كيف أجعل Python يعيد السؤال حتى يدخل المستخدم رقمًا صحيحًا؟

استخدم while True مع try/except ValueError، واخرج من الحلقة باستخدام break أو return بعد نجاح التحويل.

هل int يقبل الرقم السالب؟

نعم. نص مثل "-25" يمكن تحويله مباشرة باستخدام int().

كيف أتحقق من رقم عشري؟

حاول استخدام float() داخل try/except. هذه الطريقة تقبل أعدادًا صحيحة وعشرية وسالبة مكتوبة بصيغة رقمية صحيحة.

هل isdigit أفضل من try except؟

ليست أفضل كحل عام للتحويل الرقمي؛ فهي مفيدة لبعض النصوص الرقمية البسيطة، لكنها لا تمثل قواعد int() أو float() بالكامل، خصوصًا مع السالب والعشري.

مصادر رسمية للتوسع

الخلاصة

عند تحويل إدخال المستخدم إلى رقم في Python، لا تعتمد على أن المستخدم سيكتب قيمة صحيحة دائمًا. اختر int() للأعداد الصحيحة وfloat() للأعداد العشرية، ونفذ التحويل داخل try/except ValueError.

إذا كان البرنامج يجب أن يستمر حتى يحصل على قيمة صالحة، استخدم حلقة while، ثم انقل هذا المنطق إلى دالة مثل read_int() أو read_float() عندما تحتاجه أكثر من مرة.

{alertSuccess} القاعدة العملية: حوّل أولًا، التقط ValueError عند الفشل، ثم تحقق من نطاق القيمة بعد نجاح التحويل.

إرسال تعليق

أحدث أقدم