|
112 | 112 | .. tip:: |
113 | 113 | علاوه بر این محدودیت، یک محدودیت جدیتر دیگری نیز وجود دارد و آن هم میزان فضایی است که توسط سیستم عامل برای پشته در نظر گرفته شده است. با رد شدن از این مقدار فضا، برنامه با خطای زمان اجرا مواجه میگردد (``RuntimeError``). |
114 | 114 |
|
| 115 | +تابع Generator بازگشتی |
| 116 | +~~~~~~~~~~~~~~~~~~~~~~ |
| 117 | + |
| 118 | +در پیادهسازی توابع Generator و Coroutine نیز میتوان شیوه بازگشتی را در نظر گرفت، در این صورت ممکن است نتایج کمی برخلاف انتظار شما باشد. نمونه کد زیر یک شی لیست تو در تو را دریافت و تک تک اعضای درون هر لیست را چاپ میکند:: |
| 119 | + |
| 120 | + >>> def flatten(lists): |
| 121 | + ... for sub in lists: |
| 122 | + ... if isinstance(sub,list): |
| 123 | + ... flatten(sub) |
| 124 | + ... else: |
| 125 | + ... print(sub) |
| 126 | + ... |
| 127 | + >>> items = [[1,2,3],[4,5,[5,6]],[7,8,9]] |
| 128 | + >>> flatten(items) |
| 129 | + 1 |
| 130 | + 2 |
| 131 | + 3 |
| 132 | + 4 |
| 133 | + 5 |
| 134 | + 5 |
| 135 | + 6 |
| 136 | + 7 |
| 137 | + 8 |
| 138 | + 9 |
| 139 | + >>> |
| 140 | + |
| 141 | +اکنون برای تبدیل تابع ``flatten`` به یک Generator کافی است به جای ``print`` از ``yield`` استفاده کنیم:: |
| 142 | + |
| 143 | + >>> def genflatten(lists): |
| 144 | + ... for sub in lists: |
| 145 | + ... if isinstance(sub,list): |
| 146 | + ... genflatten(sub) |
| 147 | + ... else: |
| 148 | + ... yield sub |
| 149 | + ... |
| 150 | + >>> items = [[1,2,3],[4,5,[5,6]],[7,8,9]] |
| 151 | + |
| 152 | + >>> genflatten(items) |
| 153 | + <generator object genflatten at 0x7eff06d40150> |
| 154 | + |
| 155 | + >>> list(genflatten(items)) |
| 156 | + [] |
| 157 | + |
| 158 | + |
| 159 | +اتفاقی نیفتاد! و خروجی یک لیست خالی است. از درس پیش به خاطر داریم، فراخوانی تابع ``genflatten`` (که در واقع یک تابع Generator است) تنها باعث ایجاد یک شی Generator میشود و میبایست در نقطهای که تابع خودش را فراخوانی میکند نیز مقدمات پردازش خروجی یک شی Generator را فراهم کنیم. اکنون با اصلاح کد بالا:: |
| 160 | + |
| 161 | + >>> def genflatten(lists): |
| 162 | + ... for sub in lists: |
| 163 | + ... if isinstance(sub,list): |
| 164 | + ... for item in genflatten(sub): |
| 165 | + ... yield item |
| 166 | + ... else: |
| 167 | + ... yield sub |
| 168 | + ... |
| 169 | + >>> items = [[1,2,3],[4,5,[5,6]],[7,8,9]] |
| 170 | + |
| 171 | + >>> genflatten(items) |
| 172 | + <generator object genflatten at 0x7f6cee349258> |
| 173 | + |
| 174 | + >>> list(genflatten(items)) |
| 175 | + [1, 2, 3, 4, 5, 5, 6, 7, 8, 9] |
| 176 | + |
| 177 | + |
| 178 | + |
| 179 | + |
115 | 180 |
|
116 | 181 |
|
117 | 182 |
|
|
0 commit comments