Skip to content

Commit 45ee4b9

Browse files
author
Saeid Darvish
committed
l14: write generators and recursive
1 parent 18da6a7 commit 45ee4b9

2 files changed

Lines changed: 73 additions & 0 deletions

File tree

lessons/l14.rst

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,71 @@
112112
.. tip::
113113
علاوه بر این محدودیت، یک محدودیت جدی‌تر دیگری نیز وجود دارد و آن هم میزان فضایی است که توسط سیستم عامل برای پشته در نظر گرفته شده است. با رد شدن از این مقدار فضا، برنامه با خطای زمان اجرا مواجه می‌گردد (``RuntimeError``).
114114

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+
115180

116181

117182

preface.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33

44
آنچه در این کتاب نوشته می‌شود حاصل یادگیری‌های شخصی از منابع مختلف در دسترس مرتبط با آموزش پایتون می‌باشد؛ یک یادداشت شخصی ولی منسجم! که سعی می‌شود منطبق با مستندات اصلی زبان برنامه‌نویسی پایتون باشد.
55

6+
7+
|
8+
9+
**چرا پایتون؟!**
10+
11+
همانند تمام زبان‌های برنامه‌نویسی موجود، ماهیت پایتون چیزی بیشتر از یک زبان برنامه‌نویسی نیست. ولی از نظر من پایتون بیشتر از آنکه زبانی برای برنامه‌نویسی باشد، زبانی برای برنامه‌نویس است.
12+
13+
614
----
715

816
زیربنا:

0 commit comments

Comments
 (0)