تا اینجا احتمالاً متوجه شدهاید که بیشتر اشیاء ظرف میتوانند با دستور for حلقه زده شوند:
for element in [1, 2, 3]:
print(element)
for element in (1, 2, 3):
print(element)
for key in {'one':1, 'two':2}:
print(key)
for char in "123":
print(char)
for line in open("myfile.txt"):
print(line, end='')
این سبک دسترسی واضح، مختصر و راحت است. استفاده از تکرارکنندهها پایتون را نفوذ و یکپارچه میکند. در پشت صحنه، دستور for iter() را روی شیء ظرف فراخوانی میکند. تابع یک شیء تکرارکننده برمیگرداند که متد __next__() را تعریف میکند که عناصر را یکی یکی از ظرف دسترسی میدهد. وقتی عنصری باقی نماند، __next__() استثنای StopIteration ایجاد میکند که به حلقه for میگوید خاتمه یابد. میتوانید متد __next__() را با تابع داخلی next() فراخوانی کنید:
>>> s = 'abc' >>> it = iter(s) >>> it <str_iterator object at 0x10c90e650> >>> next(it) 'a' >>> next(it) 'b' >>> next(it) 'c' >>> next(it) Traceback (most recent call last): File "", line 1, in next(it) StopIteration
پس از دیدن مکانیزم پشت پروتکل تکرارکننده، اضافه کردن رفتار تکرارکننده به کلاسهایتان آسان است. یک متد __iter__() تعریف کنید که شیءای با متد __next__() برمیگرداند. اگر کلاس __next__() تعریف کند، __iter__() میتواند فقط self را برگرداند:
class Reverse:
"""تکرارکننده برای حلقه زدن روی یک توالی به صورت معکوس."""
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
>>> rev = Reverse('spam')
>>> iter(rev)
<__main__.Reverse object at 0x00A1DB50>
>>> for char in rev:
... print(char)
...
m
a
p
s
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://docs.python.org/3/tutorial