English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python تعليمية الأساس

Python التحكم في العملية

الوظائف في Python

أنواع البيانات في Python

Python عمليات ملف

Python الأشياء والفئات

Python تاريخ وتوقيت

Python العالي المعرفة

دليل Python

المحولات في Python

الم迭代ر هو عنصر قابل للتمرير. في هذا الدليل، ستتعلم عن كيفية عمل الم迭代ر وكيفية بناء م迭代ر خاص بك باستخدام طرق __iter__ و __next__.

ما هو الم迭代ر في Python؟

الم迭代ر في Python متواجد في كل مكان. يتم تنفيذها بشكل جمالي في الدوائر for، والفهم، والمولدات وما إلى ذلك، لكنها مخفية تحت أعيننا.

م الم迭代ر في Python هو مجرد شيء قابل للتمريركائنسيكون كائنًا يرجع البيانات، مرة واحدة العنصر الواحد.

بشكل تقني، Python م对象 الم迭代ريجب تنفيذ طريقتين خاصة، __iter__() و __next__(). تُدعى معًامعاهدة الم迭代ر.

إذا كان يمكننا الحصول على م迭代ر من العنصر، فإن العنصر يُدعىقابلةتمرير. معظم المراتب المدمجة في Python (مثل:list،tuple،stringالتي هي قابلة للتمرير.

دالة iter() (أو طريقة __iter__() هي نفسها) تعود م迭代ر منهم.

تمرير باستخدام م迭代ر في Python

نستخدم دالة 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 تمرير أي عنصر قابل للتمرير. دعنا نرى كيف يتم تنفيذ الدائرة 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.