ژنراتورهایی که تولید را متوقف می کنند
ژنراتورهایی که تولید را متوقف می کنند
در این بخش ما با یک بار نوشتن یک مولد بی نهایت شروع کردیم از نو. تا به حال احتمالاً به این فکر کرده اید که چگونه یک ژنراتور بنویسید که پس از مدتی به جای ادامه دادن و ادامه دادن، تولید ارزش را متوقف می کند به یاد داشته باشید، در تکرارکننده کلاسی ما توانستیم پایان را نشان دهیم تکرار با بالا بردن دستی یک استثنا StopIteration. زیرا برای همیشه. ژنراتورها کاملاً با تکرارکنندههای مبتنی بر کلاس سازگار هستند، هنوز هم همینطور است خوشبختانه، ما به عنوان برنامه نویس با یک رابط کاربری زیباتر کار می کنیم زمان در اطراف. ژنراتورها به محض کنترل، تولید مقادیر را متوقف می کنند جریان به هر وسیله ای غیر از a از تابع مولد باز می گردد آنچه در پشت صحنه اتفاق می افتد بیانیه بازده این بدان معناست که دیگر نیازی نیست که اصلا نگران افزایش StopIteration باشید! در اینجا یک مثال است:yield value yield value yield valueتوجه کنید که چگونه این تابع مولد هیچ نوع حلقه ای را شامل نمی شود. در واقع بسیار ساده است و فقط از سه عبارت بازدهی تشکیل شده است. اگر یک بازده به طور موقت اجرای تابع را به حالت تعلیق در آورد و عبور کند یک مقدار را به تماس گیرنده برگردانید، وقتی به انتهای آن برسیم چه اتفاقی خواهد افتاد این ژنراتور؟ بیایید دریابیم:>>> for x in repeat_three_times(‘Hey there’): def repeat_three_times(value): ‘Hey there’ … print(x) ‘Hey there’ ‘Hey there’همانطور که انتظار داشتید،
این مولد پس از سه بار تکرار، تولید مقادیر جدید را متوقف کرد
می توانیم فرض کنیم که این کار را با بالا بردن انجام داده است تابع. اما برای اطمینان، بیایید آن را با آزمایش دیگری تأیید کنیم:>>> iterator = repeat_three_times(‘Hey there’) یک استثناء StopIteration زمانی که اجرا به پایان می رسد ‘Hey there’ >>> next(iterator) >>> next(iterator) >>> next(iterator) ‘Hey there’ ‘Hey there’ StopIteration >>> next(iterator) >>> next(iterator) StopIteratioدر اینجا یکی دیگر از ویژگیهای عالی تکرارکنندهها در پایتون وجود دارد: با زنجیر کردن چندین تکرارکننده به یکدیگر، میتوانید پردازش دادههای بسیار کارآمد را در خطوط لوله بنویسید. اولین باری که این الگو را در یک PyCon دیدم ارائه توسط دیوید بیزلی، ذهن من را متحیر کرد. زنجیر Iterator اگر از توابع و ژنراتور مولد پایتون استفاده می کنید عبارات، شما در حال ایجاد زنجیره های تکرار شونده مختصر و قدرتمند خواهید بود هیچ وقت در این فصل متوجه خواهید شد که این تکنیک چگونه است در عمل و چگونه می توانید از آن در برنامه های خود استفاده کنید. به عنوان یک جمع بندی سریع، مولدها و عبارات مولد نحوی هستند شکر برای نوشتن تکرار کننده در پایتون. آنها بسیاری از موارد را انتزاع می کنند کد boilerplate هنگام نوشتن تکرارکننده های کلاس محور مورد نیاز است. در حالی که یک تابع منظم یک مقدار بازگشتی واحد تولید می کند، ژنراتورها دنباله ای از نتایج را تولید کند. می توان گفت آنها یک جریان تولید می کنند به عنوان مثال، من می توانم مولد زیر را که تولید می کند تعریف کنم مجموعه ای از مقادیر صحیح از یک تا هشت با نگه داشتن یک شمارنده در حال اجرا و هر بار که next() روی آن فراخوانی می شود یک مقدار جدید به دست می دهد:def integers(): ارزش ها در طول عمرشان. for i in range(1, 9): yield i
قوانین ارسال دیدگاه در سایت