Skip to content

Commit 7955f95

Browse files
author
Saeid Darvish
committed
edited l09
1 parent f947d62 commit 7955f95

File tree

4 files changed

+39
-74
lines changed

4 files changed

+39
-74
lines changed

source/_static/sitemap-index.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@
6565
<priority>0.80</priority>
6666
</url>
6767
<url>
68-
<loc>https://python.coderz.ir/lessons/l09.html</loc>
69-
<lastmod>2021-03-17T17:10:25+00:00</lastmod>
68+
<loc>https://python.coderz.ir/lessons/l09-control-flow-statements-in-python.html</loc>
69+
<lastmod>2023-03-17T17:10:25+00:00</lastmod>
7070
<priority>0.80</priority>
7171
</url>
7272
<url>

source/changelog.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@
1212
=============
1313

1414

15+
.. raw:: html
16+
17+
<p class="rubric" id="00134" ><a class="reference external" href="#00134">00134</a> - یک‌شنبه ۳ اردیبهشت ۱۴۰۲</p>
18+
19+
* درس نهم ویرایش و بروزرسانی گردید.
20+
* شرح دستور ``match/case`` به درس نهم اضافه شد.
21+
* [`Issue #59 <https://github.com/saeiddrv/PythonPersianTutorial/issues/59>`__]
22+
23+
24+
25+
----
26+
1527
.. raw:: html
1628

1729
<p class="rubric" id="00133" ><a class="reference external" href="#00133">00133</a> - شنبه ۲ اردیبهشت ۱۴۰۲</p>

source/index.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
lessons/l07-string-and-bytes-in-python
4141
lessons/l08-list-and-tuple-in-python
4242
lessons/l08-set-and-dict-in-python
43-
lessons/l09-control-flow-in-python
43+
lessons/l09-control-flow-statements-in-python
4444
lessons/l10
4545
lessons/l11
4646
lessons/l12

source/lessons/l09-control-flow-in-python.rst renamed to source/lessons/l09-control-flow-statements-in-python.rst

Lines changed: 24 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
.. meta::
44
:description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون - درس نهم: دستورهای کنترلی در پایتون
5-
:keywords: معرفی پایتون, تاریخچه پایتون, کارایی پایتون, نسخه های پایتون, ویژگی های پایتون, آشنایی با پایتون, آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون
5+
:keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون، حلقه تکرار در پایتون، for، while و match/case در پایتون، دستورهای انتخاب در پایتون، دستور if/elif/else در پایتون، شی iterator در پایتون
66

77

88
.. _lesson-09:
@@ -22,7 +22,7 @@
2222

2323
در حالت عادی جریان اجرای یک برنامه روند ثابتی دارد به این شکل که کدها سطر به سطر، از بالا به پایین خوانده و اجرا می‌شوند؛ دستورهای کنترلی امکانی برای کنترل یا تغییر این جریان ثابت است. با استفاده از این دستورها می‌توان برای اجرای یک بلاک شرط تعیین کرد که اگر در زمان اجرا این شرط برقرار نباشد از اجرای بلاک صرف نظر خواهد شد یا می‌توان شرایطی را به وجود آورد که اجرای یک بلاک را از میان چندین بلاک مشخص انتخاب گردد و همچنین می‌توان اجرای یک بلاک را چندین بار تکرار کرد.
2424

25-
این درس به بررسی دستورهای کنترلی پایتون در دو بخش «انتخاب» و «تکرار» اختصاص یافته است.
25+
این درس به بررسی دستورهای کنترلی پایتون در دو بخش «انتخاب» و «تکرار» اختصاص یافته است. در انتها نیز بنابر ضرورت به معرفی اشیای iterator در پایتون پرداخته شده است.
2626

2727

2828

@@ -281,7 +281,7 @@
281281
دستور match/case
282282
~~~~~~~~~~~~~~~~~~~~
283283

284-
در صورتی که سابقه برنامه‌نویسی با زبان‌های دیگری همچون C و Java را داشته باشید حتما با دستور switch نیز آشنا هستید؛ تا پیش **از نسخه 3.10 پایتون** این دستور در زبان پایتون پیاده‌سازی نشده بود و تنها می‌توانستیم از ساختار ``if/elif/else`` استفاده نماییم. ولی اکنون پایتون از ساختار مشابهی به نام ``match/case`` پشتیبانی می‌کند که ساختاری برابر زیر دارد::
284+
در صورتی که سابقه برنامه‌نویسی با زبان‌های دیگری همچون C و Java را داشته باشید حتما با دستور switch نیز آشنا هستید؛ تا پیش **از نسخه 3.10 پایتون** این دستور در زبان پایتون پیاده‌سازی نشده بود و تنها می‌توانستیم از ساختار ``if/elif/else`` استفاده نماییم. ولی اکنون پایتون از ساختار مشابهی به نام ``match/case`` پشتیبانی می‌کند که ساختاری برابر زیر دارد (برای مطالعه بیشتر: [`PEP 634 <https://peps.python.org/pep-0634/>`__] و [`PEP 635 <https://peps.python.org/pep-0635/>`__] و [`PEP 636 <https://peps.python.org/pep-0636/>`__])::
285285

286286

287287
match value:
@@ -313,7 +313,7 @@
313313
Four
314314
>>>
315315

316-
در مثال بالا مقدار حروفی مربوط به عدد اندیس یکم از شی list چاپ خواهد شد.
316+
در مثال بالا مقدار حروفی مربوط به عدد اندیس صفر از شی list چاپ خواهد شد.
317317

318318
مثالی دیگر، تشخیص زوج بودن یک عدد::
319319

@@ -381,7 +381,7 @@
381381
به این نگارش یا سینتکس از دستور ``if`` در جامعه پایتون، تکنیک ``guard`` گفته می‌شود. در این ساختار متغیری که در پشت ``if`` قرار می‌گیرد، همان مقدار دریافتی است. این متغیر می‌تواند هر نامی داشته باشد ولی حتما می‌بایست با متغیر درون دستور ``if`` همنام باشد (در مثال بالا برای جلوگیری از ابهام، همنام با خود مقدار دریافتی در نظر گرفته شده است). در این شرایط چنانچه ارزیابی دستور ``if`` برابر مقدار ``True`` باشد، دستورهای ``case`` آن اجرا می‌گردد و در غیر اینصورت الگوی ``case`` بعدی مورد پردازش قرار خواهد گرفت.
382382

383383

384-
.. _python-loop:
384+
.. _python-repetition:
385385

386386
تکرار
387387
-------
@@ -507,6 +507,7 @@
507507
>>>
508508

509509

510+
.. _python-for:
510511

511512
دستور for
512513
~~~~~~~~~~
@@ -635,9 +636,9 @@
635636

636637
.. rubric:: تابع ``(range(stop``:
637638

638-
این تابع [`اسناد پایتون 3x <http://docs.python.org/3/library/functions.html#func-range>`__] یک شی از نوع ``range`` را برمی‌گرداند؛ این شی یک دنباله تغییر ناپذیر است که معمولا از آن برای پیمایش در حلقه ``for`` استفاده می‌شود. با تبدیل شی ``range`` به نوع لیست خواهیم دید که این شی یک دنباله مرتب از اعداد صفر تا آرگومان stop (و نه خود آن) است؛ آرگومان stop می‌بایست یک عدد صحیح مثبت باشد::
639+
این تابع [`اسناد پایتون <http://docs.python.org/3/library/functions.html#func-range>`__] یک شی از نوع ``range`` را برمی‌گرداند؛ این شی یک دنباله تغییر ناپذیر است که معمولا از آن برای پیمایش در حلقه ``for`` استفاده می‌شود. با تبدیل شی ``range`` به نوع لیست خواهیم دید که این شی یک دنباله مرتب از اعداد صفر تا آرگومان stop (و نه خود آن) است؛ آرگومان stop می‌بایست یک عدد صحیح مثبت باشد::
639640

640-
>>> r = range(10) # Python 3.x
641+
>>> r = range(10)
641642

642643
>>> type(r)
643644
<class 'range'>
@@ -696,45 +697,6 @@
696697
>>> list(range(-2, -10, -2))
697698
[-2, -4, -6, -8]
698699

699-
در نسخه‌های 2x پایتون دو نسخه از این تابع وجود دارد: تابع ``range`` [`اسناد پایتون 2x <http://docs.python.org/2/library/functions.html#range>`__] و تابع ``xrange`` [`اسناد پایتون 2x <http://docs.python.org/2/library/functions.html#xrange>`__].
700-
701-
خروجی تابع ``range`` یک شی از نوع لیست است::
702-
703-
>>> r = range(10) # Python 2.x
704-
705-
>>> type(r)
706-
<type 'list'>
707-
708-
>>> r
709-
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
710-
711-
>>> import sys
712-
>>> sys.getsizeof(r)
713-
152
714-
715-
716-
717-
ولی خروجی تابع ``xrange`` یک شی از نوع ``xrange`` می‌باشد::
718-
719-
>>> r = xrange(10) # Python 2.x
720-
721-
>>> type(r)
722-
<type 'xrange'>
723-
724-
>>> r
725-
xrange(10)
726-
727-
>>> list(r)
728-
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
729-
730-
>>> import sys
731-
>>> sys.getsizeof(r)
732-
40
733-
734-
735-
خروجی تابع ``xrange`` ساده‌تر و بهینه تر از خروجی تابع ``range`` است بنابراین معمولا پیشنهاد می‌شود که در حلقه ``for`` از تابع ``xrange`` استفاده شود؛ به همین دلیل می‌باشد که تابع ``range`` در نسخه‌های 3x پایتون حذف شده است و تنها تابع ``xrange`` باقی‌مانده که با نام و نوع ``range`` پیاده‌سازی شده است.
736-
737-
* چگونگی استفاده و تعداد آرگومان‌های هر دو تابع همانند نسخه 3x است که پیش از این بررسی شد.
738700

739701
.. rubric:: چند مثال‌ ساده دیگر:
740702

@@ -800,6 +762,8 @@
800762
>>> [x ** 2 for x in range(5)]
801763
[0, 1, 4, 9, 16]
802764

765+
این عمل، List Comprehensions خوانده می‌شود که توسط درس سیزدهم شرح داده خواهد شد.
766+
803767
و به عنوان مثال‌هایی دیگر به نمونه کدهای پایین توجه نمایید::
804768

805769
>>> y = 7
@@ -844,9 +808,9 @@
844808
4
845809
>>>
846810

847-
به نمونه کد بالا توجه نمایید؛ با هر بار تکرار حلقه یکم تمام دستورهای بدنه آن که شامل یک حلقه دیگر است اجرا می‌گردد. از متغیر ``i`` درون حلقه داخلی نیز استفاده شده است. در بار نخستِ اجرای حلقه بیرونی مقدار ``i`` برابر عدد ``1`` قرار داده می‌شود که در این صورت اجرای حلقه داخلی تنها یک بار تکرار می‌گردد (``1 == ((len(range(0, 1``) و یک مقدار ``1`` در خروجی نمایش داده می‌شود،‌ بار دوم ``i`` برابر عدد ``2`` می‌شود و در نتیجه حلقه داخلی دو بار تکرار می‌گردد که بر اثر آن دو مقدار ``2`` در خروجی چاپ می‌گردد. این روند تا پایان تکرار حلقه بیرونی ادامه می‌یابد.
811+
به نمونه کد بالا توجه نمایید؛ با هر بار تکرار حلقه یکم تمام دستورهای بدنه آن که شامل یک حلقه دیگر است اجرا می‌گردد. از متغیر ``i`` درون حلقه داخلی نیز استفاده شده است. در بار نخستِ اجرای حلقه بیرونی مقدار ``i`` برابر عدد ``1`` قرار داده می‌شود که در این صورت اجرای حلقه داخلی تنها یک بار تکرار می‌گردد ``1 == ((len(range(0, 1`` و یک مقدار ``1`` در خروجی نمایش داده می‌شود،‌ بار دوم ``i`` برابر عدد ``2`` می‌شود و در نتیجه حلقه داخلی دو بار تکرار می‌گردد که بر اثر آن دو مقدار ``2`` در خروجی چاپ می‌گردد. این روند تا پایان تکرار حلقه بیرونی ادامه می‌یابد.
848812

849-
*تابع (یا دستور) print به صورت پیش‌فرض پس از اجرا و چاپ مقدار به سطر بعدی می‌رود. [در درس بعد چگونگی تغییر این رفتار بررسی خواهد شد]*
813+
*تابع print به صورت پیش‌فرض پس از اجرا و چاپ مقدار به سطر بعدی می‌رود. [در درس بعد چگونگی تغییر این رفتار بررسی خواهد شد]*
850814

851815

852816
اگر از پیش با زبان‌هایی نظیر C یا Java آشنایی دارید؛ برای درک بهتر ساختار حلقه ``for`` پایتون نمونه کد پایین که به زبان Java است را در نظر بگیرید:
@@ -910,8 +874,8 @@
910874

911875
>>> s = 'python'
912876

913-
>>> for i, v in enumerate(s):
914-
... print('%s) %s' % (i, v * 7))
877+
>>> for index, value in enumerate(s):
878+
... print('%s) %s' % (index, value * 7))
915879
...
916880
0) ppppppp
917881
1) yyyyyyy
@@ -940,13 +904,19 @@
940904
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
941905

942906

943-
.. rubric:: شی تکرارکننده
907+
.. _python-iterator:
908+
909+
شی تکرارکننده (iterator)
910+
----------------------------------------------
944911

945912
در این بخش قصد داریم با مفهوم iterator (تکرارکننده) در پایتون آشنا شویم. برای این منظور بهتر است ابتدا مفهوم iterable (تکرارپذیر) را بدانیم.
946913

947-
تمام انواع دنباله یک iterable هستند؛ در واقع به اشیایی با این قابلیت که بتوان در هر لحظه یک عضو درون آن را دستیابی نمود iterable گفته می‌شود. اکثر انواع آماده شی که در پایتون می‌شناسیم یک iterable است؛ انواع شی رشته، لیست، توپِل، دیکشنری، range ،zip (یا xrange) یا یک شی فایل (file) و هر شی از کلاسی که خودتان به همراه متد‌های ویژه ``()__iter__`` یا ``()__getitem__`` تعریف نمایید یک iterable هستند.
914+
تمام انواع دنباله یک iterable هستند؛ در واقع به اشیایی با این قابلیت که بتوان در هر لحظه یک عضو درون آن را دستیابی نمود iterable گفته می‌شود. اکثر انواع آماده شی که در پایتون می‌شناسیم یک iterable است؛ انواع شی رشته، لیست، توپِل، دیکشنری، range ،zip یا یک شی فایل (file) و هر شی از کلاسی که خودتان به همراه متد‌ ویژه ``()__iter__`` تعریف نمایید یک iterable هستند [`ویکی‌پایتون <https://wiki.python.org/moin/Iterator>`__].
915+
916+
در آینده پس از مطالعه دروس مربوط به شی گرایی (هفدهم تا بیست و دوم) قادر به ساخت کلاس و استفاده از متدهای ویژه در پایتون خواهید بود. در آن زمان می توانید خود با پیاده‌سازی متد ویژه ``()__next__`` یک شی iterator ایجاد نمایید. اما در این مرحله ما فرآیند ایجاد را با یک ماژول از کتابخانه استاندارد پایتون پیش خواهیم برد.
917+
918+
می‌توان یک شی iterator را تنها با استفاده از تابع آماده ``()iter`` [`اسناد پایتون <http://docs.python.org/3/library/functions.html#iter>`__] ایجاد کرد. این تابع یک شی iterable را به عنوان آرگومان دریافت می‌کند و یک شی iterator از آن بر می‌گرداند::
948919

949-
شی iterator با استفاده از تابع آماده ``()iter`` [`اسناد پایتون <http://docs.python.org/3/library/functions.html#iter>`__] ایجاد می‌شود؛ این تابع یک شی iterable را به عنوان آرگومان دریافت می‌کند و آن را در قالب یک شی iterator بر می‌گرداند::
950920

951921
>>> L = [1, 2, 3, 4, 5]
952922
>>> type(L)
@@ -990,33 +960,20 @@
990960
>>> type(itr)
991961
<class 'dict_keyiterator'>
992962

993-
یک شی iterator این قابلیت را دارد که می‌توان عضوهای درون آن را یکی یکی با استفاده از متد ``()__next__`` (یا ``()next`` در پایتون 2x) پیمایش کرد؛ این متد در بار نخستِ فراخوانی عضو یکم شی و در دفعات بعدی فراخوانی به ترتیب عضوهای بعدی را برمی‌گرداند::
963+
یک شی iterator این قابلیت را دارد که می‌توان عضوهای درون آن را یکی یکی با استفاده از متد ``()__next__`` پیمایش کرد؛ این متد در بار نخستِ فراخوانی عضو یکم شی و در دفعات بعدی فراخوانی به ترتیب عضوهای بعدی را برمی‌گرداند::
994964

995965
>>> L = [1, 2, 3, 4, 5]
996966
>>> itr = iter(L)
997967

998968
::
999969

1000-
>>> # Python 3.x
1001-
1002970
>>> itr.__next__()
1003971
1
1004972
>>> itr.__next__()
1005973
2
1006974
>>> itr.__next__()
1007975
3
1008976

1009-
::
1010-
1011-
>>> # Python 2.x
1012-
1013-
>>> itr.next()
1014-
1
1015-
>>> itr.next()
1016-
2
1017-
>>> itr.next()
1018-
3
1019-
1020977
با فراخوانی پی در پی این متد و رسیدن به انتهای پیمایش؛ زمانی که دیگر عضوی برای برگرداندن وجود ندارد یک خطا - البته درست این است که بگوییم یک استثنا (Exception) - با نام ``StopIteration`` گزارش می‌گردد::
1021978

1022979
>>> itr.__next__()
@@ -1030,8 +987,6 @@
1030987

1031988
این دقیقا همان کاری است که در دستور ``for`` به انجام می‌رسد. زمانی که از یک دنباله برای پیمایش در این دستور استفاده می‌کنید؛ ``for`` در پشت صحنه آن را به یک iterator تبدیل و سپس پیمایش یک به یک عضوها را آغاز می‌کند. در هر لحظه‌ که ``StopIteration`` رخ دهد، متوجه پایان دنباله شده و تکرار حلقه را پایان می‌بخشد.
1032989

1033-
در آینده توسط درس استثنا‌ها در پایتون خواهید دید که می‌توان با ایجاد iterator و استفاده از دستور ``try/except`` [که در همان درس خواهید آموخت] یک حلقه ``while`` را به مانند حلقه ``for`` پیاده‌سازی کرد.
1034-
1035990

1036991
با استفاده از ماژول ``itertools`` می‌توانید iterator های بی‌نهایت (Infinite) یا بدون توقف ایجاد نمایید. برای نمونه تابع ``cycle`` درون این ماژول، شی iterator ای می‌سازد که در انتهای پیمایش متوقف نمی‌شود و از نو به ابتدای شی برگشته و عضو یکم را برمی‌گرداند::
1037992

@@ -1069,6 +1024,4 @@
10691024

10701025
:emoji-size:`😊` امیدوارم مفید بوده باشه
10711026

1072-
`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. <http://coderz.ir/python-tutorial-control-statements/>`_
1073-
10741027

0 commit comments

Comments
 (0)