Skip to content

Commit f947d62

Browse files
author
Saeid Darvish
committed
add match/case section to l09
1 parent caa9e11 commit f947d62

File tree

2 files changed

+117
-57
lines changed

2 files changed

+117
-57
lines changed

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
43+
lessons/l09-control-flow-in-python
4444
lessons/l10
4545
lessons/l11
4646
lessons/l12

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

Lines changed: 116 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
.. role:: emoji-size
22

33
.. meta::
4-
:description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش دستورهای کنترلی در پایتون، آموزش دستور انتخاب در پایتون، آموزش دستور تکرار در پایتون، if در پایتون، else در پایتون، حلقه در پایتون، for در پایتون
5-
:keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, انواع شی, انواع داده, انواع شی در پایتون, انواع داده در پایتون, پایتون
4+
:description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون - درس نهم: دستورهای کنترلی در پایتون
5+
:keywords: معرفی پایتون, تاریخچه پایتون, کارایی پایتون, نسخه های پایتون, ویژگی های پایتون, آشنایی با پایتون, آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون
6+
7+
8+
.. _lesson-09:
69

710

811
درس ۰۹: دستورهای کنترلی در پایتون
912
==================================
1013

1114
.. figure:: /_static/pages/09-python-if-else-for-while.jpg
1215
:align: center
13-
:alt: دستورهای کنترلی در پایتون
16+
:alt: درس نهم: دستورهای کنترلی در پایتون
1417
:class: page-image
1518

1619
Photo by `Lynda Sanchez <https://unsplash.com/photos/GCbGxU4mBu0>`__
@@ -32,10 +35,16 @@
3235

3336
----
3437

38+
39+
.. _python-selection:
40+
3541
انتخاب
3642
--------
3743

38-
با استفاده از دستور انتخاب می‌توان بر حسب شرایط برنامه در زمان اجرا تعیین کرد که آیا یک بلاک دستور اجرا شود یا خیر و همچنین از بین دو یا چند بلاک دستور کدام یک انتخاب و اجرا گردد. پایتون تنها یک ساختار انتخاب را ارایه می‌دهد که می‌تواند به سه شکل «تک انتخابی»، «دو انتخابی» و «چند انتخابی» پیاده‌سازی گردد؛ این ساختار به نام دستور ``if`` خوانده می‌شود و در ادامه بررسی خواهد شد.
44+
با استفاده از دستور انتخاب می‌توان بر حسب شرایط برنامه در زمان اجرا تعیین کرد که آیا یک بلاک دستور اجرا شود یا خیر و همچنین از بین دو یا چند بلاک دستور کدام یک انتخاب و اجرا گردد. رایج‌ترین دستور انتخاب در پایتون ``if`` است که می‌تواند به سه شکل «تک انتخابی»، «دو انتخابی» و «چند انتخابی» پیاده‌سازی گردد. این ساختار در ادامه بررسی خواهد شد.
45+
46+
47+
.. _python-if:
3948

4049
دستور if
4150
~~~~~~~~~~
@@ -266,70 +275,121 @@
266275
50-75 %
267276
25-50 %
268277

269-
.. rubric:: دستور switch/case
270278

271-
در صورتی که سابقه برنامه‌نویسی با زبان‌های دیگری همچون C و Java را داشته باشید حتما با دستور switch نیز آشنا هستید؛ **این دستور در زبان پایتون پیاده‌سازی نشده است**.
279+
.. _python-match-case:
272280

273-
دستور switch مقداری را دریافت می‌کند و سپس آن را با مقدارهای هر case درون ساختار خود به ترتیب مقایسه می‌کند؛ در صورتی که این مقدار با یکی از case ها برابر باشد، دستورهای مرتبط با آن case را اجرا کرده و از بررسی دیگر case ها صرف نظر می‌کند. همچنین اگر مقدار دریافتی با هیچ یک از case ها مطابقت نداشته باشد دستورهای مربوط به بخش default (در صورت وجود) را اجرا می‌کند. در پایین نمونه‌ایی از این دستور در زبان **Java** آورده شده است:
281+
دستور match/case
282+
~~~~~~~~~~~~~~~~~~~~
274283

275-
.. code-block:: java
284+
در صورتی که سابقه برنامه‌نویسی با زبان‌های دیگری همچون C و Java را داشته باشید حتما با دستور switch نیز آشنا هستید؛ تا پیش **از نسخه 3.10 پایتون** این دستور در زبان پایتون پیاده‌سازی نشده بود و تنها می‌توانستیم از ساختار ``if/elif/else`` استفاده نماییم. ولی اکنون پایتون از ساختار مشابهی به نام ``match/case`` پشتیبانی می‌کند که ساختاری برابر زیر دارد::
276285

277-
int success;
278-
char grade = 'B';
279286

280-
.. code-block:: java
287+
match value:
288+
case matching_rule_1: statement_1
289+
case matching_rule_2: statement_2
290+
case matching_rule_3: statement_3
291+
.
292+
.
293+
.
281294

282-
switch (grade) {
283-
case 'A':
284-
System.out.println("Excellent grade");
285-
success = 1;
286-
break;
287-
case 'B':
288-
System.out.println("Very good grade");
289-
success = 1;
290-
break;
291-
case 'C':
292-
System.out.println("Good grade");
293-
success = 1;
294-
break;
295-
case 'D':
296-
case 'E':
297-
case 'F':
298-
System.out.println("Low grade");
299-
success = 0;
300-
break;
301-
default:
302-
System.out.println("Invalid grade");
303-
success = -1;
304-
break;
305-
}
295+
این دستور یک مقدار را دریافت می‌کند و با الگوهای درج شده توسط ``case`` مطابقت می‌دهد (از بالا به پایین) و با نخستین عمل انطباق موفق، دستورهای مرتبط با آن را اجرا کرده و سپس پایان می‌یابد.
306296

307-
برای پیاده‌سازی چنین ساختاری در پایتون می‌توان از ``if/elif/else`` استفاده کرد:
308-
309-
.. code-block:: python
310-
311-
grade = 'B'
312-
313-
.. code-block:: python
314-
315-
if grade == 'A':
316-
print('Excellent grade')
317-
success = 1
318-
elif grade == 'B':
319-
print('Very good grade')
320-
success = 1
321-
elif grade in ('D', 'E', 'F'):
322-
print('Low grade')
323-
success = 0
324-
else:
325-
print('Invalid grade')
326-
success = -1
297+
خواهید دید که این دستور بسیار منعطف بوده و پیشرفته‌تر از دستور ``switch`` سنتی است. با یک مثال ساده شروع می‌کنیم::
327298

299+
300+
>>> list = [4, 5, 6, 0, 2, 1, 3]
301+
>>>
302+
>>> first_num = list[0]
303+
>>>
304+
>>> match first_num:
305+
... case 0: print('Zero')
306+
... case 1: print('One')
307+
... case 2: print('Two')
308+
... case 3: print('Three')
309+
... case 4: print('Four')
310+
... case 5: print('Five')
311+
... case 6: print('Six')
312+
...
313+
Four
314+
>>>
315+
316+
در مثال بالا مقدار حروفی مربوط به عدد اندیس یکم از شی list چاپ خواهد شد.
317+
318+
مثالی دیگر، تشخیص زوج بودن یک عدد::
319+
320+
321+
>>> list = [4, 5, 6, 0, 2, 1, 3]
322+
>>>
323+
>>> first_num = list[0]
324+
>>>
325+
>>> match first_num % 2:
326+
... case 0:
327+
... print('The number is even')
328+
... case 1:
329+
... print('The number is odd')
330+
...
331+
The number is even
332+
333+
هدف اصلی از ایجاد دستور ``match/case`` در پایتون، ساده‌سازی و افزایش خوانایی کد در زمان استفاده از دستور ``if/elif/else`` است.
334+
335+
336+
هر بخش ``case`` می‌تواند بیش از یک انطباق را بررسی کند. برای این منظور می‌توان از کاراکتر ``|`` برای جداسازی الگوها استفاده نمود::
337+
338+
>>> list = [4, 5, 6, 0, 2, 1, 3]
339+
>>>
340+
>>> first_num = list[0]
341+
>>>
342+
>>> match first_num:
343+
... case 0 | 2 | 4 | 6 | 8:
344+
... print('The number is even')
345+
... case 1 | 3 | 5 | 7 | 9:
346+
... print('The number is odd')
347+
...
348+
The number is even
349+
350+
همچنین می‌توان یک ``case`` پیش‌فرض نیز برای این ساختار در نظر گرفت، برای پردازش مقدار در زمانی که با هیچ یک از الگوهای موجود تطابق پیدا نکرد. برای درج ``case`` پیش‌فرض از الگو ``_`` استفاده می‌گردد. این الگو در ساختار ``match/case`` با هر مقداری تظابق داده می‌شود و میبایست برای جلوگیری از خطاهای منطقی، حتما به عنوان آخرین ``case`` قرار داده شود::
351+
352+
353+
>>> list = [1, 2, 3, 'A', 'A', 'AAA']
354+
>>> first_num = list[-1]
355+
>>> match first_num:
356+
... case 0 | 2 | 4 | 6 | 8:
357+
... print('The number is even')
358+
... case 1 | 3 | 5 | 7 | 9:
359+
... print('The number is odd')
360+
... case _:
361+
... print("The received value is not a number")
362+
...
363+
The received value is not a number
364+
365+
در بخش ``case`` حتی می‌توان از دستور ``if`` نیز استفاده نمود::
366+
367+
>>> list = [4, -5, 6, 0, 2, -1, 3]
368+
>>>
369+
>>> num = list[0]
370+
>>>
371+
>>> match num:
372+
... case num if num < 0:
373+
... print('The number is negative')
374+
... case num if num == 0:
375+
... print('The number is zero')
376+
... case num if num > 0:
377+
... print('The number is positive')
378+
...
379+
The number is positive
380+
381+
به این نگارش یا سینتکس از دستور ``if`` در جامعه پایتون، تکنیک ``guard`` گفته می‌شود. در این ساختار متغیری که در پشت ``if`` قرار می‌گیرد، همان مقدار دریافتی است. این متغیر می‌تواند هر نامی داشته باشد ولی حتما می‌بایست با متغیر درون دستور ``if`` همنام باشد (در مثال بالا برای جلوگیری از ابهام، همنام با خود مقدار دریافتی در نظر گرفته شده است). در این شرایط چنانچه ارزیابی دستور ``if`` برابر مقدار ``True`` باشد، دستورهای ``case`` آن اجرا می‌گردد و در غیر اینصورت الگوی ``case`` بعدی مورد پردازش قرار خواهد گرفت.
382+
383+
384+
.. _python-loop:
328385

329386
تکرار
330387
-------
331388

332-
گاهی نیاز پیدا می‌کنیم که بلاکی را چندین بار پشت سرهم اجرا نماییم. به ساختار تکرار «حلقه» (Loop) گفته می‌شود؛ در ادامه به بررسی ساختار دو حلقه ارایه شده در زبان پایتون خواهیم پرداخت.
389+
گاهی نیاز پیدا می‌کنیم که بلاکی را چندین بار پشت سرهم اجرا نماییم. به ساختار تکرار، «حلقه» (Loop) گفته می‌شود؛ در ادامه به بررسی ساختار دو حلقه ارایه شده در زبان پایتون خواهیم پرداخت.
390+
391+
392+
.. _python-while:
333393

334394
دستور while
335395
~~~~~~~~~~~~~

0 commit comments

Comments
 (0)