في بايثون، تعد المكررات والمولدات أدوات قوية للعمل مع تسلسل البيانات. إنها تسمح لك بتكرار البيانات دون الحاجة إلى تخزين التسلسل بأكمله في الذاكرة. ستشرح هذه المدونة المكررات والمولدات بطريقة بسيطة ومفهومة، مع أمثلة عملية.
التعريف: المكرر هو كائن في بايثون يسمح لك باجتياز جميع عناصر المجموعة (مثل القائمة أو الصف) واحدًا تلو الآخر. وهو يتبع بروتوكول التكرار، والذي يتضمن تنفيذ طريقتين: __iter__() و __next__().
كيفية عمل التكرارات:
__iter__(): تقوم هذه الطريقة بإرجاع كائن التكرار نفسه.
__next__(): تُرجع هذه الطريقة القيمة التالية من المجموعة. إذا لم يكن هناك المزيد من العناصر لإرجاعها، فسيؤدي ذلك إلى ظهور استثناء StopIteration.
مثال على مكرر مخصص:
class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.indexالإخراج:
1 2 3شرح: في هذا المثال، MyIterator عبارة عن فئة مكررة مخصصة تتكرر عبر قائمة من الأرقام. تقوم الطريقة __next__() بإرجاع العنصر التالي في القائمة وتثير StopIteration عندما لا يكون هناك المزيد من العناصر لإرجاعها.
التكرارات الافتراضية للمجموعات المضمنة
توفر بايثون مكررات افتراضية للمجموعات المضمنة مثل القوائم والصفوف والقواميس والمجموعات. يمكنك استخدام الدالة iter للحصول على مكرر من هذه المجموعات ثم استخدامه بجوار للتكرار من خلالها.
مثال مع القائمة:
my_list = [1, 2, 3] my_iter = iter(my_list) print(next(my_iter)) # Output: 1 print(next(my_iter)) # Output: 2 print(next(my_iter)) # Output: 3 # print(next(my_iter)) # This will raise StopIteration2. ما هو المولد؟
التعريف: المولد هو نوع خاص من المكررات في بايثون، يتم تعريفه باستخدام دالة وكلمة الإنتاجية الأساسية. تتيح لك المولدات تكرار سلسلة من القيم دون تخزينها كلها في الذاكرة مرة واحدة، مما يجعلها أكثر كفاءة في الذاكرة من القوائم.
كيف تعمل المولدات:
مثال:
def my_generator(): yield 1 yield 2 yield 3 gen = my_generator() for item in gen: print(item)
الإخراج:
1 2 3
شرح: في هذا المثال، my_generator هي دالة مولدة تنتج ثلاث قيم واحدة تلو الأخرى. كل استدعاء للإنتاج ينتج قيمة ويوقف الوظيفة مؤقتًا حتى يتم طلب القيمة التالية.
كفاءة الذاكرة: تولد المولدات القيم بسرعة ولا تخزن التسلسل بأكمله في الذاكرة، مما يجعلها مثالية للعمل مع مجموعات البيانات الكبيرة أو تدفقات البيانات.
مثال:
def large_sequence(): for i in range(1, 1000001): yield i gen = large_sequence() print(next(gen)) # Output: 1 print(next(gen)) # Output: 2
شرح: ينتج هذا المولد سلسلة من مليون رقم دون تخزينها كلها في الذاكرة، مما يدل على كفاءة الذاكرة.
المكررون:
كائنات مخصصة قابلة للتكرار: عندما تحتاج إلى مزيد من التحكم في منطق التكرار.
تسلسلات لا نهائية: إنشاء تسلسل لا نهاية له من القيم، مثل البيانات من جهاز الاستشعار.
المولدات:
التقييم البطيء: معالجة مجموعات البيانات الكبيرة عنصرًا واحدًا في كل مرة.
خطوط الأنابيب: بناء خطوط أنابيب لمعالجة البيانات التي تتعامل مع البيانات بطريقة متدفقة.
التعريف: توفر تعبيرات المولدات طريقة مختصرة لإنشاء المولدات. وهي تشبه قائمة الفهم ولكنها تستخدم الأقواس بدلاً من الأقواس المربعة.
مثال:
gen_exp = (x * x for x in range(5)) for value in gen_exp: print(value)
الإخراج:
0 1 4 9 16
شرح: ينشئ تعبير المولد هذا مولدًا ينتج مربعات الأرقام من 0 إلى 4.
مثال 1: قراءة الملفات الكبيرة
def read_large_file(file_path): with open(file_path, 'r') as file: for line in file: yield line for line in read_large_file('large_file.txt'): print(line.strip())
شرح: تقوم وظيفة المولد هذه بقراءة ملف كبير سطرًا تلو الآخر، مما ينتج عنه سطرًا واحدًا في كل مرة. إنه فعال في الذاكرة لأنه لا يقوم بتحميل الملف بأكمله في الذاكرة.
مثال 2: تسلسل فيبوناتشي
def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a b fib = fibonacci() for _ in range(10): print(next(fib))
الإخراج:
0 1 1 2 3 5 8 13 21 34
شرح: تنتج وظيفة المولد هذه تسلسلاً لا نهائيًا من أرقام فيبوناتشي. إنه يوضح كيف يمكن استخدام المولدات لتوليد تسلسلات لا حصر لها من القيم.
* An iterator is an object that allows you to traverse through all the elements of a collection one at a time, implementing the `__iter__()` and `__next__()` methods.
* A generator is a special type of iterator defined using a function and the `yield` keyword, allowing you to generate values on the fly without storing them all in memory.
* Generators are memory-efficient, as they generate values on the fly. They are useful for processing large datasets, building data pipelines, and working with potentially infinite sequences.
* Generator expressions use parentheses and produce values one at a time, whereas list comprehensions use square brackets and generate the entire list in memory.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3