counterexample

فعلن فقط برنامه نویسی

counterexample

فعلن فقط برنامه نویسی

سه شنبه, ۱۵ بهمن ۱۳۹۸، ۰۲:۱۹ ق.ظ

۰

yield , iterator, generator در پایتون

سه شنبه, ۱۵ بهمن ۱۳۹۸، ۰۲:۱۹ ق.ظ

با مزایا شروع میکنیم؛ استفاده از iterator ها و generator ها خوب است چون:

1- خاصیت lazy بودن به ما امکان می دهد iterator هایی بسازیم که اندازه ندارند و عملا نامتناهی هستند.

2- مکانیزم iterator از لحاظ حافظه بسیار بهینه است و گاهی حتی چاره ای جز استفاده از iterator نداریم.

3- با استفاده از توابع __next__‌و یا yield می توان کلاس های بسیار مرتبی نوشت که به صورت کاملا شخصی سازی شده (customized) یک iterator را بسازند. مثال آن می تواند ساختن iterator بر روی یک دیتابیس یا دیتاست باشد.

 

برای اینکه iterable ها عالی هستند پایتون استفاده از آنها را حتی راحت تر هم کرده است. شما حتی نیازی ندارید که مواظب منطق گاه دشوار __next__‌شوید. تولید کننده ها یا generator ها در واقع iterator هایی هستند که سینتکس ساده تری در اختیار برنامه نویس قرار می دهند.

شما کافی است که حلقه مورد نظر خودتان را بنویسید (بدون توجه به اینکه چنین حلقه ای عملا ناممکن است!) و از کلمه جادویی yield استفاده کنید. برای استفاده از generator ها حتی نیازی به تعریف کلاس هم نداریم!

def firstn(n):
    num = 0
    while num < n:
        yield num
        num += 1

for i in firstn(10):
    print(i)

 تابع firstn هر بار num را بر میگرداند پس شبیه به return است اما با آن تفاوت دارد. زمانی که return اجرا می شود تابع خاتمه پیدا می کند و از حافظه خارج می شود اما yield مثل ساعت برنارد تابع را با تمام حالات آن نگه می دارد مقدار را بر میگرداند و منتظر می ماند تا چیزی که آن را فراخوانده است دوباره این کار را بکند!

در اینجا تابع firstn می تواند n عدد طبیعی را به ترتیب تولید کند. در واقع قسمت مهم کد بالا yield است که مقدار num را در هر حلقه بر میگرداند. این دستور دقیقا مانند __next__ عمل می کند و به صورت lazy این مقدار را بر میگرداند. اصلا می توانید به صورت زیر هم آن را فراخوانی کنید:

f = firstn(10)

print(f.__next__())
print(f.__next__())
print(f.__next__())

که به ترتیب اعداد ۰ و ۱ و ۲ را بر میگرداند.

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

موافقین ۰ مخالفین ۰ ۹۸/۱۱/۱۵
counter example

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">