قد تكتب كودًا بسيطًا في بايثون، ثم تفاجأ برسالة خطأ تقول:
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
السبب الأول: استخدام رقم داخل 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 مرات.
السبب الثاني: تمرير رقم إلى 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]
السبب الرابع: نسيان وضع الأرقام داخل قائمة
أحيانًا يكون سبب الخطأ بسيطًا جدًا: تريد التعامل مع مجموعة أرقام، لكنك خزّنت رقمًا واحدًا بدل قائمة.
مثال خاطئ:
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.
خطوات تشخيص الخطأ بسرعة
- اقرأ السطر الذي ظهر في رسالة الخطأ.
- ابحث عن مكان استخدام
forأوsum()أوlist()أو أي دالة تنتظر iterable. - اطبع نوع المتغير باستخدام
type(variable). - إذا كان النوع
int، اسأل نفسك: هل كنت أحتاج رقمًا واحدًا أم قائمة؟ - إذا كنت تريد تكرار عدد مرات، استخدم
range(number). - إذا كنت تريد مجموعة قيم، ضعها داخل قائمة مثل
[1, 2, 3]. - إذا كنت تريد تحويل رقم إلى أرقامه، استخدم
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] |
روابط داخلية مفيدة من بايثون العرب
- سلسلة مشكلة وحل في بايثون
- شرح القوائم Lists في بايثون للمبتدئين
- شرح الحلقات Loops في بايثون للمبتدئين
- حل خطأ TypeError: object is not subscriptable في بايثون
- كورس أساسيات بايثون للمبتدئين
الخلاصة
- خطأ
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 — توثيق بايثون الرسمي
- iter() — الدوال المدمجة في بايثون
- range() — الدوال المدمجة في بايثون
- sum() — الدوال المدمجة في بايثون
أسئلة شائعة
ما معنى 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.



