English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
الم迭代ر هو عنصر قابل للتمرير. في هذا الدليل، ستتعلم عن كيفية عمل الم迭代ر وكيفية بناء م迭代ر خاص بك باستخدام طرق __iter__ و __next__.
الم迭代ر في Python متواجد في كل مكان. يتم تنفيذها بشكل جمالي في الدوائر for، والفهم، والمولدات وما إلى ذلك، لكنها مخفية تحت أعيننا.
م الم迭代ر في Python هو مجرد شيء قابل للتمريركائنسيكون كائنًا يرجع البيانات، مرة واحدة العنصر الواحد.
بشكل تقني، Python م对象 الم迭代ريجب تنفيذ طريقتين خاصة، __iter__() و __next__(). تُدعى معًامعاهدة الم迭代ر.
إذا كان يمكننا الحصول على م迭代ر من العنصر، فإن العنصر يُدعىقابلةتمرير. معظم المراتب المدمجة في Python (مثل:list،tuple،stringالتي هي قابلة للتمرير.
دالة iter() (أو طريقة __iter__() هي نفسها) تعود م迭代ر منهم.
نستخدم دالة next() لتمرير جميع العناصر في الم迭代ر. عند وصولنا إلى النهاية وليس هناك بيانات أخرى للإرجاع، فإنها تسبب StopIteration. إليك مثال.
#تحديد قائمة my_list = [4, 7, 0, 3] #استخدام iter() للحصول على م迭代ر my_iter = iter(my_list) ## استخدام iter() للحصول على م迭代ر #يُطبع 4 print(next(my_iter)) #يُطبع 7 print(next(my_iter)) ## next(obj) مع obj.__next__() متشابه #يُطبع 0 print(my_iter.__next__()) #يُطبع 3 print(my_iter.__next__()) ## سيؤدي هذا إلى خطأ، لا يوجد عناصر متبقية next(my_iter)
طريقة أكثر جمالًا للتمرير تلقائيًا هي استخدامالدائرة forباستخدام هذا الأسلوب، يمكننا تمرير أي عنصر يمكنه العودة كم迭代ر، مثل القوائم، الأحرف، الملفات وما إلى ذلك.
>>> لـelement في my_list: ... print(element) ... 4 7 0 3
كما رأينا في المثال السابق، يمكن للدائرة for التمرير تلقائيًا عبر القائمة.
في الواقع، يمكن للدائرة for تمرير أي عنصر قابل للتمرير. دعنا نرى كيف يتم تنفيذ الدائرة for في Python.
لـelement في iterable: # تقوم بشيء مع العنصر
في الواقع، يتم تنفيذها كـ。
# إنشاء كائن م迭代 iter_obj = iter(iterable) # دوران غير محدود while True: try: # الحصول على العنصر التالي element = next(iter_obj) # تقوم بشيء مع العنصر except StopIteration: # إذا تم رفع StopIteration، فإنه يخرج من الحلقة break
لذلك، في الداخل، تنشئ حلقة for مكررًا عن طريق تنفيذ iter() على iterable.
بشكل ساخر، هذه الحلقة for في الواقع غير محدودةحلقة while.
في الداخل، تنفذ حلقة for next() للحصول على العنصر التالي، وتستخدم هذا القيمة لتنفيذ جسم حلقة for. عند انتهاء جميع العناصر، يرفع StopIteration، ويتم التقاطعه داخليًا، ينتهي الحلقة. لاحظ أن أي نوع آخر من الاستثناءات سيتم السماح لها بالمرور.
من السهل بناء مكرر من البداية في بايثون. كل ما نحتاجه هو تنفيذ هذه الطرق __iter__() و __next__().
يبدأ __iter__() في العودة إلى مكرر نفسه. يمكن تنفيذ بعض التهيئة إذا لزم الأمر.
يجب أن يعود __next__() إلى العنصر التالي في السلسلة. يجب أن يرفع StopIteration عند الوصول إلى النهاية وفي الطلبات التالية.
هنا، نعرض مثالًا يقدم لنا في كل تكرار مضرب في الاثنين من 0 إلى الرقم الذي يحدده المستخدم.
class PowTwo: """تحقيق فئة المكرر مضرب في الاثنين def __init__(self, max = 0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration
الآن، يمكننا إنشاء مكرر ويمكننا تنفيذ التحديث كما يلي.
>>> a = PowTwo(4) >>> i = iter(a) >>> next(i) 1 >>> next(i) 2 >>> next(i) 4 >>> next(i) 8 >>> next(i) 16 >>> next(i) Traceback (most recent call last): ... StopIteration
يمكننا أيضًا استخدام حلقة for لتحسين مكرر.
>>> for i in PowTwo(5): ... print(i) ... 1 2 4 8 16 32
لا يجب أن يتم استنفاد العناصر في كائن المولد. قد تكون هناك مولدات لامتناهية (لن تنتهي أبدًا). يجب أن نكون حذرين عند التعامل مع هذه المولدات.
هذا هو مثال بسيط على مولد لامتناهي.
الوظائف المدمجة يمكن تمرير دالة iter() بثلاثة معلمات، حيث يجب أن يكون المعلمات الأولى دالة قابلة للإدخال (دالة)، والمعلمات الثانية هو العلامة. سيعيد المولد هذه الدالة حتى يتم العودة إلى قيمة العلامة.
>>> int() 0 >>> inf = iter(int, 1) >>> next(inf) 0 >>> next(inf) 0
يمكننا رؤية أن دالة int() دائمًا تعود 0. لذلك، عند تمريرها كـ iter(int, 1)، فإنها تعود مولدًا يُطلق دالة int() حتى يتم العودة إلى 1. هذا لن يحدث أبدًا، وسيكون لدينا مولد لامتناهي.
يمكننا أيضًا بناء مولدات لامتناهية خاصة بنا. نظريًا، سيعود هذا المولد جميع الأعداد الصحيحة.
class InfIter: """المولدات اللامتناهية تعود بجميع الأعداد الصحيحة def __iter__(self): self.num = 1 return self def __next__(self): num = self.num self.num += 2 return num
السير فيما يلي.
>>> a = iter(InfIter()) >>> next(a) 1 >>> next(a) 3 >>> next(a) 5 >>> next(a) 7
...
بالنسبة لهذه الأنواع من المولدات اللامتناهية، يجب أن نكون حذرين عند تحديد شرط التوقف.
منافع استخدام المولدات هي توفير الموارد. كما هو موضح أعلاه، يمكننا الحصول على جميع الأرقام الصحيحة دون الحاجة إلى تخزين النظام الكامل في ذاكرة الوصول العشوائي. نظريًا، يمكننا تضمين عدد لا محدود في ذاكرة محدودة.
تتيح للمولدات جعل شيفرة برمجيتنا تبدو رائعة.
هناك طريقة سهلة لإنشاء مولدات في Python. للحصول على معلومات إضافية، يرجى زيارة:مولدات Python yield.