generators

  • مدرس: علی بیگدلی
  • تاریخ انتشار: 1402/05/03
  • تعداد بازدید: 145

generator ها

generator ها نوعی iterable هستند، مانند لیست ها یا tuple ها. بر خلاف لیست ها، آنها به index سازی با شاخص های دلخواه اجازه نمی دهند، اما همچنان می توانند از طریق حلقه ها با هم تکرار شوند. می توانند با استفاده از توابع و عملکرد yield ارائه شوند.

def countdown():
  i=5
  while i > 0:
    yield i
    i -= 1
    
for i in countdown():
  print(i)

خروجی:

>>>
5
4    
3
2
1

نکته: yield برای تعریف یک generator استفاده می شود،جایگزین بازگشت یک تابع برای دریافت نتیجه از فراخواننده بدون حذف مقادیر local. با توجه به این که آنها یک محصول را در یک زمان تولید می کنند، ژنراتورها محدودیت حافظه لیست ها را ندارند. در واقع، می توانند بی نهایت باشند!

def infinite_sevens():
  while True:
    yield 7
        
for i in infinite_sevens():
  print(i)

خروجی:

>>>
7
7
7
7
7
7
7
...

نکته:به طور خلاصه، ژنراتورها به شما اجازه می دهند یک تابع را که مانند یک iterator یا تکرار رفتار می کند، اعلام کنید، یعنی می توان آن را در یک حلقه استفاده کرد. ژنراتورهای محدود را می توان به عنوان لیست ها تبدیل کرد.

def numbers(x):
  for i in range(x):
    if i % 2 == 0:
      yield i

print(list(numbers(11)))

خروجی:

>>>
[0, 2, 4, 6, 8, 10]
>>>

نکته: استفاده از ژنراتورها موجب بهبود عملکرد و سرعت می شود، که نتیجه درهم ریختگی(بر اساس تقاضا) تولید مقادیر است که به استفاده کمتر از حافظه می انجامد. علاوه بر این، لازم نیست منتظر بمانیم تا تمام عناصر قبل از شروع به استفاده از آنها تولید شوند.