مشكلة وحل 24: حل خطأ TypeError: 'int' object is not iterable في بايثون للمبتدئين

حل خطأ TypeError int object is not iterable في بايثون للمبتدئين

قد تكتب كودًا بسيطًا في بايثون، ثم تفاجأ برسالة خطأ تقول:

TypeError: 'int' object is not iterable

هذا الخطأ يظهر عادة عندما تتعامل مع رقم صحيح int وكأنه مجموعة عناصر يمكن المرور عليها. مثلًا: تحاول استخدام الرقم داخل حلقة for، أو تمرره إلى دالة تنتظر قائمة أو نصًا أو أي كائن قابل للتكرار.

في هذا المقال من سلسلة مشكلة وحل سنشرح معنى الخطأ ببساطة، وما معنى iterable، ولماذا الرقم int ليس قابلًا للتكرار، ثم نعرض أشهر الحالات التي تسبب الخطأ مع الحل الصحيح لكل حالة.

{alertInfo} الفكرة ببساطة: الخطأ TypeError: 'int' object is not iterable يعني أنك تحاول المرور على رقم صحيح وكأنه قائمة أو نص. الرقم يمثل قيمة واحدة فقط، وليس مجموعة عناصر يمكن تكرارها داخل for.

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

ما معنى TypeError: 'int' object is not iterable؟

لفهم الرسالة، قسمها إلى ثلاثة أجزاء:

  • TypeError: استخدمت نوع بيانات بطريقة غير مناسبة.
  • int object: الكائن الذي سبب المشكلة هو رقم صحيح.
  • is not iterable: هذا الرقم لا يمكن المرور عليه عنصرًا عنصرًا.

في بايثون، بعض الكائنات يمكن تكرارها مثل:

  • القوائم list
  • النصوص str
  • الصفوف tuple
  • المجموعات set
  • القواميس dict
  • الكائنات الناتجة من range()

لكن الرقم الصحيح int ليس مجموعة عناصر، بل قيمة واحدة، لذلك لا يمكنك أن تطلب من بايثون المرور على الرقم كما تمر على القائمة.

ما معنى iterable في بايثون؟

كلمة iterable تعني كائنًا يمكن المرور عليه عنصرًا بعد عنصر. أبسط مثال هو القائمة:

numbers = [10, 20, 30]

for number in numbers:
    print(number)

الناتج:

10
20
30

هنا numbers تحتوي على أكثر من عنصر، لذلك يمكن لـ for المرور عليها.

أما الرقم:

number = 10

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

for item in number:
    print(item)

سيظهر الخطأ:

TypeError: 'int' object is not iterable
الفرق بين iterable والرقم int في بايثون

السبب الأول: استخدام رقم داخل for loop

هذه أكثر حالة شائعة:

count = 5

for i in count:
    print(i)

الخطأ هنا أن count رقم صحيح، وليس قائمة أو نطاقًا. إذا كنت تريد تكرار الأمر 5 مرات، استخدم range():

count = 5

for i in range(count):
    print(i)

الناتج:

0
1
2
3
4

لاحظ أن range(5) تعطي تسلسلًا يبدأ من 0 وينتهي قبل 5.

متى أستخدم range ومتى أستخدم list؟

استخدم range() عندما تريد التكرار بعدد مرات معين:

for i in range(3):
    print("مرحبًا")

واستخدم القائمة عندما تريد المرور على عناصر موجودة فعلًا:

students = ["Ali", "Sara", "Omar"]

for student in students:
    print(student)
الحالة الاختيار الصحيح
أريد تنفيذ كود 10 مرات range(10)
أريد المرور على أسماء الطلاب for student in students
أريد المرور على فهارس القائمة range(len(items)) عند الحاجة فقط
أريد الفهرس والعنصر معًا enumerate(items)
{alertWarning} خطأ شائع: لا تكتب for i in 5. الرقم 5 ليس iterable. اكتب for i in range(5) إذا كنت تريد تكرار الحلقة 5 مرات.
سبب ظهور خطأ int object is not iterable داخل for loop في بايثون

السبب الثاني: تمرير رقم إلى sum بدل قائمة

الدالة sum() تتوقع كائنًا قابلًا للتكرار مثل قائمة أرقام. لذلك هذا الكود صحيح:

numbers = [10, 20, 30]

print(sum(numbers))

الناتج:

60

لكن هذا الكود خطأ:

number = 10

print(sum(number))

لأن number رقم واحد فقط، وليس قائمة أرقام.

الحل يعتمد على قصدك:

إذا كان لديك رقم واحد فقط

لا تحتاج إلى sum() أصلًا:

number = 10

print(number)

إذا كنت تريد جمع عدة أرقام

ضع الأرقام داخل قائمة:

numbers = [10, 20, 30]

print(sum(numbers))

السبب الثالث: تمرير رقم إلى list

الدالة list() تحول كائنًا قابلًا للتكرار إلى قائمة. لذلك هذا الكود صحيح مع النص:

text = "بايثون"

print(list(text))

الناتج:

['ب', 'ا', 'ي', 'ث', 'و', 'ن']

لكن هذا الكود خطأ:

number = 123

print(list(number))

لأن الرقم 123 ليس iterable.

إذا كنت تريد قائمة تحتوي على الرقم نفسه، اكتب:

number = 123

print([number])

الناتج:

[123]

أما إذا كنت تريد تحويل أرقام العدد إلى عناصر منفصلة، حوّله أولًا إلى نص:

number = 123

digits = list(str(number))

print(digits)

الناتج:

['1', '2', '3']

وإذا أردتها أرقامًا صحيحة بدل نصوص:

number = 123

digits = [int(digit) for digit in str(number)]

print(digits)

الناتج:

[1, 2, 3]
حل خطأ تمرير رقم int إلى sum أو list في بايثون

السبب الرابع: نسيان وضع الأرقام داخل قائمة

أحيانًا يكون سبب الخطأ بسيطًا جدًا: تريد التعامل مع مجموعة أرقام، لكنك خزّنت رقمًا واحدًا بدل قائمة.

مثال خاطئ:

scores = 90

for score in scores:
    print(score)

الصحيح إذا كانت هناك عدة درجات:

scores = [90, 85, 70]

for score in scores:
    print(score)

والصحيح إذا كانت درجة واحدة فقط:

score = 90

print(score)

السبب الخامس: تغيير نوع المتغير بالخطأ

قد يبدأ المتغير كقائمة، ثم تعيد تعيينه إلى رقم دون أن تنتبه.

مثال:

numbers = [10, 20, 30]

# خطأ: هنا غيّرنا numbers من قائمة إلى رقم
numbers = 5

for number in numbers:
    print(number)

سيظهر الخطأ لأن numbers لم تعد قائمة. أصبحت رقمًا صحيحًا.

للتأكد من نوع المتغير، استخدم type() أثناء التشخيص:

numbers = 5

print(type(numbers))

الناتج:

<class 'int'>

إذا كنت تتوقع أن يكون المتغير قائمة، فهذا يعني أن هناك سطرًا سابقًا غيّر نوعه.

كيف تفحص هل الكائن iterable؟

للمبتدئين، يكفي أن تتذكر أن القائمة والنص وrange() قابلة للتكرار، بينما الرقم int ليس كذلك.

لكن عند التشخيص، يمكنك تجربة iter() داخل try/except:

def is_iterable(value):
    try:
        iter(value)
        return True
    except TypeError:
        return False

print(is_iterable([1, 2, 3]))
print(is_iterable(10))
print(is_iterable("بايثون"))

الناتج:

True
False
True

هذا المثال ليس ضروريًا في كل كود، لكنه مفيد لفهم الفكرة: الشيء iterable هو الشيء الذي يمكن استخدام iter() معه.

حلول سريعة حسب سبب الخطأ

الكود الخاطئ السبب الحل الصحيح
for i in 5 الرقم ليس iterable for i in range(5)
sum(10) sum تنتظر كائنًا قابلًا للتكرار sum([10]) أو لا تستخدم sum
list(123) الرقم ليس قابلًا للتحويل مباشرة إلى قائمة [123] أو list(str(123))
for x in scores مع scores = 90 المتغير رقم وليس قائمة scores = [90] أو اطبع الرقم مباشرة

مثال عملي: طباعة درجات الطلاب

لنفترض أنك تريد طباعة درجات الطلاب. إذا كتبت:

scores = 85

for score in scores:
    print(score)

سيظهر الخطأ لأن scores رقم واحد.

إذا كان لديك طالب واحد فقط:

score = 85

print(score)

أما إذا كان لديك أكثر من طالب:

scores = [85, 92, 78]

for score in scores:
    print(score)

مثال عملي: حساب مجموع الأرقام من 1 إلى رقم معين

قد يكتب المبتدئ:

number = 5

print(sum(number))

وهذا يسبب الخطأ. إذا كنت تريد جمع الأرقام من 1 إلى 5، استخدم range():

number = 5

total = sum(range(1, number + 1))

print(total)

الناتج:

15

لأن range(1, 6) يمثل الأرقام: 1 و2 و3 و4 و5.

حلول شائعة لخطأ TypeError int object is not iterable في بايثون

خطوات تشخيص الخطأ بسرعة

  1. اقرأ السطر الذي ظهر في رسالة الخطأ.
  2. ابحث عن مكان استخدام for أو sum() أو list() أو أي دالة تنتظر iterable.
  3. اطبع نوع المتغير باستخدام type(variable).
  4. إذا كان النوع int، اسأل نفسك: هل كنت أحتاج رقمًا واحدًا أم قائمة؟
  5. إذا كنت تريد تكرار عدد مرات، استخدم range(number).
  6. إذا كنت تريد مجموعة قيم، ضعها داخل قائمة مثل [1, 2, 3].
  7. إذا كنت تريد تحويل رقم إلى أرقامه، استخدم str(number) أولًا.

أخطاء قريبة من هذا الخطأ

الخطأ المعنى مثال
TypeError: 'int' object is not iterable تحاول المرور على رقم صحيح. for i in 5
TypeError: 'NoneType' object is not iterable تحاول المرور على قيمة None. for x in result عندما تكون result = None
TypeError: 'float' object is not iterable تحاول المرور على رقم عشري. for x in 3.5
TypeError: object is not subscriptable تحاول استخدام الفهرسة مع كائن لا يدعمها. number[0]

روابط داخلية مفيدة من بايثون العرب

الخلاصة

  • خطأ TypeError: 'int' object is not iterable يعني أنك تعاملت مع رقم وكأنه مجموعة عناصر.
  • الرقم int ليس قابلًا للتكرار داخل for.
  • إذا أردت التكرار عدد مرات، استخدم range().
  • إذا أردت المرور على مجموعة أرقام، ضعها داخل قائمة.
  • إذا أردت استخدام sum()، مرر لها قائمة أو range() أو أي iterable مناسب.
  • إذا أردت تحويل رقم إلى قائمة تحتوي على الرقم نفسه، استخدم [number].
  • إذا أردت تحويل رقم إلى أرقامه، استخدم list(str(number)) أو List Comprehension.
{alertSuccess} قاعدة ذهبية: قبل كتابة for x in variable اسأل نفسك: هل variable يحتوي على عناصر متعددة؟ إذا كان رقمًا واحدًا، فلن يعمل. استخدم range() أو قائمة حسب هدفك.

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

أسئلة شائعة

ما معنى TypeError: 'int' object is not iterable؟

يعني أنك حاولت استخدام رقم صحيح int في مكان يحتاج كائنًا قابلًا للتكرار، مثل قائمة أو نص أو range().

لماذا لا يعمل for i in 5؟

لأن الرقم 5 ليس تسلسلًا من العناصر. إذا أردت تنفيذ الحلقة 5 مرات، اكتب for i in range(5).

كيف أجعل رقمًا واحدًا داخل قائمة؟

اكتب الرقم بين أقواس مربعة مثل [number]. هذا ينشئ قائمة تحتوي على عنصر واحد.

كيف أحول الرقم 123 إلى قائمة أرقام؟

حوّله أولًا إلى نص ثم مر على أرقامه: [int(digit) for digit in str(123)]، وستحصل على [1, 2, 3].

ما الفرق بين int و iterable؟

int يمثل رقمًا واحدًا، أما iterable فهو كائن يحتوي على عناصر يمكن المرور عليها مثل list وstr وrange.

إرسال تعليق

أحدث أقدم