Generator در پایتون روش آسانی برای تولید پیمایشگرها است و با استفاده از این قابلیت شما می‌توانید یک تابع را به راحتی کنترل کنید و در هر زمان از آن خروجی دریافت کنید. در مورد توابع معمولی در پایتون مبحث سرعت و میزان حافظه مطرح است. شما در یک تابع پایتون از نظر سرعت و میزان حافظه مشکلاتی را خواهید داشت که با استفاده از Generator در پایتون این موضوعات تا حدود زیادی رفع شده است. در این مقاله از سری مقالات آموزش برنامه نویسی پایتون به معرفی و بررسی generatoe در پایتون خواهیم پرداخت.

دوره معرفی شده در ویدئو

با استفاده از Generatorها در پایتون در هر خط از کد که باشید، می‌توانید یک خروجی بگیرید و یک میزان مشخص را برگردانید. این مزیت بسیار مهمی است که سرعت گرفتن خروجی را تا حدود بالایی افزایش خواهد داد و با استفاده از آن دیگر شما نیاز به صرف میزان زیادی از حافظه نخواهید داشت.

مثال عملی Generator در پایتون

به عنوان یک مثال عملی Generator در پایتون می‌توانید کد زیر را در نظر داشته باشید. در این مثال یک Generator در زبان پایتون طراحی شده است که بر اساس عدد n و در هر بخش می‌تواند یک خروجی مشخص را برGenerator در پایتونگرداند. این کار با استفاده از قابلیت پیمایشگر و کیورد yield قابل انجام است.

 

# A simple generator function

def generator():

    n = 1

    print('First')

    yield n

    n += 1

    print('Second')

    yield n

    n += 1

    print('Last')

    yield n

a = generator()

next(a) #prints First

next(a) #prints Second

next(a) #prints Last

 

نکته مهمی در مورد استفاده از توابع Generator وجود دارد. دقت داشته باشید که عدد n پس از هر پیمایش یادآوری می‌شود و در مرحله بعدی از آن استفاده می‌شود. این قابلیت در توابع معمولی وجود ندارد و با هر بار فراخوانی تابع، اعداد یادآوری نمی‌شوند و نیاز است تا عملیات از صفر شروع به کار کند.

استفاده از حلقه تکرار در Generator پایتون

استفاده از حلقه تکرار در Generator پایتون امکان پذیر است و شما می‌توانید خروجی‌های مورد نظر را به صورت یکجا به چاپ برسانید. در واقع، با به کارگیری Generator در پایتون و استفاده از حلقه تکرار دیگر نیازی به استفاده مدام از کیورد next نخواهد بود.

مثال زیر نشان دهنده یک عملیات پیمایش است که بر اساس هر مرحله، خروجی خاصی برگردانده خواهد شد. با استفاده از حلقه تکرار می‌توان خروجی‌ها را به صورت یکجا به چاپ رساند.

# A simple generator function

def generator():

    n = 1

    print('First')

    yield n

    n += 1

    print('Second')

    yield n

    n += 1

    print('Last')

    yield n

for i in generator():

    print(i) #prints First 1, Second 2, Last 3

طرح کلی Generator در پایتون

طرح کلی Generator در پایتون تقریبا شبیه تعریف کردن یک تابع است. با این تفاوت که شما برای بازگرداندن خروجی به جای return باید از yield استفاده کنید. با این کار، تابع شما با رسیدن به yield به کار خود اتمام نخواهد داد و پس از اولین و دومین خروجی می‌توانید خروجی‌های بعدی را نیز از تابع generator دریافت کنید.

در مثال زیر مشاهده می‌کنید که تابع generator پایتون تا پنج عدد خروجی را بازگردانده است و با استفاده از یک حلقه تکرار تمامی آن‌ها در خروجی به چاپ رسیده است. 

def generator():

    yield 0

    yield 1

    yield 2

    yield 3

    yield 4

for i in generator():

    print(i) #prints 0, 1, 2, 3, 4

محاسبه دنباله فیبوناچی با Generator در پایتون

برای دریافت خروجی مرحله به مرحله می‌توان از قابلیت Generator در این زبان برنامه نویسی استفاده کرد. محاسبه دنباله فیبوناچی با Generator در پایتون امکان پذیر است و شما می‌توانید هر لحظه که نیاز داشته باشید، خروجی تکی را از این دنباله به دست آورید.

def fib(limit):

    a = 0

    b = 1

    while a < limit:

        yield a

        a, b = b, a+b

a = fib(10)

print(next(a)) #prints 0

print(next(a)) #prints 1

print(next(a)) #prints 1

print(next(a)) #prints 2

print(next(a)) #prints 3

print(next(a)) #prints 5

مزایای استفاده از Generatorها در پایتون

مزایای استفاده از Generatorها در پایتون بسیار زیاد است و این قابلیتی منحصر به فرد برای صرفه جویی در زمان و حافظه در این زبان برنامه نویسی است. در شرایطی که به دنبال قابلیت‌های ویژه و افزوده‌ای در مقایسه با توابع معمولی پایتون هستید، می‌توانید از Generatorها در این زبان استفاده کنید که به صورت مشخص مزایای زیر را در اختیار کاربر قرار خواهد داد.

سادگی در استفاده

سادگی در استفاده از مزایای اولیه Generatorها در این زبان است و شما به مانند توابع می‌توانید در زمانی کوتاه یک تابع Generator ایجاد کنید. در مقایسه با پیمایشگرها، این Generator پایتون است که مزیت بهتری دارد چرا که در پیمایشگر شما نیاز به استفاده همزمان از iter و next حین کدنویسی خواهید داشت.

صرفه جویی در حافظه

صرفه جویی در حافظه قابلیت بسیار مهم در Generatorهای پایتون است. دقت داشته باشید که زمان استفاده از تابع نیاز است تا زنجیره‌ای از عملیات انجام شود و پس از آن خروجی بازگردانده خواهد شد. در این میان، مطمئنا عملیاتی نیز وجود دارد که اصلا در یک زمان مشخص مورد نیاز ما نخواهد بود. مزیت Generatorها در پایتون این است که دقیقا عملیات بخش مورد نیاز انجام می‌شود و خروجی در مرحله درخواست شده به چاپ خواهد رسید. این مزیت منجر به صرفه جویی عالی در حافظه خواهد شد.

صرفه جویی در زمان

امروزه زمان دریافت خروجی از کد نوشته شده یکی از اصول اولیه در برنامه نویسی است. شما باید کدهایی را بنویسید که در زمان کوتاهی اجرا شده و خروجی را ارائه دهند. با حذف بخش‌های نا خواسته در بعضی از مراحل کدنویسی با استفاده از Generatorها، زمان دریافت خروجی بسیار بهتر خواهد شد و در شرایط بهتری می‌توان کدهای بهینه را در این زبان برنامه نویسی تولید کرد.

سخن آخر

Generator در پایتون یکی از اساسی‌ترین بخش‌ها برای رسیدن به کدهای بهینه و پر سرعت است. در شرایطی که شما از نظر حافظه و مصرف بخش‌های آن باید محتاط عمل کنید، Generatorها به شما کمک خواهند کرد تا در بهترین شرایط کدنویسی در این زبان را انجام دهید. اگر میخواهید درمورد Generator در پایتون بیشتر مطالعه کنید میتوانید مقاله مرتبطی را در وبسایت programiz  مطالعه کنید.

نکته
چنانچه هرگونه سوال درمورد Generator در پایتون دارید میتوانید در ادامه همین صفحه در بخش دیدگاه ها با ما درمیان بگذارید.