كيفية بناء مكرر أساسي في بايثون

في بايثون، تُعد المكررات أدوات قوية تتيح لك التجول خلال مجموعة من القيم دون الحاجة إلى العمل مباشرة مع بنية البيانات الأساسية. سواء كنت تتعامل مع القوائم أو المجموعات أو حتى الكائنات المخصصة، فإن فهم كيفية إنشاء مكرر خاص بك يمكن أن يكون مفيدًا جدًا.

في هذه المدونة، سنناقش كيفية بناء مكرر أساسي باستخدام فئة مثالية تُسمى Example، ثم سنستكشف تنفيذًا أكثر بساطة باستخدام مولد.

ما هو المكرر؟

المكرر هو كائن يتوافق مع بروتوكول المكرر. وهذا يعني أنه يجب أن يوفر وظيفتين أساسيتين:

  1. __iter__(): تُرجع هذه الوظيفة كائن المكرر نفسه.
  2. __next__(): تُرجع هذه الوظيفة القيمة التالية من المجموعة. وعندما لا تكون هناك عناصر أخرى للإرجاع، فإنها تُثير استثناء StopIteration.

تُسهِّل هذه الوظائف عملية التكرار عبر العناصر في حلقة.

إنشاء مكرر أساسي

دعنا نقوم بتفكيك كيفية إنشاء مكرر خطوة بخطوة.

الخطوة 1: تعريف الفئة

سنبدأ بتعريف فئة تُسمى Example. ستأخذ هذه الفئة قائمة من القيم وتعرضها من خلال المكرر.

class Example:
    def __init__(self, values):
        self.values = values

الخطوة 2: تنفيذ وظائف المكرر

الآن، سنقوم بتنفيذ وظيفتي __iter__ و __next__ في فئة Example.

class Example:
    def __init__(self, values):
        self.values = values

    def __iter__(self):
        self.index = 0  # تهيئة الفهرس
        return self

    def __next__(self):
        if self.index < len(self.values):
            result = self.values[self.index]
            self.index += 1  # الانتقال إلى الفهرس التالي
            return result
        else:
            raise StopIteration  # لا توجد قيم أخرى للإرجاع

الخطوة 3: استخدام المكرر

الآن يمكنك إنشاء مثيل من Example والتكرار عبر قيمه مثل هذا:

e = Example([1, 2, 3])
for value in e:
    print("الكائن المثال يحتوي على", value)

سينتج عن هذا الكود المخرجات التالية:

الكائن المثال يحتوي على 1
الكائن المثال يحتوي على 2
الكائن المثال يحتوي على 3

بناء مكرر عداد

لتوضيح المفهوم أكثر، دعنا نبني مكرر بسيط يُسمى Counter والذي يعد من عدد منخفض إلى عدد مرتفع.

فئة العداد

إليك كيفية إنشاء مكرر العداد:

class Counter:
    def __init__(self, low, high):
        self.current = low - 1
        self.high = high

    def __iter__(self):
        return self

    def __next__(self):
        self.current += 1
        if self.current < self.high:
            return self.current
        raise StopIteration

استخدام العداد

يمكنك استخدام فئة العداد هكذا:

for c in Counter(3, 9):
    print(c)

سوف يطبع:

3
4
5
6
7
8

نهج بديل: استخدام المولدات

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

إليك كيفية إنشاء عداد كمولد:

def counter(low, high):
    current = low
    while current < high:
        yield current
        current += 1

for c in counter(3, 9):
    print(c)

تظل المخرجات كما هي، ولكن نهج المولد يجعل الكود الخاص بك أنظف وأسهل في الصيانة.

الخاتمة

يسمح لك إنشاء المكررات في بايثون بتعريف سلوك التكرار الخاص بك والتلاعب بكيفية عرض الكائنات لقيمها. من خلال تنفيذ الوظائف __iter__() و__next__()، يمكنك تقديم تجربة تكرارية مخصصة. بالإضافة إلى ذلك، فإن استخدام المولدات يبسط العملية، مما يوفر الوقت ويقلل من التعقيد.

للمزيد من القراءة حول هذا الموضوع، يمكنك الاطلاع على مقال ديفيد ميرتز حول المكررات والمولدات البسيطة.

الآن بعد أن حصلت على فهم أساسي لكيفية إنشاء المكررات في بايثون، يمكنك البدء في تطبيق هذه المفاهيم في مشاريعك الخاصة!