2022-06-13 15:30:48
خب سلام
سوال که میدونیم چیه!
حقیقتش نمیشه به این سوال جواب قطعی داد که یا قطعا generator یا قطعا نوشتن راهحل با یک کلاس و پیادهسازی یک iterable و iterator
اما بیاید از چند جهت بررسیاش کنیم:
• سادگی و خوانا بودن:
والا من که نمیتونم بگم کدوم سادهتر یا پیچیدهتره، اما اگه اینجوری به قضیه نگاه کنیم که جنریتور فقط یک تابع هست و یک حلقه توش داره و من میدونم که وقتی اون iter تموم بشه بهم excption عه StopIteration برمیگردونه، فهمیدم چیه!
یا از اون طرف اون کلاس، اگه من بدونم که کار داندر ایتر و داندر next چیه؟ (که از اسمشون میشه فهمید که یه ربطی به توابع iter و next دارن) و اگه یک کلاسی اینا رو داشته باشه چی میشه، مسئله رو فهمیدم.
*بنظر من* جنریتور با نگاه بالا سادهتره چون داندر متدها رو معمولا دیرتر از توابع و اینا یاد میگیریم!
• اما یکی از شاخصهاش سادگی یا پیچیدگی کد رو میشه با نگاه کردن به کدها بررسی کرد. منظورم دقیقا نگاه کردن بهشون هست و نه خوندنش.
اگر همینجوری که کد رو دارید نگاه میکنید، کد رو ۹۰ درجه به سمت چپ بچرخونید و با تورفتگیها یک کوه بکشید، میبینید که میزان قله و درهها و کنار هم بودنشون در کد generator بیشتره اما کد کلاس flat تره.
توی ذن پایتون هم میخونیم:
Flat is better than nested!
پس *بنظر من* با نگاه بالا اینجا کد کلاس ساده تره.
و در کل نمیشه گفت حتما این سادهتره یا اون
• کارایی:
این دو نمونه کد *دقیقا* یک کار رو انجام میدن و یک خروجی دارن، هر دو lazy هستن، هر دو اون موقعی که ما روشون next میزنیم نتایج رو محاسبه میکنن و بهمون میدن و ...
اما اما اما وقتی من از کلاس استفاده میکنم میتونم اون کلاس رو توسعهاش بدم و کاراییهاش و قابلیتهاش رو بیشتر کنم تا فقط یک NGiver خالی نباشه، اما این در مورد generator صادق نیست.
/۱
168 viewsM4hdi, edited 12:30