شرح Python enumerate: كيفية استخدام enumerate مع for loop لعرض الفهرس والقيم

دقائق القراءة: 4

ما هي دالة enumerate() في Python؟

عند كتابة الشيفرات بلغة Python، نحتاج أحيانًا إلى المرور على عناصر قائمة أو أي iterable مع عرض رقم العنصر الحالي في الوقت نفسه. هنا تظهر أهمية الدالة المضمنة enumerate()، إذ تتيح لك الحصول على الفهرس والقيمة معًا داخل for loop بطريقة نظيفة وعملية.

بدلًا من إنشاء عدّاد يدوي وتحديثه في كل دورة، تتولى enumerate() هذه المهمة تلقائيًا، ما يجعل الشيفرة أوضح ويقلل احتمالات الوقوع في الأخطاء المنطقية.

شرح دالة enumerate في Python مع استخدام for loop لعرض الفهرس والعناصر

لماذا نحتاج إلى الفهرسة أثناء التكرار على العناصر؟

في كثير من التطبيقات العملية، لا يكفي عرض العنصر نفسه فقط، بل تحتاج أيضًا إلى معرفة ترتيبه أثناء التكرار. على سبيل المثال:

  • ترقيم خطوات تنفيذ مهمة معينة.
  • عرض قائمة مرتبة للمستخدم.
  • معالجة العناصر بناءً على موقعها داخل القائمة.
  • تتبع النتائج أثناء الاختبار أو التصحيح.

لهذا السبب يستخدم المطورون الفهرسة مع الحلقات بشكل متكرر، وenumerate() تعد من أفضل الأدوات المدمجة لإنجاز ذلك في Python.

كيفية استخدام for loop بدون enumerate()

لفهم فائدة enumerate() بشكل أوضح، دعنا نبدأ بالطريقة التقليدية التي تعتمد على عدّاد يدوي.

في Python، يشير مصطلح iterable إلى أي كائن يمكن المرور على عناصره واحدًا تلو الآخر، مثل list وtuple وstring.

في المثال التالي، لدينا قائمة بأسماء كلاب ومتغير باسم count:

dogs = ['Harley', 'Phantom', 'Lucky', 'Dingo']
count = 1

يمكننا استخدام for loop للمرور على القائمة وطباعة كل اسم، مع زيادة قيمة count بمقدار 1 في كل مرة:

for name in dogs:
    print(count, name)
    count += 1

بهذه الطريقة سيظهر اسم كل عنصر مسبوقًا برقم ترتيبه.

ناتج استخدام for loop مع عداد يدوي في Python

ما مشكلة العدّاد اليدوي؟

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

dogs = ['Harley', 'Phantom', 'Lucky', 'Dingo']
count = 1

for name in dogs:
    print(count, name)

مثال يوضح خطأ نسيان زيادة العداد اليدوي في Python

في هذه الحالة، سيبقى الرقم ثابتًا ولن يعكس عدد مرات التكرار الفعلي. وهنا تتجلى فائدة enumerate()، لأنها تتولى إدارة العدّاد تلقائيًا دون الحاجة إلى تدخل يدوي.

الصيغة العامة لدالة enumerate()

توفر Python دالة مدمجة باسم enumerate() تستقبل iterable بالإضافة إلى وسيط اختياري لتحديد رقم البداية:

enumerate(iterable, start)

إذا لم تمرر قيمة start، فستبدأ الفهرسة افتراضيًا من 0.

ترجع الدالة كائنًا يمكن التكرار عليه، ويحتوي في كل دورة على زوج من القيم:

  • الفهرس الحالي أو رقم العدّاد.
  • العنصر الحالي داخل الـ iterable.

وهذا يعني أنك لست بحاجة إلى إنشاء متغير عدّاد يدوي أو تحديثه في كل مرة.

كيفية استخدام enumerate() مع for loop في Python

لنأخذ مثالًا عمليًا يوضح الفكرة. لنفترض أننا نريد عرض قائمة تعليمات اتجاهات مرتبة خطوة بخطوة. في البداية ننشئ قائمة directions:

directions = [
    'Head north on Broadway toward W 48th St',
    'Turn left onto W 58th St',
    'Turn right onto 8th Ave',
    'Turn left onto Broadway',
    'Turn left onto Lincoln Center Plaza',
    'Turn right onto Jaffe Dr',
    'Turn left onto Broadway',
    'Turn left onto W 65th St'
]

بعد ذلك نستخدم enumerate() داخل for loop. في هذا المثال نريد بدء الترقيم من 1 بدلًا من 0:

for count, direction in enumerate(directions, start=1):

داخل الحلقة، يمكننا طباعة كل من count وdirection:

print(count, direction)

وهذا هو المثال كاملًا:

directions = [
    'Head north on Broadway toward W 48th St',
    'Turn left onto W 58th St',
    'Turn right onto 8th Ave',
    'Turn left onto Broadway',
    'Turn left onto Lincoln Center Plaza',
    'Turn right onto Jaffe Dr',
    'Turn left onto Broadway',
    'Turn left onto W 65th St'
]

for count, direction in enumerate(directions, start=1):
    print(count, direction)

ناتج استخدام enumerate مع for loop في Python لعرض الترقيم والعناصر

كيف يعمل هذا المثال؟

في كل دورة من الحلقة:

  • تضع enumerate() رقم العنصر الحالي داخل المتغير count.
  • تضع قيمة العنصر نفسه داخل المتغير direction.
  • تزيد قيمة العدّاد تلقائيًا في الدورة التالية.

وهذا يجعل الشيفرة أكثر اختصارًا ووضوحًا من الاعتماد على عدّاد يدوي منفصل.

مقارنة بين العدّاد اليدوي وenumerate()

الأسلوب سهولة القراءة احتمال الخطأ الصيانة
العدّاد اليدوي متوسطة مرتفع نسبيًا أقل مرونة
enumerate() مرتفعة منخفض أسهل في التعديل والفهم

إذا كنت تريد كتابة شيفرة Python احترافية وقابلة للصيانة، فمن الأفضل غالبًا استخدام enumerate() بدلًا من بناء عدّاد يدوي متكرر.

مزايا استخدام enumerate() في مشاريع Python

  • تقليل الأخطاء الناتجة عن نسيان زيادة العدّاد.
  • جعل الشيفرة أكثر وضوحًا للمطورين الآخرين.
  • اختصار عدد الأسطر المطلوبة لتنفيذ المهمة.
  • الاستفادة من أسلوب Pythonic في كتابة الحلقات.
  • إمكانية تخصيص نقطة بداية العدّاد باستخدام start.

متى تستخدم enumerate()؟

يفضل استخدام enumerate() عندما تحتاج إلى:

  1. الوصول إلى العنصر وفهرسه في الوقت نفسه.
  2. طباعة عناصر قائمة مع أرقامها.
  3. تنفيذ منطق يعتمد على ترتيب العنصر داخل الحلقة.
  4. الحفاظ على شيفرة نظيفة وسهلة الفهم.

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

خلاصة استخدام enumerate() في Python

يمكنك استخدام enumerate() مع for loop لطباعة عناصر أي iterable مع عدّاد تلقائي ودقيق. وتستقبل هذه الدالة عنصرين أساسيين: الكائن القابل للتكرار، وقيمة بداية اختيارية.

enumerate(iterable, start)

إذا لم تحدد قيمة start، فسيبدأ العد من 0. أما إذا كنت تريد عرض الترقيم للمستخدم بشكل طبيعي، فمن الشائع اختيار start=1.

مقارنةً بالعدّاد اليدوي، توفر enumerate() طريقة أكثر أمانًا وأناقة، لأنها تحدث قيمة الفهرس تلقائيًا وتقلل احتمال الخطأ.

الخلاصة التقنية

من الناحية العملية، تعد enumerate() واحدة من الأدوات الأساسية التي تعكس فلسفة Python في كتابة شيفرة واضحة ومختصرة. وعندما تحتاج إلى الجمع بين القيمة والفهرس داخل for loop، فإن استخدامها ليس مجرد تحسين شكلي، بل خطوة مهمة نحو شيفرة أقل عرضة للأخطاء وأكثر قابلية للصيانة في التطبيقات الحقيقية.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *