شرح مولدات ومكررات Python

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

ما هو المُكرر؟

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

class MyIterator:
    def __init__(self, limit):
        self.limit = limit
        self.count = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.count < self.limit:
            self.count += 1
            return self.count
        else:
            raise StopIteration

# Using the iterator
iter_obj = MyIterator(5)
for num in iter_obj:
    print(num)

ما هو المولد؟

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

def my_generator(limit):
    count = 0
    while count < limit:
        count += 1
        yield count

# Using the generator
for num in my_generator(5):
    print(num)

مقارنة المتكررات والمولدات

على الرغم من استخدام كل من المعاودات والمولدات للتكرار، إلا أنها تختلف في تنفيذها واستخدامها:

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

استخدام المولدات لتدفقات البيانات المعقدة

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

def read_lines(filename):
    with open(filename, 'r') as file:
        for line in file:
            yield line.strip()

# Using the generator to read lines from a file
for line in read_lines('example.txt'):
    print(line)

دمج المولدات

يمكنك أيضًا ربط مولدات متعددة معًا لمعالجة البيانات على مراحل. يتم ذلك من خلال جعل أحد المولدات يستدعي مولدًا آخر. فيما يلي مثال على دمج المولدات لمعالجة البيانات وتصفيتها:

def numbers():
    yield 1
    yield 2
    yield 3
    yield 4
    yield 5

def even_numbers(gen):
    for number in gen:
        if number % 2 == 0:
            yield number

# Combining generators
for even in even_numbers(numbers()):
    print(even)

خاتمة

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