اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

أي كائن نستطيع التكرار عليه من خلال حلقة for أو تمريره إلى دالة iter() للحصول على Iterator أي مكرر، فهو كائن قابل للتكرار Iterable بمعنى يحتوي على عناصر يمكن الوصول إليها واحدًا تلو الآخر بسبب الدالة الداخلية __iter__() التي تُعيد كائن Iterator كالتالي:

my_list = [1, 2, 3]  

for item in my_list:
    print(item)

أما Iterator وهو المُكرّر فذلك لتتبع عملية التكرار وإرجاع العناصر واحدًا تلو الآخر، ويتم إنشاؤه من Iterable أي كائن قابل للتكرار باستخدام دالة iter()

ويحتوي على دالتين داخليتين وليس دالة واحدة كما في Iterable، وهما:

  • __iter__() تُعيد الكائن نفسه.
  • __next__() تُعيد العنصر التالي في التسلسل، وإن لم يتوفر عناصر، تُطلق استثناء.

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

my_list = [1, 2, 3]
iterator = iter(my_list)  

print(next(iterator)) 
print(next(iterator)) 
print(next(iterator)) 

#print(next(iterator))

قم بتجربة الكود السابق وستحصل على عناصر المصفوفة، ولو أزلت تعليق السطر الأخير ستحصل على خطأ StopIteration: StopIteration حيث لم يعد هناك عناصر باقية في المُكرر.

بالتالي كل Iterator هو Iterable لأنه يحتوي على __iter__() وليس كل Iterable هو Iterator لأنه لا يحتوي على __next__() دائمًا.

وتستطيع تحويل Iterable إلى Iterator باستخدام iter()، واستخدام next() للوصول إلى العناصر يدويًا.

my_string = "hello" #ذلك كائن قابل للتكرار

iterator = iter(my_string)  

# Iterator مكرر
print(next(iterator)) 
print(next(iterator)) 

 # لطباعة العناصر الباقية في المكرر
for char in iterator: 
    print(char)  

 

  • 0
نشر

Iterable و Iterator هما مفهومان مرتبطان بالتكرار (iteration)، لكنهما يختلفان في التعريف والاستخدام. إليك الفرق باختصار

Iterable (قابل للتكرار)

أي كائن يمكن التكرار عليه باستخدام حلقة (مثل for) أو يمكن تمريره إلى دالة مثل iter() للحصول على Iterator.

الخصائص

  • يحتوي على الدالة السحرية __iter__() التي تُرجع كائن Iterator.
  • أمثلة: القوائم (list)، المجموعات (set)، السلاسل (str)، القواميس (dict)، وغيرها.
  • لا يحتفظ بحالة التكرار بنفسه.

ومثال على ذلك 

my_list = [1, 2, 3]
for item in my_list:  # my_list هو Iterable
    print(item)

Iterator (مُكرّر)

كائن يمثل تيارًا من البيانات ويتيح استرجاع العناصر واحدًا تلو الآخر باستخدام الدالة next().

الخصائص

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

ومثال على ذلك 

my_list = [1, 2, 3]
iterator = iter(my_list)  # تحويل Iterable إلى Iterator
print(next(iterator))  # 1
print(next(iterator))  # 2
print(next(iterator))  # 3
# print(next(iterator))  # سيُطلق استثناء StopIteration

 

  • 0
نشر

لتوضيح ال Iterator (المكرر) أكثر فنعتبر Iterator هو كائن يستخدم للتكرار على عناصر Iterable وخصائصه أنه 

  • يحتوي على دالة __iter__() التي تُرجع Iterator نفسه
  • يحتوي على دالة__next__() التي تُرجع العنصر التالي في التكرار
  • عندما لا تبقى عناصر، يرفع استثناء StopIteration

ولذلك 

ال Iterable كائن يمكن تكرار عناصره (يمكن استخدامه في حلقة for) بينما ال Iterator كائن يدير حالة التكرار ويعطي العناصر واحداً تلو الآخر

عندما تستخدم حلقة for مع Iterable، تقوم بايثون تلقائياً بتحويله إلى Iterator واستخدامه داخلياً للتكرار.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...