• 0

صناعة كائن قابل للتكرار iterator في بايثون

كيف يمكنني إنشاء دالة تكرارية (أو كائن مكرر) في لغة بايثون؟ بحيث يمكن إستخدامه في حلقات التكرار مثل حلقة for ، على سبيل المثال عمل صنف Counter يمكن إستخدامه بالشكل التالي:

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

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

يمكن الاعتماد على المؤشر iterator: حيث نقوم ببناء الصنف بطريقة مشابهة للتالي:

class Counter(object):
  	# تهيئة العنصر
    def __init__(self, start, stop):
       self.start = start
       self.stop = stop
    # تعريف المؤشر
    def __iter__(self): return self
    # الدالة لجلب العنصر التالي
    def __next__(self): # next in Python 2
       # اختبار الشرط
       if self.start >= self.stop:
           raise StopIteration
       current = self.start * self.start
       self.start += 1
       return current

iterator = Counter(a, b)

ولجلب العنصر الحالي يمكن إضافة الدالة current التي تعيد start ألمعدلة:

def current(self):
       return self.start

وبطريقة أخرى:

كما يمكن الاستفادة من مفهوم المولد generator والكلمة المفتاحية yield:

def counter(start, stop):
    for i in range(start, stop):
        yield i
        
Counter = counter(3, 9)
2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

 

يمكنك عمل ذلك كالآتي

from datetime import timedelta, date

class DateIterable:

    def __init__(self, start_date, end_date):
        # تهيئة بداية ونهاية التواريخ
        self.start_date = start_date
        self.end_date = end_date
        self._present_day = start_date

    def __iter__(self):
        # إعادة الكائن
        # __iter__
        return self

    def __next__(self):
        # مقارنة التاريخ الحاضر مع التاريخ الأخير
        # إذا كان التاريخ الحاضر أكبر من التاريخ الأخير فسيتوقف التكرار
        if self._present_day >= self.end_date:
            raise StopIteration
        today = self._present_day
        self._present_day += timedelta(days=1)
        return today


if __name__ == '__main__':
    for day in DateIterable(date(2020, 1, 1), date(2020, 1, 6)):
        print(day)

أو يمكنك إضافة هذا الكود في الكائن

 def __iter__(self):
        for x in self.iterable:
            yield x

كما يلي

class someClass:
    def __init__(self,list):
        self.list = list
    def __iter__(self):
        for x in self.list:
            yield x


var = someClass([1,2,3,4,5])
for num in var: 
    print(num) 

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن