كيفية استخدام دوال التكرار المدمجة في Python بفعالية
مقدمة إلى دوال التكرار المدمجة في Python
عند التعامل مع عناصر متسلسلة في Python مثل list وtuple وstring وdictionary، قد يصبح الكود أكثر تعقيداً إذا اعتمدت على متغيرات إضافية أو منطق تكرار مطوّل. لهذا توفّر Python مجموعة من الدوال المدمجة التي تساعدك على كتابة كود أقصر وأكثر وضوحاً وأسهل في الصيانة.
في هذا الدليل، سنتعرف على أبرز دوال التكرار المدمجة في Python، وكيفية استخدامها عملياً من خلال أمثلة مباشرة تساعدك على فهم سلوك كل دالة واختيار الأنسب منها حسب الحالة.

استخدام الدالة enumerate() أثناء التكرار في Python
تُستخدم الدالة enumerate() عندما تحتاج إلى المرور على عناصر تسلسل معيّن مع الاحتفاظ برقم الفهرس لكل عنصر في الوقت نفسه. وهي مفيدة جداً عند الرغبة في تجنب إنشاء عدّاد يدوي داخل الحلقة.
صيغة الدالة enumerate()
enumerate(iterable, start)
تتكون الدالة من وسيطين:
iterable: أي كائن قابل للتكرار مثلlistأوtupleأوstringأوdictionary.start: قيمة البداية للعدّاد، والقيمة الافتراضية هي0.
شكل المخرجات
Output [(0, item_1), (1, item_2), (2, item_3), ..., (n, item_n)]
كما نلاحظ، تُعيد الدالة أزواجاً تحتوي على الفهرس والعنصر المقابل له.
مثال على enumerate() بالقيمة الافتراضية للفهرس
colour = ["Black", "Purple", "Brown", "Yellow", "Blue"]
list(enumerate(colour))
Output: [(0, 'Black'), (1, 'Purple'), (2, 'Brown'), (3, 'Yellow'), (4, 'Blue')]
هنا يبدأ الترقيم من 0 لأننا لم نمرر قيمة للوسيط start.
مثال على enumerate() مع تحديد بداية مخصصة
colour = ["Black", "Purple", "Brown", "Yellow", "Blue"]
list(enumerate(colour, 10))
Output: [(10, 'Black'), (11, 'Purple'), (12, 'Brown'), (13, 'Yellow'), (14, 'Blue')]
في هذا المثال بدأ العدّاد من 10 بدلاً من الصفر.
ماذا يحدث إذا لم تحوّل الناتج إلى list؟
colour = ["Black", "Purple", "Brown", "Yellow", "Blue"]
enumerate(colour)
Output: <enumerate object at 0x7f6a97ad7c40>
الدالة enumerate() تُرجع كائناً قابلاً للتكرار، لذلك غالباً ما نستخدم list() لعرض الناتج كاملاً أثناء التعلم أو الاختبار.
استخدام enumerate() مع dictionary
colour = {"Black": 0, "Purple": 2, "Brown": 4, "Yellow": 9, "Blue": 1}
list(enumerate(colour))
Output: [(0, 'Black'), (1, 'Purple'), (2, 'Brown'), (3, 'Yellow'), (4, 'Blue')]
عند التكرار على dictionary مباشرة، يتم المرور على المفاتيح فقط دون القيم.
الحصول على المفاتيح والقيم باستخدام items()
إذا كنت تريد التكرار على المفاتيح والقيم معاً، فاستخدم items().
colour = {"Black": 0, "Purple": 2, "Brown": 4, "Yellow": 9, "Blue": 1}
list(enumerate(colour.items()))
Output: [(0, ('Black', 0)), (1, ('Purple', 2)), (2, ('Brown', 4)), (3, ('Yellow', 9)), (4, ('Blue', 1))]
ويمكنك استخدامها داخل حلقة for بهذه الطريقة:
colour = {"Black": 0, "Purple": 2, "Brown": 4, "Yellow": 9, "Blue": 1}
for ind, (keys, value) in enumerate(colour.items()):
print(ind, keys, value)
Output:
0 Black 0
1 Purple 2
2 Brown 4
3 Yellow 9
4 Blue 1
الحصول على القيم فقط باستخدام values()
colour = {"Black": 0, "Purple": 2, "Brown": 4, "Yellow": 9, "Blue": 1}
list(enumerate(colour.values()))
Output: [(0, 0), (1, 2), (2, 4), (3, 9), (4, 1)]
ومع حلقة for:
colour = {"Black": 0, "Purple": 2, "Brown": 4, "Yellow": 9, "Blue": 1}
for ind, value in enumerate(colour.values()):
print(ind, value)
Output:
0 0
1 2
2 4
3 9
4 1
في هذه الحالة ستحصل على القيم فقط دون المفاتيح.
استخدام الدالة zip() لدمج أكثر من تسلسل في Python
الدالة zip() من أكثر الأدوات العملية في Python، إذ تسمح لك بدمج عدة كائنات قابلة للتكرار بناءً على الفهرس نفسه، ثم تُعيد كائناً يمكن التكرار عليه.
صيغة الدالة zip()
zip(*iterables)
أو:
zip(iterator1, iterator2, ...)
يمكن أن تكون العناصر الممررة من نوع list أو tuple أو string أو set أو dictionary.
مثال أساسي على zip()
color = ["Blue", "Orange", "Brown", "Red"]
code = [20, 10, 56, 84]
list(zip(color, code))
Output: [('Blue', 20), ('Orange', 10), ('Brown', 56), ('Red', 84)]
هنا تم دمج القائمتين في أزواج مرتبطة بحسب مواقع العناصر.
ماذا لو كانت الأطوال مختلفة؟
color = ["Blue", "Orange", "Brown"]
code = [20, 10, 56, 84]
list(zip(color, code))
Output: [('Blue', 20), ('Orange', 10), ('Brown', 56)]
تتوقف zip() عند نهاية أقصر تسلسل، لذلك يتم تجاهل القيم الزائدة في التسلسل الأطول.
استخدام strict=True في Python 3.10
في Python 3.10 أُضيف الوسيط strict=True للتحقق من تساوي أطوال العناصر الممررة. إذا كان هناك اختلاف، سيظهر خطأ واضح.
color = ("Blue", "Orange", "Brown", "Purple")
code = (20, 10, 56)
for col, cod in zip(color, code, strict=True):
print(col, cod)
Output:
Blue 20
Orange 10
Brown 56
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
for col, cod in zip(color, code, strict=True):
ValueError: zip() argument 2 is shorter than argument 1
هذا الأسلوب مفيد جداً عند التعامل مع بيانات حساسة تتطلب تطابقاً كاملاً بين القوائم.
دمج أكثر من تسلسل واحد
Abbreviation = ['Bl', 'Or', 'Br', 'Gn']
Color = ['Blue', 'Orange', 'Brown', 'Green']
Code = [20, 10, 56, 88]
for ab, col, cod in zip(Abbreviation, Color, Code):
print(ab, col, cod)
Output:
Bl Blue 20
Or Orange 10
Br Brown 56
Gn Green 88
لا تقتصر zip() على عنصرين فقط، بل يمكن استخدامها مع أي عدد من التسلسلات.
إنشاء dictionary باستخدام zip()
Color = ['Blue', 'Orange', 'Brown', 'Green']
Code = [20, 10, 56, 88]
dict(zip(Color, Code))
Output: {'Blue': 20, 'Orange': 10, 'Brown': 56, 'Green': 88}
هذه طريقة أنيقة وسريعة لتحويل قائمتين مترابطتين إلى dictionary.
استخدام الدالة sorted() لفرز العناصر في Python
تُستخدم الدالة sorted() لإرجاع العناصر في صورة مرتبة من أي كائن قابل للتكرار، دون تعديل البيانات الأصلية.
صيغة الدالة sorted()
sorted(iterable, key=key, reverse=reverse)
iterable: تسلسل قابل للتكرار مثلlistأوtupleأوstring.key: وسيط اختياري لتخصيص معيار الفرز.reverse: وسيط اختياري من النوعBoolean. القيمة الافتراضيةFalseللترتيب التصاعدي، وTrueللترتيب التنازلي.
مثال على الفرز التصاعدي
Color = ['Blue', 'Orange', 'Brown', 'Green']
sorted(Color)
Output: ['Blue', 'Brown', 'Green', 'Orange']
النتيجة تكون دائماً قائمة جديدة مرتبة، حتى لو كان المصدر الأصلي tuple.
مثال على الفرز التنازلي
Color = ('Blue', 'Orange', 'Brown', 'Green')
sorted(Color, reverse=True)
Output: ['Orange', 'Green', 'Brown', 'Blue']
لاحظ أن sorted() لا تغيّر القيم الأصلية، بل تُنتج نسخة مرتبة فقط.
استخدام key مع دالة مدمجة
Word = ('TO', 'is', 'apple', 'PEAR', 'LIKE')
sorted(Word, key=str.upper)
Output: ['apple', 'is', 'LIKE', 'PEAR', 'TO']
في هذا المثال تم استخدام str.upper لجعل الفرز غير متأثر باختلاف حالة الأحرف.
استخدام key مع reverse
Word = ('TO', 'is', 'apple', 'PEAR', 'LIKE')
sorted(Word, key=str.upper, reverse=True)
Output: ['TO', 'PEAR', 'LIKE', 'is', 'apple']
استخدام key مع دالة مخصصة
numb = (22, 10, 5, 34, 29)
sorted(numb, key=lambda x: x % 5)
Output: [10, 5, 22, 34, 29]
هنا تم ترتيب الأرقام بناءً على باقي القسمة على 5، وليس على قيمتها العددية المباشرة. ويمكنك استخدام lambda للاختصار أو تعريف دالة منفصلة إذا كان المنطق أكثر تعقيداً.
استخدام الدالة reversed() لعكس ترتيب العناصر في Python
تُعيد الدالة reversed() العناصر بترتيب عكسي من كائن قابل للتكرار.
صيغة الدالة reversed()
reversed(iterable)
الوسيط المطلوب هو:
iterable: تسلسل مثلlistأوtupleوغيرها من الكائنات القابلة للعكس.
مثال عملي على reversed()
numb = (22, 10, 5, 34, 29)
list(reversed(numb))
Output: [29, 34, 5, 10, 22]
غالباً ستحتاج إلى تحويل الناتج إلى list إذا أردت رؤية العناصر بشكل مباشر.
عند طباعة reversed() مباشرة
numb = (22, 10, 5, 34, 29)
reversed(numb)
Output: <reversed object>
مثل بعض الدوال المدمجة الأخرى، تُعيد reversed() كائناً قابلاً للتكرار وليس قائمة جاهزة.
أفضل الممارسات عند استخدام دوال التكرار في Python
- استخدم
enumerate()عندما تحتاج إلى الفهرس والعنصر معاً بدلاً من إنشاء عدّاد يدوي. - استخدم
zip()عند الربط بين أكثر من قائمة مترابطة منطقياً. - اعتمد على
sorted()عندما تريد ترتيب البيانات دون التأثير على المصدر الأصلي. - استخدم
reversed()لعكس الترتيب بطريقة واضحة ومباشرة. - احرص على اختيار الدالة التي تجعل الكود أكثر قابلية للقراءة، وليس فقط أقصر من حيث عدد الأسطر.
الخلاصة التقنية
توفر Python دوال تكرار مدمجة قوية تساعد على كتابة كود نظيف واحترافي، خصوصاً عند التعامل مع الفهارس، ودمج التسلسلات، وفرز البيانات، أو عكس ترتيبها. من الناحية التقنية، فإن الاستخدام الذكي لـ enumerate() وzip() وsorted() وreversed() لا يحسن شكل الكود فقط، بل يرفع أيضاً من قابليته للصيانة ويقلل احتمالات الأخطاء المنطقية في المشاريع الفعلية.