ژنراتورها ابزاری ساده و قدرتمند برای ایجاد تکرارکنندهها هستند. آنها مانند توابع عادی نوشته میشوند اما از دستور yield هر زمان که بخواهند داده برگردانند استفاده میکنند. هر بار که next() روی آن فراخوانی شود، ژنراتور از جایی که متوقف شده بود ادامه میدهد (تمام مقادیر داده و اینکه آخرین عبارت کدام بود را به یاد دارد). یک مثال نشان میدهد که ژنراتورها میتوانند به سادگی ایجاد شوند:
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
>>> for char in reverse('golf'):
... print(char)
...
f
l
o
g
هر کاری که با ژنراتورها قابل انجام است، با تکرارکنندههای مبتنی بر کلاس نیز قابل انجام است. چیزی که ژنراتورها را اینقدر فشرده میکند این است که متدهای __iter__() و __next__() به طور خودکار ایجاد میشوند.
یک ویژگی کلیدی دیگر این است که متغیرهای محلی و حالت اجرا به طور خودکار بین فراخوانیها ذخیره میشوند. این نوشتن تابع را آسانتر و بسیار شفافتر از رویکرد استفاده از متغیرهای نمونه مانند self.index و self.data کرد.
علاوه بر ایجاد خودکار متد و ذخیره حالت برنامه، وقتی ژنراتورها خاتمه یابند، به طور خودکار StopIteration ایجاد میکنند. در ترکیب، این ویژگیها ایجاد تکرارکنندهها را با تلاشی بیش از نوشتن یک تابع عادی آسان میکنند.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://docs.python.org/3/tutorial